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 事件:

鼠标事件

键盘事件

表单事件

文档/窗口事件

click

keypress

submit

load

dblclick

keydown

change

resize

mouseenter

keyup

focus

scroll

mouseleave

hover

blur

unload

常用的 jQuery 事件方法

$(document).ready()

$(document).ready() 方法允许在文档完全加载完后执行函数。

在示例代码中也使用了这一方法。

click()

click() 方法是当按钮点击事件被触发时会调用一个函数。

该函数在用户点击 HTML 元素时执行。

在下面的实例中,当点击事件在某个 <p> 元素上触发时,隐藏当前的 <p> 元素:

4.3.   
jquery与ajax

$.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的更多相关文章

  1. Flask框架:运用Ajax轮询动态绘图

    Ajax是异步JavaScript和XML可用于前后端交互,在之前<Flask 框架:运用Ajax实现数据交互>简单实现了前后端交互,本章将通过Ajax轮询获取后端的数据,前台使用echa ...

  2. 最新JavaScript、Ajax典藏级学习资料下载分类汇总 (2011年12月21日更新)

    其他网站开发相关资料            超强HTML和xhtml,CSS精品学习资料下载汇总                                               最新htm ...

  3. 初识JavaScript,Ajax,jQuery,并比较三者关系

    一.基本认识 1.JavaScript 定义: javaScript的简写形式就是JS,是由Netscape公司开发的一种脚本语言,一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态 ...

  4. JavaScript实现Ajax小结

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<TCP的三次握手和四次挥手> 作者主页:myvin 博主QQ:851399101(点击QQ和博主发起临 ...

  5. 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求

    转http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 ...

  6. javascript版Ajax请求

    什么是Ajax请求,Ajax也就是“Asynchronous JavaScript and XML”(异步JavaScript和XML),无刷新数据读取.能减少流量的消耗,也提高了浏览的流畅性,给用户 ...

  7. Javascript与Ajax

    不使用jquery来处理ajax请求该怎么做? 首先要明确html中的某些数据需要从服务端获得,也就是客户端向服务端请求(request)数据,服务端就响应(response)这个请求,把客户端要的数 ...

  8. javascript进阶——Ajax

    统的Web 页面和应用中,用户每点击页面上的某个部分,浏览器就会向服务器发出一个请求,等待服务器做出响应,然后返回一个完整新网页,但在大多数情况下用户不得不忍受页面闪烁和长时间的等待.随着Web技术的 ...

  9. Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)

    英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...

随机推荐

  1. Oracle 查看session级别信息

    1. 查看活动会话信息[sql] view plain copySELECT *    FROM V$SESSION   WHERE USERNAME IS NOT NULL     AND STAT ...

  2. python接口测试-项目实践(七)脚本优化

    七 脚本优化:重复代码的提取成函数:与项目接口相关的都封装到一个类中:添加手工验证脚本,增加输入值的判断逻辑 将所有与该项目接口相关的封装成类 class ProjectApi: #3个数据源接口 d ...

  3. [转]简单优化:Zipalign

    转自:http://www.cnblogs.com/xirihanlin/archive/2010/04/12/1710164.html Android SDK中包含一个“zipalign”的工具,它 ...

  4. BZOJ3680:吊打XXX(模拟退火)

    Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个 ...

  5. 记一次pda(安卓)环境配置流程

    将git项目git clone下来,接下来就是环境的配置   sdk,jdk,蓝牙插件,热更新 这个顺序   一.java JDK 安装及环境变量配置 https://blog.csdn.net/de ...

  6. 更改win7关机菜单选项功能

    说明:如果你不希望别人对你的电脑进行注销切换等操,那么可以使用如下的方法 实现效果:          实现步骤: 效果1 1>切换用户: 2>注销:(需重启资源管理器生效) 效果2:

  7. 不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证” 的解决办法

    不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证.它在下载过程中可能已遭破坏或篡改. 解决办法:修改系统时间. 1,查看你的dmg文件的创建日期 2,把你的系统日期修改到比这个 ...

  8. Java中基本类型和引用类型(简单介绍)

    8种基本类型  一.4种整型 byte      1字节           -128——127     short     2 字节         -32,768 —— 32,767     in ...

  9. 代替eval执行字符串表达式

    function eval2(str) { var Fn = Function; return new Fn('return ' + str)(); }

  10. IO Jar包

    密码e7ed https://pan.baidu.com/share/init?surl=LakzlwrjolWwpoft5j6aBg