flask与javascript及ajax
flask与javascript及ajax
1. flask+js
1.1. 最简单的
最简单的元素信息改变。
{% block content %}
<h1>我的第一张网页</h1>
<p id="demo">我的第一个段落</p>
<script>
document.getElementById("demo").innerHTML="我的第一段 JavaScript";
</script>
{% endblock %}}
1.2.
进阶
后端:
@app.route('/js')
def js_t():
return render_template('js.html')
前端:js.html
{% extends 'base.html' %}
{% block content %}
<h1>我的第一张网页</h1>
<p id="demo">我的第一个段落</p>
<img
src="{{url_for('static',filename='img/a.jpg')}}"
alt="图片缺失" width="200" heigth="300">
<button
type="button"
onclick="displayDate()">显示日期</button>
<p id = 'de'>{{url_for('static',filename='js/js_sample.js')}}</p>
<script
src="{{url_for('static',filename='js/js_sample.js')}}"
type="text/javascript"
defer></script>
<script>
document.getElementById("demo").innerHTML="我的第一段 JavaScript";
</script>
{% endblock %}}
包含一些元素的展示,引用外部js文件
<script
src="{{url_for('static',filename='js/js_sample.js')}}"
type="text/javascript"
defer></script>
src属性代表文件指向;{{}}代表jinjia2的解释;
url_for代表flask的路径生成;
defer代表待页面加载完成后才执行脚本,否则可能出现找不到元素的问题。
2.
flask+ajax
ajax依赖于XMLHTTPRequest,它有一套规则去沟通浏览器与后端,但一般引用jquery就可以了。
ajax使用环境配置
这里使用的是jquery库:https://code.jquery.com/jquery-3.3.1.min.js
网页源码文件中引用:
<script
src="{{url_for('static',filename='js/jquery-3.3.1.min.js')}}"></script>
前端代码:
<!DOCTYPE html>
<html
lang="en">
<head>
<meta charset="UTF-8">
<title>Jquery Ajax Test</title>
<script
src="{{url_for('static',filename='js/jquery-3.3.1.min.js')}}"></script>
<script>
$(document).ready(function(){
$(".btn1").click(function(){
$.get("/mystring",function(data,
status){
alert("数据:
" + data + "\n状态:
" + status);
});
});
$(".btn2").click(function(){
$.get("/mydict",function(data,
status){
alert("name:
" + data.name + "
age:" + data.age);
});
});
$(".btn3").click(function(){
$.get("/mylist",function(data,
status){
alert("name:
" + data[0]+ " age:" + data[1]);
});
});
$(".btn4").click(function(){
$.ajax({url:"/mystring", data:{"mydata": "test"},success:function(data){
alert(data);
}});
});
$(".btn6_2").click(function(){
$.ajax({url:"/dataFromAjax", data:{"mydata": "test
data"},success:function(data){
alert(data);
}});
});
$(".btn5").click(function(){
$.ajax({url:"/mydict", success:function(data){
alert("name:
" + data.name + "
age:" + data.age);
}});
});
$(".btn6").click(function(){
$.ajax({url:"/mylist", success:function(data){
alert("name:
" + data[0] + " age:" + data[1]);
}});
});
$(".btn7").click(function(){
$("p").load("../static/test.txt");
});
$(".btn10").click(function(){
$("p").load("/mystring");
});
$(".btn8").click(function(){
$.getJSON("/mydict",function(data){
$.each(data, function(i,
field){
$("div").append(field + "
");
});
});
});
$(".btn9").click(function(){
$.post("/mydict", function(data,
status){
alert("name:
" + data.name + "
age:" + data.age);
});
});
});
</script>
</head>
<body>
<h1>Ajax Test</h1>
<button class="btn1">get
string</button>
<button class="btn2">get dict</button>
<button class="btn3">get list</button> <br/><br/>
<button class="btn4">ajax
string</button>
<button class="btn5">ajax dict</button>
<button class="btn6">ajax list</button>
<button class="btn6_2">ajax
sentDataToFlask</button><br/><br/>
<p>load:</p>
<button class="btn7">load from file</button>
<button class="btn10">load</button><br/><br/>
<div>getJson: </div><br/>
<button class="btn8">getJson</button><br/><br/>
<button class="btn9">post</button>
<script>
for (p in $('.btn1')){
console.log(p);
}
document.write('btn1的文字为:'+$('.btn1').text())
</script>
</body>
</html>
后端:
# ajax test
@app.route('/ajax')
def ajax():
return render_template('ajax_test.html')
@app.route('/mystring')
def mystring():
return 'my
string'
@app.route('/dataFromAjax')
def dataFromAjax():
test = request.args.get('mydata')
print(test)
return 'dataFromAjax'
@app.route('/mydict', methods=['GET', 'POST'])
def mydict():
d = {'name': 'xmr', 'age': 18}
return jsonify(d)
@app.route('/mylist')
def mylist():
l = ['xmr', 18]
return jsonify(l)
# error handle
@app.errorhandler(404)
def page_not_found(error):
return '404'
3.
问题
3.1.
关于$
$( 'a ') 相当于
document.getElementById( 'a ')
这是用了某些组件后那些组件支持的符号,比如DWR
$其实是一个函数名,就是用来获取部件里面的值
$()= document.getElementById()
$在JS中本身只是一个符号而异,在JS里什么也不是。
但在JS应用库JQUERY的作者将之做为一个自定义函数名了,这个函数是获取指定网页元素的函数,使用非常之频繁,所以好多新手不知道,还以为$是JS的什么特殊语法。
后来,可能有些程序员JQUERY用得多了,发现$这个函数很好用,很方便,所以,在不用JQUERY的情况,一般自己也会自定义一个$函数。
即:
在jquery中它的代码是:
function( selector, context ) { //
The jQuery object is actually just the init constructor 'enhanced' // Need init
if jQuery is called (just allow error to be thrown if not included) return new
jQuery.fn.init( selector, context ); }
作用是选择一个元素,$(“.name”)为类选择器,$(“id”)为id选择
3.2.
关于.val
text():获取或者改变指定元素的文本
html():获取或改变指定元素的html元素以及文本
val():获取或者改变指定元素的value值(一般是表单元素)
以上3个都是jquery类库中的语法
3.3.
js文件不生效
有可能缓存没清除,还是使用之前的脚本,需要清除缓存。
3.4.
关于BUTTON-修改button显示文字
button有两种类型
<input type="button"
id="btn1" value="按钮"/>
<button id="btn1">按钮</button>
修改方法
document.getElementById("btn1").value="新按钮";
document.getElementById("btn1").innerHtml="新按钮";
3.5. JS函数
getelementbyclassname返回的是一个元素列表,可用item(0)来进行选择。
typeof()查看类型
console.log(‘’) 控制台输出,在F12调试模式下便于调试
for 循环语法:
for (p in $('.btn1')){
console.log(p);
}
4.
jquery
JQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。JQuery设计的宗旨是“write
Less,Do More”,即倡导写更少的代码,做更多的事情。
它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
JQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等。
它的使用非常简单,下载库并在前端引用即可。
4.1.
选择器
选取 HTML 元素,并对选取的元素执行某些操作。
基础语法: $(selector).action()
美元符号定义 jQuery
选择符(selector)"查询"和"查找" HTML 元素
jQuery 的 action() 执行对元素的操作
实例:
$(this).hide() - 隐藏当前元素
$("p").hide() - 隐藏所有
<p> 元素
$("p.test").hide() - 隐藏所有
class="test" 的 <p> 元素
$("#test").hide() - 隐藏所有
id="test" 的元素
4.2.
事件
html中的事件是指页面对不同访问者的响应。
常见 DOM 事件:
鼠标事件 |
键盘事件 |
表单事件 |
文档/窗口事件 |
常用的 jQuery 事件方法
$(document).ready()
$(document).ready() 方法允许在文档完全加载完后执行函数。
在示例代码中也使用了这一方法。
click()
click() 方法是当按钮点击事件被触发时会调用一个函数。
该函数在用户点击 HTML 元素时执行。
在下面的实例中,当点击事件在某个 <p> 元素上触发时,隐藏当前的 <p> 元素:
4.3.
jquery与ajax
执行异步 AJAX 请求 |
$.get(url, data, callback)
参数 描述
url 必需,规定您需要请求的URL
data 可选,规定连同请求发送到服务器的数据,格式是json
callback 可选,回掉函数,当请求成功时运行的函数
$.post(url, data, callback)
参数 描述
url 必需,规定您需要请求的URL
data 可选,规定连同请求发送到服务器的数据,格式是json
callback 可选,回掉函数,当请求成功时运行的函数
5.
关于ajax
以前写过一篇ajax的笔记,有一个大概的了解,今天写一下其具体实现原理。
ajax的核心是与服务器交换数据及更新网页。
更新网页都是在浏览器上进行的,只要有合适的脚本语言且解释器支持,还是比较好办的,目前而言这一部分的前置技术是css,html,dom,js。
ajax的关键是交换数据,即通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据。获得数据然后用js来操作DOM而更新页面。
首先,我们先来看看XMLHttpRequest这个对象的属性。
它的属性有:
onreadystatechange 每次状态改变所触发事件的事件处理程序。
responseText 从服务器进程返回数据的字符串形式。
responseXML 从服务器进程返回的DOM兼容的文档数据对象。
status 从服务器返回的数字代码,比如常见的404(未找到)和200(已就绪)
status
Text 伴随状态码的字符串信息
readyState 对象状态值
0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
1 (初始化) 对象已建立,尚未调用send方法
2 (发送数据) send方法已调用,但是当前的状态及http头未知
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
4 (完成) 数据接收完毕,此时可以通过通过responseXml和responseText获取完整的回应数据
如上所示,函数首先检查XMLHttpRequest的整体状态并且保证它已经完成(readyStatus=4),即数据已经发送完毕。然后根据服务器的设定询问请求状态,如果一切已经就绪(status=200),那么就执行下面需要的操作。
对于XmlHttpRequest的两个方法,open和send,其中open方法指定了:
a、向服务器提交数据的类型,即post还是get。
b、请求的url地址和传递的参数。
c、传输方式,false为同步,true为异步。默认为true。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作。我们需要根据实际需要来指定同步方式,在某些页面中,可能会发出多个请求,甚至是有组织有计划有队形大规模的高强度的request,而后一个是会覆盖前一个的,这个时候当然要指定同步方式。
Send方法用来发送请求。
知道了XMLHttpRequest的工作流程,我们可以看出,XMLHttpRequest是完全用来向服务器发出一个请求的,它的作用也局限于此,但它的作用是整个ajax实现的关键,因为ajax无非是两个过程,发出请求和响应请求。并且它完全是一种客户端的技术。而XMLHttpRequest正是处理了服务器端和客户端通信的问题所以才会如此的重要。
现在,对ajax的原理大概可以有一个陈述了:可以把服务器端看成一个数据接口,它返回的是一个纯文本流,当然,这个文本流可以是XML格式,可以是Html,可以是Javascript代码,也可以只是一个字符串。这时候,XMLHttpRequest向服务器端请求这个页面,服务器端将文本的结果写入页面,这和普通的web开发流程是一样的,不同的是,客户端在异步获取这个结果后,不是直接显示在页面,而是先由javascript来处理,然后再显示在页面。至于现在流行的很多ajax控件,比如magicajax等,可以返回DataSet等其它数据类型,只是将这个过程封装了的结果,本质上他们并没有什么太大的区别。
下面是一个后端对ajax进行响应的案例:
@app.route('/mystring')
def mystring():
return 'my
string'
与其它路由方法没什么不同。
当然,现在一般使用jquery,提供了更好的封装,使用起来也更方便。
5.1.
优缺点及应用场景
优点:
1.使用异步方式与服务器通信,页面不需要重新加载,页面无刷新
2.按需取数据,减少服务器的负担
3.使得Web应用程序更为迅捷地响应用户交互
4.AJAX基于标准化的并被广泛支持的技术,不需要下载浏览器插件或者小程序,但需要客户允许JavaScript在浏览器上执行
5.浏览器的内容和服务端代码进行分离。页面的内容全部由JAVAScript来控制,服务端负责逻辑的校验和从数据库中拿数据。
缺点:
1.安全问题:将服务端的方法暴露出来,黑客可利用这一点进行攻击
2.大量JS代码,容易出错
3.Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰——用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等
4.可能破坏浏览器后退按钮的正常行为;
5.一些手持设备(如手机、PAD等)自带的浏览器现在还不能很好的支持Ajax
应用场景:
1.对数据进行过滤和操纵相关数据的场景
2.添加/删除树节点
3.添加/删除列表中的某一行记录
4.切换下拉列表item
5.注册用户名重名的校验
6.
总结
js是一种脚本语言,每个浏览器都内置了解释器。
flask或者说web服务器不关心网页中js脚本的内容,它被视为网页源码的一部分被发送给浏览器,然后由浏览器进行解释。
ajax是一种依赖于XMLHTTPRequest进行数据交换而无需更新整个网页的技术(废话)。
对于后端而言,ajax是透明的,它不关心,与普通路由没什么区别。
jquery是一个js库,包含一些常用的js函数,它与js的关系类似于urllib之于python。
7.
参考
jquery:http://www.runoob.com/jquery/jquery-tutorial.html
https://www.cnblogs.com/dulmcat/p/5812062.html
https://www.cnblogs.com/wanghp/p/6991554.html
flask与javascript及ajax的更多相关文章
- Flask框架:运用Ajax轮询动态绘图
Ajax是异步JavaScript和XML可用于前后端交互,在之前<Flask 框架:运用Ajax实现数据交互>简单实现了前后端交互,本章将通过Ajax轮询获取后端的数据,前台使用echa ...
- 最新JavaScript、Ajax典藏级学习资料下载分类汇总 (2011年12月21日更新)
其他网站开发相关资料 超强HTML和xhtml,CSS精品学习资料下载汇总 最新htm ...
- 初识JavaScript,Ajax,jQuery,并比较三者关系
一.基本认识 1.JavaScript 定义: javaScript的简写形式就是JS,是由Netscape公司开发的一种脚本语言,一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态 ...
- JavaScript实现Ajax小结
置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<TCP的三次握手和四次挥手> 作者主页:myvin 博主QQ:851399101(点击QQ和博主发起临 ...
- 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
转http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 ...
- javascript版Ajax请求
什么是Ajax请求,Ajax也就是“Asynchronous JavaScript and XML”(异步JavaScript和XML),无刷新数据读取.能减少流量的消耗,也提高了浏览的流畅性,给用户 ...
- Javascript与Ajax
不使用jquery来处理ajax请求该怎么做? 首先要明确html中的某些数据需要从服务端获得,也就是客户端向服务端请求(request)数据,服务端就响应(response)这个请求,把客户端要的数 ...
- javascript进阶——Ajax
统的Web 页面和应用中,用户每点击页面上的某个部分,浏览器就会向服务器发出一个请求,等待服务器做出响应,然后返回一个完整新网页,但在大多数情况下用户不得不忍受页面闪烁和长时间的等待.随着Web技术的 ...
- Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)
英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...
随机推荐
- Oracle 查看session级别信息
1. 查看活动会话信息[sql] view plain copySELECT * FROM V$SESSION WHERE USERNAME IS NOT NULL AND STAT ...
- python接口测试-项目实践(七)脚本优化
七 脚本优化:重复代码的提取成函数:与项目接口相关的都封装到一个类中:添加手工验证脚本,增加输入值的判断逻辑 将所有与该项目接口相关的封装成类 class ProjectApi: #3个数据源接口 d ...
- [转]简单优化:Zipalign
转自:http://www.cnblogs.com/xirihanlin/archive/2010/04/12/1710164.html Android SDK中包含一个“zipalign”的工具,它 ...
- BZOJ3680:吊打XXX(模拟退火)
Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个 ...
- 记一次pda(安卓)环境配置流程
将git项目git clone下来,接下来就是环境的配置 sdk,jdk,蓝牙插件,热更新 这个顺序 一.java JDK 安装及环境变量配置 https://blog.csdn.net/de ...
- 更改win7关机菜单选项功能
说明:如果你不希望别人对你的电脑进行注销切换等操,那么可以使用如下的方法 实现效果: 实现步骤: 效果1 1>切换用户: 2>注销:(需重启资源管理器生效) 效果2:
- 不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证” 的解决办法
不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证.它在下载过程中可能已遭破坏或篡改. 解决办法:修改系统时间. 1,查看你的dmg文件的创建日期 2,把你的系统日期修改到比这个 ...
- Java中基本类型和引用类型(简单介绍)
8种基本类型 一.4种整型 byte 1字节 -128——127 short 2 字节 -32,768 —— 32,767 in ...
- 代替eval执行字符串表达式
function eval2(str) { var Fn = Function; return new Fn('return ' + str)(); }
- IO Jar包
密码e7ed https://pan.baidu.com/share/init?surl=LakzlwrjolWwpoft5j6aBg