第八篇:web之前端踩的一些坑
前端踩的一些坑
前端踩的一些坑
本节内容
- 事件代理
- 清除标签的所有事件
- bootstrap的模态框自定义方法
- ajax在django里面实现post提交
- ajax提交数据嵌套
1.事件代理
之前写前端的时候发现在ajax里面获取到的部分html插入到主页面中,插入的部分html中的button始终无法绑定click事件。。。各种找问题,最后发现锅是在页面刚请求到的时候,那部分ajax请求到的页面还没有加载到主html中,js绑定事件的时候找不到这个标签,于是就绑定失败。
之后在网上找相关资料,原来js里面有一个概念叫做事件代理和委托,能够解决我的问题。
既然说到了事件代理和委托,那就得涉及到事件冒泡和捕获的概念了。这里应用大饼卷馒头蘸米饭的部分内容:
事件冒泡及捕获
之前的介绍中已经说到了浏览器的事件冒泡机制。这里再详细介绍一下浏览器处理DOM事件的过程。对于事件的捕获和处理,不同的浏览器厂商有不同的处理机制,这里我们主要介绍W3C对DOM2.0定义的标准事件。
DOM2.0模型将事件处理流程分为三个阶段:一、事件捕获阶段,二、事件目标阶段,三、事件起泡阶段。如图:
事件捕获:当某个元素触发某个事件(如onclick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。在这个过程中,事件相应的监听函数是不会被触发的。
事件目标:当到达目标元素之后,执行目标元素该事件相应的处理函数。如果没有绑定监听函数,那就不执行。
事件起泡:从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被一次触发。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)来组织事件的冒泡传播。
也就是说既然我无法在请求到的部分html中绑定click事件,那么我可以在它的父标签上面绑定click事件,当子标签的click事件被触发之后,如果子标签没有绑定,那么这个时间将会冒泡到父标签上(或者先被父标签捕获,而不到达子标签上)。这样就可以实现绑定ajax获取的html里面的标签的click事件了。
jquery代码实现如下:
1
2
3
4
|
$( ".body_right" ).click( ".btn" , function (env){ var btn=$(env.target); console.log(btn) }) |
这里面的.body_right就是父标签,在父标签上绑定click事件,监听下面的所有(.btn)按钮,当事件被触发的时候,在function的参数里面会传递一个env参数,这个参数里面有一个target属性,通过env.target可以直接拿到被点击的按钮element。之后就可以为所欲为了,哈哈哈。
当然,事件代理也可以用在需要绑定多个子标签的事件上,如果需要绑定多个子标签的click事件,那么js里面需要循环遍历子标签,给每个子标签绑定事件,jquery可以使用each绑定一组子标签,但是事件代理直接绑定这些子标签的父标签,当有事件触发时可以直接找到被点击的子标签,可以大大简化js代码。
2.清除标签的所有事件
上面说发现了一个好东西,事件代理,那么这个好东西当然要用在代码里面去了,但是我发现一个问题,那就是当一个标签绑定了多个事件代理之后,会出现一个问题。。。就是一个事件被多次触发。。。(现实效果是第一次点击,发送一次ajax提交,第二次点击发送两次ajax提交,第三次点击发送3次ajax提交...)为了解决这个问题,就需要在标签被绑定事件之前,先清除其它所有绑定事件对该标签的影响,这里有一个土办法,那就是在jquery里面有一个方法.off()这个方法可以将绑定标签的所有事件清除。下面是jquery代码:
1
2
3
|
$( ".modal-content" ).off().click( "button" , function (ev) { console.log($(ev.target)) }) |
3.bootstrap的模态框自定义方法
项目里面用到了模态框,觉得bootstrap的模态框挺漂亮的,于是拿过来用了用,确实不错,但是当我想自定义模态框里面的东西的时候,发现了一个问题,那就是自己设计的(确定)按钮点击之后模态框并没有关闭,之后去官网找文档,发现bootstrap的模态框里面提供了一些方法来帮助我们实现自定义模态框的操作。 下面是官方文档的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
.modal(options) 将页面中的某块内容作为模态框激活。接受可选参数 object。 $( '#myModal' ).modal({ keyboard: false }) .modal( 'toggle' ) 手动打开或关闭模态框。在模态框显示或隐藏之前返回到主调函数中(也就是,在触发 shown.bs.modal 或 hidden.bs.modal 事件之前)。 $( '#myModal' ).modal( 'toggle' ) .modal( 'show' ) 手动打开模态框。在模态框显示之前返回到主调函数中 (也就是,在触发 shown.bs.modal 事件之前)。 $( '#myModal' ).modal( 'show' ) .modal( 'hide' ) 手动隐藏模态框。在模态框隐藏之前返回到主调函数中 (也就是,在触发 hidden.bs.modal 事件之前)。 $( '#myModal' ).modal( 'hide' ) 也就是说绑定(确定)按钮的时候,可以触发模态框的hide事件: $( '#Mymodal' ).modal( 'hide' ) //隐藏模态框 <br>$('#Mymodal').modal('show') //显示模态框 |
4.ajax在django里面实现post提交
由于django默然开启了csrf攻击防护,其实就是在post提交的时候检查如果请求体里面没有它发给你的token,那么就不接受这个post提交并返回403 forbidden错误,那么在ajax提交post数据的时候,需要自己构造一个键值对{csrfmiddlewaretoken: {% csrf_token %}},但是这样用的话js就必须放在html里面让django进行模板渲染,如果js想放在js文件里面的话就需要在html里面定义一个{% csrf_token %},这样会生成一个hidden的input标签,通过js找到这个标签,拿到value,再拼接到ajax的data里面去,就可以实现了。jquery代码如下:
1
2
3
4
5
6
|
$.ajax( "/del_student/" ,{ type: "POST" , data:{id:id,csrfmiddlewaretoken: csrf_token}, success:show_student, complete:$( '#Mymodal' ).modal( 'hide' ) }); |
5.ajax提交数据嵌套
如果ajax提交的数据里面有嵌套,那么在提交的时候需要设定一个参数traditional:"true",默然traditional是false的,那么后端获取嵌套数据的时候将会出问题,将traditional设置成true就可以了。
第八篇:web之前端踩的一些坑的更多相关文章
- 第八篇 web开发学习资源
互联网时代,最好的资源都在网上,好好利用网络学起来! 偶然才发现好资源,很多是E文的,看来努力的路还很长! 1)下面是一个老外收集的PHP资源,确实要为此分享点赞. https://github.co ...
- 第九十八篇:Web的储存机制LocalStorage
好家伙 1.什么是LocalStorage? LocalStorage 是一种 web 端的存储机制, 它使得由 JavaScript 编写的网站或者应用可以无限期的在浏览器中存储并访问数据. Loc ...
- 那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传
一.上传图片并在前端展示 为了避免前端整体刷新,我们采用ajax+iframe(兼容所有浏览器)上传,这样用户上传之后就可以立即看到图片: 上传前: 上传后: 前端部分html: <form s ...
- Javascript之旅——第八站:说说instanceof踩了一个坑
前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
- 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.结构元素 可以理解为语义话标记,比如:以前这么写&l ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- [老老实实学WCF] 第八篇 实例化
老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...
- mobile web曾经的踩过坑
兼容性一直是前端工程师心中永远的痛.手机浏览器,因为基本是webkit(blink)内核当道,很多公司,不用考虑IE系的浏览器,所以感觉兼容性上的问题可能会少一些. 但是手机端,虽然出了很多工具,但是 ...
随机推荐
- [wikioi]没有上司的舞会
树形DP.用F[k][0]和F[k][1]表示某节点不选和选了之后子树的最大值.那么:f[i][0]=sigma(max(f[k][0],f[k][1]))f[i][1]=sigma(f[k][0]) ...
- 运行 maven install的时候出现错误 not a jre
原文转自jingyan.baidu.com/article/c85b7a6464d8be003bac95fb.html (linux下我直接执行第二步,错误解决) 在使用eclipse 运行 mave ...
- 【Xamarin挖墙脚系列:多窗口之间的导航】
原文:[Xamarin挖墙脚系列:多窗口之间的导航] 在Android中:Intent对象,通知松散耦合的Activity等组件 在IOS中:Segue对象连接视图 <button opaque ...
- minicom-2.4安装配置
minicom-2.4安装说明 1.#tar –zxvf minicom-2.4.tar.gz 解压开有连个文件,minicom-2[1].4.tar.gz 和minirc.dfl rpm包方式# ...
- POJ_2104_Kth_(主席树)
描述 http://poj.org/problem?id=2104 给出一个n个数的数列,m次询问,每次询问求区间[l,r]中第k小的数,无修改操作. K-th Number Time Limit: ...
- 如何设置SVN提交时强制添加注释
windows版本: 1.新建一个名为pre-commit.bat的文件并将该文件放在创建的库文件的hooks文件夹中 2.pre-commit.bat文件的内容如下: @echo off set S ...
- C语言volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...
- Implement the hash table using array / binary search tree
今天在复习Arrays and String 时看到一个很有趣的问题.希望跟大家分享一下. Implement the hash table using array / binary search t ...
- DIY常用网站
工作: 技术: 学习: 个人十佳博客介绍:http://hedengcheng.com/?p=676
- 51单片机产生1Hz-5kHz可调占空比方波
学校的课程设计,总结一下. 注意 1.高低电平的改变不适合在主函数的while循环中,因为要有数码管动态显示的延时和其它逻辑处理,时间太长会不能及时改变高低电平值. 2.中断的执行时间一定是不能超过定 ...