JQuery异步请求与Flask后端通信、this和event指针汇总

ops/2024/9/19 0:53:58/ 标签: jquery, flask, 前端

目录

一.JQuery与Flask通信的三种方法

1.1$.ajax()

1.2$.get()

1.3$.post()

二.forEach()方法

三.this指针

3.1为什么要用this指针

3.2this的指向

3.3this指针的四种绑定方式

3.3.1默认绑定

3.3.2隐式绑定

3.3.3显式绑定

3.3.4new绑定

3.3.5通过标签调用this指针函数

3.4this绑定的优先级

3.5特殊的绑定

 3.5.1忽略空值的绑定

3.5.2函数赋值同时调用函数(间接函数引用)

3.5.3箭头函数

四.event指针

4.1event指针介绍

4.2事件相关概念

 ​编辑

4.2.1事件流

4.2.2捕获阶段

4.2.3事件触发过程

4.2.4冒泡阶段

一.JQuery与Flask通信的三种方法

根据HTTP的“get”与“post”两种请求,JQuery提供“$.get()”、“$.post()”、“$.ajax()”三种方式通信。

1.1$.ajax()

使用$.ajax()可以很方便的与后端交换数据,不过当我们传入的数据是一个JS对象时,我们需要使用“JSON.stringify(object)”方法来将JS对象转换为JSON数据。

除此之外,我们还需要修改“请求头格式”为“application/json”,如果不修改请求头格式”,那么会报错:“415 (Unsupported Media Type)

而解决办法就是在$.ajax()中添加语句“contentType: "application/json;charset=UTF-8"

一个ajaxFlask后端传送数据的示例。

//发送数据
$.ajax({type:"post",dataType:"json",url:"/main/blog/commit/comment",contentType: "application/json;charset=UTF-8",data:JSON.stringify(data),
});

后端使用“request.json”获取字典对象来使用数据。

1.2$.get()

$.get()ajax使用get请求的简化版,在使用get请求向后端请求数据时,如果我们是这样的语句:

