第八篇: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系的浏览器,所以感觉兼容性上的问题可能会少一些. 但是手机端,虽然出了很多工具,但是 ...
随机推荐
- 【Xamarin开发 Android 系列 7】 Android 结构基础(下)
原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...
- Adroid解析json
参考资料: http://www.open-open.com/lib/view/open1326376799874.html http://www.cnblogs.com/tt_mc/archive/ ...
- bzoj3172
这里学习AC自动机其实对KMP和trie掌握好了之后很容易扩展成AC自动机的这里运用了一个性质由失配指针反向可以建成一棵fail树x串在y串中的出现的次数即为在fail树上以x结尾节点为根的子树中有多 ...
- 一起啃PRML - 1.2.1 Probability densities 概率密度
一起啃PRML - 1.2.1 Probability densities @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 我们之前一直在讨论“谁取到 ...
- JAVA用geotools读写shape格式文件
转自:http://toplchx.iteye.com/blog/1335007 JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2) (后面添加对应geotoo ...
- Linux之read用法
转载转载:www.cnblogs.com/iloveyoucc/archive/2012/04/16/2451328.html 1.基本读取 #!/bin/bash echo -n "Ent ...
- ASP.NET中设置一个定时器来定时更新 转
asp.net 定时器 比较少用, 中国红木网这是一个相当实用的功能,有了RSS博客镜像,就不需要在多处同时发布博客日志了.比如你同时在新浪上有自己的博客,又同时有自己的个人博客站点,那么你只需要在 ...
- Android学习笔记1:Activity与View
推荐一系列优秀的Android开发源码 Activity是Android应用中负责与用户交互的组件. View组件是所有UI控件.容器控件的基类,View组件就是Android应用中用户实实在在看到的 ...
- 前端自动生成/加载CSS
前言: 1.我很懒! 2.写样式时,很多时候需要单独设置长度.宽度.内间距.外间距等.于是,就会有很多CSS代码会出现很多类似以下的代码: .w20: { width: 20px; } .mt10: ...
- cygwin下安装hadoop0.20
安装时选择软件包: editor-两个VIM.base-SED.Net-OPENSSH.OPENSSL.libs-libintl3和libintl8 环境变量: path=%JAVA_HOME%\bi ...