整 理:zhangyue 日 期:2017.1.6 说 明:关于js的this和事件冒泡等的部分总结
一 Js中this和Jquery中$(this)的区别
1.1 两者是不同的对象
$(this) :jquery对象
this:dom对象
1.2 dom对象和jquery对象的转换:
$(this)[0] == this; var $argument=$("#argument"); //jquery对象 var argument = $argument[0]; //dom对象 也可写成 var argument=$argument.get(0); var argument=document.getElementById("argument"); //dom对象 var $argument = $(argument); //转换成jquery对象
二 Js事件冒泡和事件委托
事件冒泡:子级元素的某个事件被触发,它的上级元素的该事件也被递归执行
事件委托:将子级元素的事件绑定在父级元素上;
对于动态生成的Dom元素,其事件绑定有两种方式:第一种,是在dom元素后生成的地方添加相应的绑定事件;第二种,将事件绑定在已经存在的父元素dom节点上。如果一开始就对该元素进行绑定事件,而该元素动态添加后,是不能够响应改绑定事件的。
//js 部分 createSonDom(); //第一种方式 $("#son").click(function(){ alert('son'); }); //第二种方式 事件委托 $("#parent").on('click', '#son', function() { alert('son'); }); function createSonDom() { var tmp = []; tmp.push(''); $("#parent").append(tmp); //第三种方式 $("#son").click(function(){ alert('son'); }); } 第一种方式对于son元素无法响应,第二种可行,第三种可行。第三种存在缺陷,可能会导致事件多次响应
三 Js中this和event对比
js中事件是会冒泡的,所以this是可以变化的,
event.target不会变化,它永远是直接接受事件的目标DOM元素;
$(this)和event.currentTarget永远指向监听该事件发生的DOM元素;
event.target则是那个被点击的DOM元素.
四 使用this的冒泡问题解决
4.1 第一种:事件委托,不把事件绑定在自身元素上
4.2 off(),解除绑定事件,之后在进行绑定
$(this).off('click').on('click', function(){ alert('off'); });
4.2 使用event.stopPropagation()
能阻止父元素的click事件函数执行,但不阻止当前元素同时绑定的其它click事件函数执行
ps:event.preventDefault() 不组织冒泡事件,阻止默认行为
$('#son').on('click', function(event){ $(event.target).stopPropagation();//阻止事件冒泡 });