$.get("/main/blog/get/allcomment",{"blog_id":"123"},function(res){if(res.length == 0){//pass}
}

注意我们使用get请求的同时,附加了“blog_id”这个数据参数,这会改变我们get请求的URL,变成:"/main/blog/get/allcomment?blog_id=66",也就是说我们的请求参数自动作为修饰符添加到URL中。

此时,在后端Flask中,我们需要使用:“request.args.get("blog_id")”来获取“123


若数据参数有多个,例如:

{"test1":"123","test2":"456"
}

仍然使用“request.args.get("blog_id")”来获取对应值

1.3$.post()

$.postajaxpost请求简化版,需注意,传入的数据类型需要是JSON类型,在后端使用:“request.json”获取字典对象来使用数据。

例如:

二.forEach()方法

forEach()方法用来对一个数组中的所有成员执行方法内操作

例如:

let value = [1,2,3]
value.forEach(function(item){console.log(item);
});

效果:

三.this指针

3.1为什么要用this指针

this可以用来指向某些元素对象,在合适的地方使用this,可以减少无用代码的编写。

下面是一个冗余且不易维护的代码:

var user = {name: "aclie",sing: function () {console.log(user.name + '在唱歌')},dance: function () {console.log(user.name + '在跳舞')},study: function () {console.log(user.name + '在学习')},
}

在这个代码中,每个方法都需要用到user对象中的name属性,如果user对象名称发生变化,那么所有用到user的地方都要修改,在这种情况下,就可以使用this指针

var user = {name: "aclie",sing: function () {console.log(this.name + '在唱歌')},dance: function () {console.log(this.name + '在跳舞')},study: function () {console.log(this.name + '在学习')},
}

3.2this的指向

this指向(值)函数在哪里定义无关只与“如何调用”有关

 function foo(){console.log(this)
}foo()var obj = {foo: foo
}
obj.foo() obj.foo.apply("hello") 

执行结果:

3.3this指针的四种绑定方式

3.3.1默认绑定

当函数独立调用时,this指针默认绑定window

//1.直接调用函数
function f(){console.log(this);
}f();//2.对象中的函数
var obj1 = {f:f
}
var fn1 = obj1.f;
fn1();//3.被全局变量引用
var obj2 = {bar:function(){console.log(this);}
}
var fn2 = obj2.bar;
fn2();//4.函数嵌套调用
function f1(){console.log("f1",this);f2();
}
function f2(){console.log("f2",this);f3();
}
function f3(){console.log("f3",this);
}
f1();//5.通过闭包调用
var obj3 = {bar:function(){return function(){console.log(this);}}
}
obj3.bar()();

执行结果:

3.3.2隐式绑定

调用的对象内部有对函数的引用

(通过对象调用函数)

//通过对象调用函数
//注意区别“使用对象调用函数”与“直接调用对象中函数”两者区别
//前者是通过对象调用,故this指向该对象
//后者直接调用,故this指向window
var obj2 = {f:f
}
var myF = obj2.f
obj2.f();    //隐式调用,通过对象调用
myF();      //直接调用

执行结果:

注意:

将对象内的函数单独取出并且赋值给某个变量,通过这个变量来调用函数,就是“直接绑定”,this指针指向“window对象”。

直接通过对象调用这个函数,this指针指向“该对象”。

3.3.3显式绑定

不希望在对象内部包含这个函数的引用,但又希望通过对象强制绑定

(手动修改this指向)

使用call/apply/bind进行“显式绑定

function f(){console.log(this);
}var testV = {"name":"小明"
}f.call(testV)
f.apply(testV)
f.call("大明")

执行结果:

3.3.4new绑定

通过new关键字来创建构造函数的示例,绑定this

function animal(aName,aAge){this.aName = aName;this.aAge = aAge;
}const cat = new animal("小花",14);
const dog = new animal("大黄",15);console.log(cat);
console.log(dog);

执行结果:

总结:

在这里的this指针,跟Pythonn对象里的“self指针差不多,都是指向对象自身

3.3.5通过标签调用this指针函数

当某个标签调用某个含有this指针函数时,是默认绑定,故this指针指向window

(其实就是相当于单独在script标签中调用了函数,故是默认绑定)

可以将this指针传入,用来代指该标

    <button onclick="myclick1(this)">按钮1</button><button onclick="myclick2()">按钮2</button><script>function myclick1(e){console.log(e);}function myclick2(){console.log(this);}</script>

执行结果:

3.4this绑定的优先级

  • 隐式绑定高于默认绑定
  • 显示绑定高于隐式绑定
  • new绑定高于隐式绑定
  • new绑定高于显示绑定

绑定优先级

new关键字绑定 > 显式绑定 > 隐式绑定 > 默认绑定 

3.5特殊的绑定

除了上述四种常见绑定以外,还有三种“特殊的绑定规则”,少见,但是容易犯浑

 3.5.1忽略空值的绑定

当显式绑定的值为“null/undefined”时,this忽略显式昂定,转而绑定window

        var testV = {name:"小明",f:function f(){console.log(this);}}testV.f.call("123");testV.f.call(null);testV.f.call(undefined);

执行结果:

3.5.2函数赋值同时调用函数(间接函数引用)

间接函数引用相当少见(正常人不会写这种犯抽代码,某些面试官可能喜欢问用来装X)

        var testV1 = {name:"小明"};testV1.f = function (){console.log(this);};testV1.f();testV2 = {name:"大明"};(testV2.f = testV1.f)()

执行结果:

总结:

testV2在接收testV1的值(函数)时,添加了小括号,相当于赋值过程调用函数过程同时发生(并发过程),而在这个函数调用过程中,因为“赋值过程没有结束,而“函数又被调用”(此时因为是在内存中的函数被调用,而不是隐式绑定[例如:“testV1.f()”]),故被当做“默认绑定”由window调用this指针

3.5.3箭头函数

箭头函数不绑定this指针,它的this指针来源于上级作用域

        var testV = {name:"小明",f:() => {console.log(this);}};testV.f();

执行结果:

四.event指针

4.1event指针介绍

当事件(鼠标点击、键盘敲击等等)发生以后,会产生一个事件对象,作为参数传给监听函数。

    <button onclick="myclick1(event)">按钮</button><script>function myclick1(e){console.log(e);}</script>

点击按钮后,执行结果:

可以看出event是一个事件对象,在这里表示一个点击事件对象

4.2事件相关概念

要想学会event,我们还需要了解“事件流”、“捕获过程”、“事件触发过程”、“冒泡过程” 

 

一个完整的JS事件流是从window开始,最后回到window的一个过程。

事件流别分为三个阶段:“(1-5)捕获阶段”、“(5-6)事件触发过程”、“(6-10)冒泡阶段”。

4.2.1事件流

指页面中接受事件的顺序,即上图中的顺序。

4.2.2捕获阶段

在捕获阶段中,也可以通过“addEventListener(evnt,function,useCapture)”方法执行事件,在捕获阶段执行的元素,在冒泡阶段就不会在执行

addEventListener()定义与用法

  • document.addEventListener() 方法用于向文档添加事件句柄
  • 提示: 可以使用 document.removeEventListener() 方法来移除 addEventListener() 方法添加的 事件句柄
  • 提示:使用 element.addEventListener() 方法为指定元素添加事件句柄
参数描述
event必须。描述事件名称的字符串,例如“click”是点击事件
function必须。描述事件触发后执行的函数
useCapture可选。布尔值,true-事件句柄在捕获阶段执行,false-事件句柄在冒泡阶段执行

4.2.3事件触发过程

被点击位置最内层元素执行事件且准备向上传递事件句柄的过程

4.2.4冒泡阶段

当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window。

如果它的父级元素也有某个事件函数,当执行完它的事件函数后,也会执行它父级的事件函数

一个例子代码:

HTML部分

<div class="parents" id="parents"><div class="child" id="child"></div>
</div>

JS部分:

<script>var parents = document.getElementById("parents");var child = document.getElementById("child");document.onclick = function(e){alert("你点击了屏幕任何区域");};document.body.onclick = function(e){alert("你点击了body区域");};parents.onclick = function (e) {alert("你点击了parents区域");};child.onclick = function (e) {alert("你点击了child区域");};</script>

具体HTML元素的区域:

  • 点击区域①的时候:会依次弹出你点击了child区域你点击了parents区域你点击了body区域 你点击了屏幕任何区域 这四个弹框。
  • 点击区域②的时候:会依次弹出你点击了parents区域你点击了body区域点击了屏幕任何区域 这三个弹框。
  • 点击区域③的时候:会弹出 你点击了body区域你点击了屏幕任何区域 这两个弹框。
  • 点击区域④的时候:就只弹出 你点击了屏幕任何区域 这一个弹框。

 


http://www.ppmy.cn/ops/86477.html

相关文章

Android 开发中px、dpi 和 dp三个单位的介绍

Android 开发中px、dpi 和 dp三个单位的介绍 在 Android 开发中&#xff0c;px、dpi 和 dp 是用来描述屏幕尺寸和密度的单位&#xff0c;它们在设计和开发中有着不同的作用和用途。 1. px&#xff08;像素&#xff09; 定义&#xff1a; px 表示屏幕上的一个像素点&#xff0c…

Docker常用命令--docker run

docker run 是 Docker 中最重要的命令之一&#xff0c;用于启动新的容器。这个命令功能强大且灵活&#xff0c;支持许多选项来定制容器的行为。下面介绍 docker run 命令的各个部分&#xff0c;并给出一些使用示例。 基本语法 docker run 的基本语法如下&#xff1a; docker…

获取后端返回的图形验证码

如果后端返回的直接就是一个图形&#xff0c;有以下几种方式展示 一、直接在img标签里面的src里面调用接口 <img :src"dialogSrc" class"photo" alt"验证码图片" click"changeDialog">let orgUrl "/api/captcha" …

MySQL第一阶段:多表查询、事务

继续我的MySQL之旅&#xff0c;继续上篇的DDL、DML、DQL、以及一些约束&#xff0c;该到了多表查询和事务的学习总结&#xff0c;以及相关的案例实现&#xff0c;为未来的复习以及深入的理解做好知识储备。 目录 多表查询 连接查询 内连接 外连接 子查询 事务 事务简介…

【日常记录-Docker】容器退出机制

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-25 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 Docker容器退出机制是指容器停止运行并退出的一系列行为与规则&#xff0c;其决定了容器何时以及如何停止运行。了解并掌握容器…

自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 1.行业需求旺盛 随着信息技术的飞速发展&#xff0c;互联网已经深度融入到人们的生活、工作和社会的各个领域。企业数字化转型、智能家居的普及、智能交通的发展等&#xff0c;都使得网络安全的重要性日益凸显。大量的敏感信息&#xff0c…

基于Python+Django实现一个电商购物网站系统

随着互联网的高速发展&#xff0c;电子商务行业也正迎来了其黄金时代。如何搭建一个功能完备、体验良好的电商网站成了许多开发者的关心话题。今天&#xff0c;我将带大家使用Python语言和Django框架&#xff0c;快速打造一个电商购物系统。如果你有一定的Python基础&#xff0…

css: 让下方元素遮住上方元素底部的 box-shadow

背景: 表格底部有 shadow , UI 让去掉, 给了项目中其他正常表格示例 定位: 对比代码发现, 其他表格底部的分页 div 遮住了表格底部的 shadow , 对比两处代码, 找出分页 div 样式不同之处, 遮住 shadow 的分页 div 使用了 position: relative 解决: 给下方元素加上 positio…

Python 中的类与面向对象编程(二)

目录 一、面向对象编程&#xff08;OOP&#xff09; 二、类与实例 1. 类 2. 实例 三、 self 关键字 四、魔法函数 1. 初始化与字符串表示 2. 长度与比较 3. 算术运算 五、构造函数与析构函数 1. 初始化函数 2. 构造函数 3. 析构函数 六、面向对象编程的三大特性 …

海外媒体发稿-瑞典SEO破茧成蝶:从0到10的实战精要-大舍传媒

海外媒体发稿-瑞典SEO破茧成蝶:从0到10的实战精要 一、迷茫与意义的探寻 有一天我找了王老师聊天&#xff0c;谈到生活迷茫和人生的意义。老师说了一段话&#xff1a;当全情投入于一件事情时&#xff0c;是没有时间去迷茫或思索人生意义的。我感触很深&#xff0c;当总感到迷…

SQL中CASE WHEN的用法

CASE WHEN的用法 1. CASE WHEN数据转换 说明&#xff1a;使用CASE WHEN我们可以将范围的数据转换成特定的值来表达; 假如&#xff1a;有一个员工表Employee(employee_id,department_id.salary,name,age)&#xff1b; 需求&#xff1a;需要根据薪资情况来评定等级&#xff1a;…

mysql数据库基础语法(未完)

数据库的超级用户是root 一、注释 &#xff08;1&#xff09;“-- ”减号减号空格 注意不要省略空格 &#xff08;2&#xff09;“#” 井号 二、数据库操作 1、创建 CREATE DATABASE [IF NOT EXISTS] <数据库名> [CHARACTER SET utf8] 2、删除 DROP DATABASE …

IP 泄露: 原因与避免方法

始终关注您的IP信息&#xff01; 您的IP地址不仅显示您的位置&#xff0c;它包含几乎所有的互联网活动信息&#xff01; 如果出现IP泄漏&#xff0c;几乎所有的信息都会被捕获甚至非法利用&#xff01; 那么&#xff0c;网站究竟如何追踪您的IP地址&#xff1f;您又如何有效…

【Go - 单例示例】

需求 实现一个单例&#xff0c;需要考虑如下的内容&#xff0c; 最基础的&#xff0c;每次返回相同实例&#xff0c;线程安全&#xff0c;生命周期&#xff0c;资源管理&#xff0c;程序退出后释放资源&#xff0c; 参照以上3点需求&#xff0c;以下是一个完整的示例&#x…

Spark进化论:从RDD到DataFrame,揭秘Spark SQL如何成为性能引擎的幕后英雄

一道面试题引入主题 spark 3.0 大版本发布,Spark SQL 的优化占比将近 50%;而像PySpark、Mllib 和 Streaming 的优化占比都不超过 10%,Graph 的占比几乎可以忽略不计。这是否意味着 Spark 社区逐渐放弃了其他计算领域,只专注于数据分析 ? 这个问题的标准答案是:“Spark S…

[网鼎杯 2020 朱雀组]Nmap(详细解读版)

这道题考察nmap的一些用法,以及escapeshellarg和escapeshellcmd两个函数的绕过&#xff0c;可以看这里PHP escapeshellarg()escapeshellcmd() 之殇 (seebug.org) 两种解题方法&#xff1a; 第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入we…

2.11.ResNet

ResNet 动机&#xff1a;我们总是想加更多层&#xff0c;但加更多层并不总是能改进精度 可以看出F1到F6模型越来越大&#xff0c;但F6距离最优解却总变远了&#xff0c;反而效果不好&#xff0c;通俗的来说就是学偏了&#xff0c;实际上我们希望是这样的&#xff1a; ​ 更大…

网络基础1

网络基础1 1. 认识协议2. 协议分层3. 协议的重要性4. 网络传输的基本流程5. 跨网络传输流程6. 网络编程 1. 认识协议 局域网&#xff0c;广域网 局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网 WAN: 将远隔千里的计算机都连在一起; 什么是网络协议 …

sqlalchemy使用json_unquote函数的mysql like查询

sqlalchemy使用json_unquote函数的mysql like查询 在SQLAlchemy中使用json_unquote函数查询MySQL JSON字段可以通过使用func函数来实现。下面是一个示例,假设有一个名为users的表,其中包含一个名为data的JSON字段,我们想要查询该字段的内容: from sqlalchemy import crea…

爬虫基本原理入门

在互联网时代&#xff0c;数据是驱动一切业务的核心资源之一。而爬虫技术&#xff0c;作为获取互联网数据的重要手段&#xff0c;被广泛应用于数据分析、信息聚合、搜索引擎优化等多个领域。本文将带你走进爬虫世界&#xff0c;了解爬虫的基本原理和基本概念&#xff0c;帮助你…