dom元素循环绑定事件的技巧
以前总觉得自己写的代码不太规范,尤其是写原生的时候。举个例子:
要为页面上所有".a"的元素绑定事件,当然了用jquery很方便:$('.a').bind("click",fn);
原生的话,我们很多会这样写:
- for(var i=0;i<length;i++){
- elem[i].onclick=function(x){return function(){}}(i);
- }
但是如果,我要连续绑定两个事件呢?
- for(var i=0;i<length;i++){
- elem[i].onmouseenter=function(x){
- return function(){}
- }(i); elem[i].onmouseout=function(x){
- return function(){}
- }(i); }
好吧,到目前为止这种写法都木有问题,但是,如果我要在绑定的这个函数中进行关联计算呢?如enter后+1,out后—1,继续:
- var num=[0,0,0];
- for(var i=0;i<length;i++){
- elem[i].onmouseenter=function(x){
- return function(){num[x]++};
- }(i);
- elem[i].onmouseout=function(x){
- return function(){num[x]--;conle.log(num[i]);};
- }(i);
- }
我们引入了一个数组,也就是三个num结合闭包来解决问题,为什么?因为不得不这么做,如果只用一个num就不同元素事件触发后num的值就混乱了。那么我们来换一种写法。
- Array.prototype.forEach.call(elems,function(elem,i){
var num;- elem.onmouseenter=function(){num++};
- elem.onmousout=function(){num--;consle.log(num)};
- });
是不是简单多了,第一、不用闭包了,第二、需要用统一的数组来管理了。为什么呢?因为上面的写法其实是吧事件绑定统一放在各自的匿名函数中。js会自动对每个num进行缓存,节省了命名空域。
类似的如果事件绑定之间存在大量的相互运算(time,num等),并且需要循环绑定,都可以采用这种方法,简单高效!
dom元素循环绑定事件的技巧的更多相关文章
- 动态生成的dom元素如何绑定事件
两种类型1.$('li').bind('click',function(){}); 当你用js动态添加li的时候,你添加的li不具有你绑定的事件.这种写法与$('li').click(function ...
- JS闭包机制实现为DOM元素循环添加事件
HTML代码: <button type='button' class='btn' id='1'>按钮1</button> <button type='button' c ...
- 如何在通过knockout数据绑定的DOM元素上添加事件
通过knockout数据绑定的DOM元素,通过chrome控制台打断点知道,DOM元素会被暂时隐藏,使用document.querySelector()是获取不到的,会显示null,直到数据绑定完成才 ...
- jQuery查看dom元素上绑定的事件列表
jQuery API提供了一种能够查看元素已绑定事件的列表,这个功能在进行功能调试的时候特别有用,尤其确定在代码执行过程中元素绑定的事件是否被更改. 1: jQuery( elem ).dat ...
- 【原生js】js动态添加dom,如何绑定事件
首先要明白浏览器在加载页面的时候是按顺序来加载的,这样以来就很清楚了,js动态添加dom以后,这些dom并没有绑定事件,这个时候最简单的一个办法就是:将绑定事件的方法封装到一个函数A中,在动态添加完d ...
- JavaScript利用闭包循环绑定事件
我们经常在做前端面试题的时候,会遇到循环绑定事件后,输出打印结果,很多人总是搞不清楚,今天借此机会跟大家梳理一下闭包相关作用. 1.首先我们举一个简单的例子. html部分: <a href=& ...
- jquery 动态创建的元素,绑定事件无效之解决方法
今天遇到一个问题,动态创建的元素,绑定事件无效,如下: js 代码如下: var OaddX = $('.detright div.duibi div.duibox ul li span'); // ...
- 【jquery】 在异步加载的元素上绑定事件
最近因为工作关系又重新回归到了jquery的怀抱,发现很多jquery的一些细节处理的部分都忘记了.这里记录一下最近在做项目时频繁遇到的一个问题:给异步加载的元素添加事件绑定. 问题发生的前提是项目前 ...
- event.target 属性返回哪个 DOM 元素触发了事件。
<ul> <li>list <strong>item 1</strong></li> <li><span>list ...
随机推荐
- redis第一篇--综述
1 redis里边有数据库的概念.可分为1-255这些表.在存储或者查找的时候要指明. redis_sentinel 集群里边封装成了namespace这样的概念.与db是不一样的.
- WebForm(aspx,cs,dll之间的关系)
WebForm分为两个文件aspx和aspx.cs,aspx是页面模板,是页面描述文件,就是html的内容,和aspx结合的更好,不用像一开始那样程序员自己去填充模板,控件都是定义在aspx中,内联的 ...
- ul li排版 左右对齐
定义两个ul的class, 一个向左浮动, 一个向右浮动 #navtop{ width:100%; height:46px; background-color:#ecf0 ...
- ASP.NET 会话状态的模式
ASP.NET 会话状态为会话数据提供了几个不同的存储选项.每个选项都通过一个 SessionStateMode 枚举值进行识别.如下列表中描述了可用的会话状态模式: InProc 模式:把会话状态存 ...
- mongodb启动
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.MongoDB是一款分布式文档数据库,支持类似关型数据库的主从结构,文档以二进制J ...
- WPF子窗体:ChildWindow
wpf的子窗体选择有很多种,如最常见的是项目新建窗体(Window)作为子窗体 ,或者新建wpf用户控件(UserControl).而其实利用Xceed.Wpf.Toolkit.dll 可以轻松布局如 ...
- 运用Merge Into实现增加或更新数据
declare @SqlStr as nvarchar(max) set @SqlStr=N'Merge Into [Categories] t USING(VALUES (9,''rice'','' ...
- 【最长下降子序列的长度和个数】 poj 1952
转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size] ...
- FRAM 铁电存储器
铁电存储器与传统存储器的区别. 一:易失性的存储器包括静态存储器SRAM和动态存储器DRAM. 优点:读写速度快,读写寿命无次数限止. 缺点:掉电会丢失数据. ...
- 一个经典的PHP验证码类分享
我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现 的细节封装在该类中.只要在创建对象时,为构造方法提供三 ...