循环事件绑定和原型的应用

一、循环事件绑定:

<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ul>
<script>
var node = document.querySelectorAll(‘ul li‘);
for(var i = 0, len = node.length; i < len; i++){
    node[i].addEventListener(‘click‘,function(){
        alert(‘click‘ + i);
    })
}
</script>

  这样绑定能否成功呢?发现不能,每次点击都会是5,因为触发事件的时候循环已经完了。其本质就是js没有局部作用域的概念,那么如何实现呢?

  1、采用闭包:

var node = document.querySelectorAll(‘ul li‘);
for(var i = 0, len = node.length; i < len; i++){
    (function(node,index){
        node.addEventListener(‘click‘,function(){
            alert(‘click‘ + index);
        })
    })(node[i],i);
}

  2、采用新增索引值,对初学者更好理解一些

var node = document.querySelectorAll(‘ul li‘);
for(var i = 0, len = node.length; i < len; i++){
    node[i].index = i;//新增属性值
    node[i].onclick = function(){
        alert(‘click‘ + this.index);
    }
}

  3、采用new关键字

var node = document.querySelectorAll(‘ul li‘);
function Fn(num){
    this.fn = function(){
        alert(‘click‘ + num);
    }
}
for(var i = 0, len = node.length; i < len; i++){
    var f = new Fn(i);
    node[i].onclick = f.fn;
}

  4、采用ES5的forEach()方法

var node = document.querySelectorAll(‘ul li‘);
//注:NodeList.prototype.forEach并非所有浏览器都支持,所以在IE需要slice把node形成一个真正的数组
[].slice.call(node).forEach(function(node,index){
    node.addEventListener(‘click‘,function(){
        alert(‘click‘ + index);
    })
})

  5、采用ES6块级作用域变量声明let

var node = document.querySelectorAll(‘ul li‘);
for(let i = 0, len = node.length; i < len; i++){
    node[i].addEventListener(‘click‘,function(){
        alert(‘click‘ + i);
    })
}

  6、思考:如果列表项达到100项或者更多怎么办呢?

  采用事件代理。

二、原型的应用:

function clone(obj){
    //实现下面的结果,去补全clone函数
}
var a = {name:‘a‘};
var b = clone(a);
console.log(b.name);//a
a.name = ‘a1‘;
console.log(b.name);//a1
b.name = ‘b‘;
console.log(a.name);//a1
a.name = ‘a2‘;
console.log(b.name);//b

  其实说到底就是原型的应用的问题:

function clone(obj){
    return Object.create(obj);//返回一个对象,其原型为参数obj对象
}

  1、2呢,就是b对象里面无name属性,所以需要往原型链上查找,那么就取的都是原型a上的name属性;

  3、4呢,当b对象有了自己的name属性,查找就查找自身找到name属性就不会往原型上去查找了。

  Object.create方法就是类似于下面代码:

function clone(obj){
    var ret = {};
    ret.__proto__ = obj;//ret对象的原型指向obj
    return ret;
}

  但是__proto__并不是规范,避免使用。所以对于低本版,下面代码比较好

function clone(obj){
    function Noop(){};//创建一个空构造函数,函数原型指向obj
    Noop.prototype = obj;
    return new Noop;//返回对象的一个实例,完成原型的继承
}
时间: 2024-07-29 04:56:24

循环事件绑定和原型的应用的相关文章

js中用for循环事件绑定的小问题

在js中,如果用for循环进行事件绑定,可能会遇到一点小问题,看下面第一个示例,无论点击哪个div,都会弹出3,即length. 因为这相当于事件绑定的同时,并没有把所对应的i进行一起绑定,i的值是最后一个值,即3. 示例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport"

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

JavaScript事件绑定

浏览器事件概述 技术一般水平有限,有什么错的地方,望大家指正. 当我们在浏览网页的时候,浏览器可以在视觉上为我们展示出页面还可以在行为上响应用户的操作,浏览器响应用户的操作就是通过事件来完成的,浏览器提供了事件注册接口和事件监听接口这样浏览器就可以接收用户的行为并且进行处理了.浏览器已经提供很多的事件包括页面加载.鼠标事件以及键盘事件等,我们只需要定义好事件处理函数即可,当用户的操作触发这些事件时就会执行我们预先定义好的处理函数.一个行为的完整过程如下: 浏览器在交互的过程中基本的功能就是通过事

JQuery实现click事件绑定与触发方法分析

原生JS通过什么方法绑定click事件? 原生js有一下三种方法为DOM对象绑定click事件, 第一种,在html中添加 onclick属性,在此属性中添加要绑定的事件函数,如下, 这种方法为html处理事件的原始方法,使得html和js过分耦合, 即表现层代码 和 行为层代码耦合: <html> <head> <script src="./jquery.js"></script> </head> <body>

JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE

转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4864367.html ● 事件分为三个阶段:   事件捕获 -->  事件目标 -->  事件冒泡 ● 事件捕获:事件发生时(onclick,onmouseover--)首先发生在document上,然后依次传递给body.……最后到达目的节点(即事件目标). ● 事件冒泡:事件到达事件目标之后不会结束,会逐层向上冒泡,直至document对象,跟事件捕获相反 1.onlick -->事件冒泡,

DICOM:再次剖析fo-dicom中DicomService的自定义事件绑定

题记: 趁着<从0到1>大火的热潮,近期重新翻阅了一遍<从一到无穷大>(这样是不是感觉整个非负数轴就圆满了^_^).虽然作为科普类书籍,但是里面的内容还是比较深奥,幸亏有作者精准的翻译,一番细细品味后犹如醍醐灌顶,心中透亮. 一直幻想有外星人.宇宙外生物的存在,从<源代码>描述的"平行世界",到<星际穿越>的"超维空间",再到时下泛滥的穿越剧,却总未解开心中那团疑惑.或许只有时间的流逝才能给我解答,只怕光阴荏苒,时不我

DICOM:再次剖析fo-dicom中DicomService的自己定义事件绑定

题记: 趁着<从0到1>大火的热潮,最近又一次翻阅了一遍<从一到无穷大>(这样是不是感觉整个非负数轴就圆满了^_^). 尽管作为科普类书籍.可是里面的内容还是比較深奥,幸亏有作者精准的翻译,一番细细品味后宛如醍醐灌顶,心中透亮. 一直幻想有外星人.宇宙外生物的存在,从<源代码>描写叙述的"平行世界",到<星际穿越>的"超维空间",再到时下泛滥的穿越剧,却总未解开心中那团疑惑. 也许仅仅有时间的流逝才干给我解答,仅仅怕光

js立即执行函数应用--事件绑定

js中立即执行函数的应用:应用到事件绑定上. 少说多做,直接运行代码(代码中有注释): 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta http-equiv="X-UA-Compatible" content="ie=edge" /> 6 <titl

事件绑定和阻止默认事件

5月29,30日 终于到了这一天.晚上有数据结构课,10点多的火车,我们就没有去上课,下午在宿舍里收拾东西,晚上8点左右从南校出发,9点半多到达火车站和老师学长学姐们会和. 第一次去北京,第一次买的卧铺,真的很兴奋.对这次北京之行满满的都是期待.卧铺,躺在上面很舒服,因为第一次,不知道还需要换票,就把票放在包里了,找了一会才找到,看来还是得把票随身带着.卧铺晚上熄灯,我看了一部电影,然后就睡着了,一觉睡到五点多.上午看了看模板,这次蓝桥杯决赛说实话没有怎么认真的准备,做的题也比较少.把一些小的知