jQuery delegate方法实现Ajax请求绑定事件不丢失
给元素绑定click事件后 ,遇到一个问题:当执行一些ajax请求,再次调用此页面,里面的这个click事件就失效了
比如说:我的分页是一个ajax请求 但我点下一页时 后生成的元素a就没有了click事件了
自己做项目时遇到的问题:
目的:批量删除复选框,当点击删除的时候触发利用jquery绑定在按钮上的onclick事件从而获取所有复选框的值,
1.第一次直接smarty注入调取页面时没问题,当根据条件查询(Ajax实现),再次调用页面列出记录时,单击事件失效
原因:ajax加载内容是在$(document).ready()之后的操作,这个时候给绑定函数的时候,找到的元素集合中还不包括ajax加载的内容,所以原来的没有问题,后加载的就没有绑定
最终解决办法:
1.利用jQuery的delegate()方法
2.利用原生js把获取复选框的值写入提交验证函数里,<form method="post" action="channel_code_manage.php?act=removeall" name="listForm" id="deleted" class="fn-mt20" onsubmit="return checkbox();">
有值,验证通过,把值赋给一个隐藏域value
无值,返回
function checkbox() {
var compatibility = "",input = document.getElementsByTagName("input"),value;
for (var i = 0; i < input.length; i++) {
if (input[i].type == "checkbox") {
if (input[i].checked) {
value = input[i].value;
if(value!='on'){ 给全选按钮value设置为on 排除此选项
compatibility += value + ","; 拼接字符串
}}
}
}
compatibility = compatibility.substring(0,compatibility.lastIndexOf(",")); //删除最后的,
if(!compatibility){ //如果字符串为空 ,返回false
alert('请选择要删除的记录');
return false;
}else{
document.getElementById('getvalues').value=compatibility; //如果字符串不为空 把值赋值给隐藏于提交
confirm('确定批量删除?');
}
}
解决办法:
1. 在ajax请求成功之后重新绑定事件
2. 用jquery的delegate(sel,[type],[data],fn)方法 live()方法已弃用
$(document).delegate('a', 'click', function() { blah() }) 解决绑定事件Ajax请求后不失效
指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。
使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。
参数:
selector:选择器字符串,用于过滤器触发事件的元素。
type:附加到元素的一个或多个事件。由空格分隔多个事件值。必须是有效的事件。
data:传递到函数的额外数据
fn:当事件发生时运行的函数
$(function(){
$('#deleted').delegate("button",'click',function(){ 被选元素的子元素---->deleted为form 表单 button为表单中的按钮
checked = [];
$('input:checkbox:checked').each(function() {
checked.push($(this).val());
});
$('#getvalues').val(checked); //给隐藏域设置属性
})
})
完美解决问题,呵呵!
延伸:
在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如:$('a').live('click', function() { blah() });
弃用的原因可以参考:http://www.cnblogs.com/dumuqiao/archive/2011/09/09/2172511.html
那如何在新版本中实现live函数的功能呢,也就是当由ajax方式加载了页面片段后,这个页面片段中的内容如何响应相关的事件呢?
方法有好几种,本文只提供简单的两种:
- 一种是直接导入jquery-migrate:https://github.com/jquery/jquery-migrate/,这样就能使live函数能够使用,但不对性能做优化。
- 另一种是使用delegate函数来实现live的功能
$(document).delegate('a', 'click', function() { blah() });
jQuery delegate方法实现Ajax请求绑定事件不丢失的更多相关文章
- WEB前端技巧之JQuery为动态添加的元素绑定事件.md
jquery 为动态添加的元素绑定事件 如果直接写click函数的话,只能把事件绑定在已经存在的元素上,不能绑定在动态添加的元素上 可以用delegate来实现 .delegate( select ...
- 解决jquery新加入的元素没有绑定事件问题
在使用jquery操作时,往往需要动态的添加一些元素,但是这些新加入的元素并没有像css那样被赋予原本定义的样式,解决方法如下: 1.动态插入元素后,并用bind事件给新加入的元素绑定事件. 2.如果 ...
- 利用JQUERY实现多个AJAX请求等待
利用JQUERY实现多个AJAX请求等待 li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list- ...
- jquery delegate()方法 语法
jquery delegate()方法 语法 作用:delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数.使用 delegate( ...
- 为非ajax请求绑定回调函数的方法
我们都知道jQuery为ajax请求封装了success和error两个回调方法,其实jQuery也实现了为非ajax请求的普通方法也设计了绑定回调函数的方法. 当一个方法需要等待另一个耗时很长的方法 ...
- jQuery给动态添加的元素绑定事件的方法
我们在开发过程会遇到无法给动态元素添加绑定事件,解决方案如下: 例如 <div id="testdiv"> <ul></ul> </d ...
- Jquery 页面元素动态添加后绑定事件丢失方法,非 live
代码1: 以此方法绑定的input框事件,在通过add按钮后用jquery绑定的事件 alert就会丢失 <input type="button" value="A ...
- jquery 动态创建的元素,绑定事件无效之解决方法
今天遇到一个问题,动态创建的元素,绑定事件无效,如下: js 代码如下: var OaddX = $('.detright div.duibi div.duibox ul li span'); // ...
- jQuery 为动态添加的元素绑定事件
在使用jquery的方式为元素绑定事件时,我经常使用bind或者click,但这只能为页面已经加载好的元素绑定事件.像需要用ajax的方式请求远程数据来动态添加页面元素时,显然以上几种绑定事件的方式是 ...
随机推荐
- 数据结构之顺序栈SqStack
顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...
- bzoj1588 [HNOI2002]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- UVALive 5983 MAGRID
题意:在一个n*m的网格上,从(0,0)走到(n-1,m-1),每次只能向右或者向下走一格.一个人最初有一个生命值x,走到每一个格生命值会变为x + s[i][j],(s[i][j]可为负,0,正), ...
- Linux内存寻址之分段机制
前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...
- FindControl的使用方法
Control.FindControl (String):在当前的命名容器中搜索带指定 id参数的服务器控件.(有点类似javascript中的getElementById(string)) 简单的例 ...
- 嵌入式Linux的一点学习心得
Linux本身是一个发展中的操作系统.它有很多前期不完善的机制,被后代用新的机制代替.但是老的机制不可能一下子就消亡,因此由于“历史原因”,会产生很多新旧机制共存的情况.而且Linux的教科书数不胜数 ...
- Visual Studio的2个有趣的插件:声音控制和放屁:)
.NET Slave | Talk to, hear, touch and see your code介绍了2个有趣的Visual Studio的插件,你可以通过它们和你的代码对话. 声音控制(Voi ...
- 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程
在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...
- C primer plus 读书笔记第十四章
这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点. 1.示例代码 /*book.c -- 仅包含一本书的图书目录*/ #include <stdio.h> #defin ...
- 从 Kubernetes 谈容器网络
基本概念 在 Kubernetes 中.资源从管理粒度上分为三级:容器.Pod.Service. 容器 即 Docker 或者 Rocket 容器(1.0 中仅支持这两种容器). 容器是最低粒度的资源 ...