作者TonyQ (^^)
看板Ajax
标题Re: [问题] jquery子元素继承问题
时间Sun Dec 6 15:48:03 2009
※ 引述《etman395 (技术时代)》之铭言:
: 或许我不该擅自决定那样的事件补获叫做继承吧
: 就书上所讲事件往子元素传递那样叫事件补获
: 而你说的情形是事件冒泡
: 必须要子元素和父元素都绑定同样的事才会触发
: 就是子元素li click之後连带父元素的ul click事件也触发
我一开始就想回 ,
只是你的问题我看不太出来你想要做什麽所以就搁着了.
其实这个事件真的没有这麽复杂 ,
不需要特地区分为向下的捕获或向上的 bubble ,
这只是混淆自己认知而已...
总的来说 , 这其实都只有向上的传递 , 也就是所谓 bubble 效果 .
只是 , bubble 的主角是谁的问题 , 这会牵扯到为什麽你要怎麽解决.
让我们先把层级拉出来
(sorry , 我现在比较懒得写完整的html code ,
底下是示意有看不懂的要说 ,
我先假设读者有基本html / jQuery event能力....)
先假设是这样
body{
div{
ul{
li{
}
}
}
}
假设是这样的层级好了 .
今天的 bubble 的意思是说 , 我今天从哪个元素触发( trigger ) ,
它会一路往上触发他的对应元素的父元件对应的事件 .
所以以你的命题 ul 来说 , 假设他定义了
click(function(){
alert("hi i am ul ");
});
这时候如果你去点击(click) ul , 这时候他理所当然会跑出 hi i am ul ,
那你的问题就是你现在点的明明就是 li , 为什麽也会出现 "hi i am ul" .
这很简单啊 , 因为 li.click -> ul.click -> div.click -> body.click
这就是起点由li 开始的bubble 现象...
我们说 ul.click(function(e){
e.stopPropagation(); //直接复制的,平常都直接写false...
e.preventDefault();
//or return false;
});
这是说 他的流程会从 li.click -> ul.click -\->
因为被阻止了 , 他的讯息不会再往上传.
但是这对 li.click 上来想阻止他传给ul.click 的事件是无效 ,
因为根本就没挡对...... XD .
所以你的问题在於说 ,
你只有某特定元素(ex. ul)被点击的时候 , 你才想执行 ,
而且你认为只有 trigger 对象直接是指到该元素 ,
而不是该元素的子元素(ex. li)时才进行事件的处理.
所谓event.target 指的是真正被点到的那个直接元素 ,
如果是 li被 click , event.target 就是 li ,
if( li == this ){
// this是看event是由谁bind 就是谁 , 在这例子是ul
//所以等同於 if(li==ul){}
//do the thing you want
}
所以在这样的状况下 , 当然只有 ul 被click 有效 .
其实严格来说还有另一个後遗症会比较多的解法 .
$("ul *").click(function(){
return false;
});
(窃笑)
至於为什麽这样能解按照上面的逻辑应该是想的出来,
所谓的後遗症就是 <a> 这类靠click的事件完全都会被挡掉.
--
哦附带一题 , <a> 的转换网址事件是排在onclick之後的 ,
转换网址这个行为 , 其实也是 bubble 的效果.
--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.156.164
※ 编辑: TonyQ 来自: 220.136.156.164 (12/06 15:50)
※ 编辑: TonyQ 来自: 220.136.156.164 (12/06 15:52)
1F:→ TonyQ:再题外话 , 这也是 #1B4D_Val 这篇提到live event的处理方案 12/06 15:57
2F:推 adahsu:其实我那个范例就是想示范这个单纯的 bubble 效果而以 (茶) 12/06 20:05
3F:→ adahsu:刻意把 list2 加上 margin 是因为这样才容易点到 UL 元素 12/06 20:06
4F:推 etman395:谢谢二位前辈的回答:D 12/06 20:41