作者sk1765 (鼎玉铉)
看板Ajax
标题(如何获取event物件)《Re: [ js ] 如何disable上一层的事件》吗?
时间Sat Aug 14 11:52:37 2010
1. return false 是用来停止default action的 并不能停止bubbling
正确的停止bubbling的程式码是
if (event.stopPropagation) event.stopPropagation();
event.cancelBubble=true;
2. 依据第二篇回文所述
→ knives:还有我是写onclick="ajaxget(url,ajaxid"),那里面还是写 07/26 16:53
→ knives: event.stopPropagation();吗,还是没有效果
onclick="ajaxget(url,ajaxid)" 为写在html中的
Inline event handlers(行内注册事件处理函式)
事件处理函式的注册方法共有三种
A.Inline event handlers(行内注册事件处理函式) :
最古老的将执行段加在html元素的属性中
B.Tranditional model(传统模式) :
在分离的javascript中为要引发事件的元件指名处理函式 如下片段
<a href="xx.html" id="xx">
var x = document.getElementById('xx');
x.onclick = eventhandler
eventhandler为一个function
C.Advanced model(进阶模式) : 分为W3C和Microsoft两类
W3C下: x.addEventListener('click',eventhandler,false);
Microsoft下: x.attachEvent('onclick',eventhandler);
(以上事件注册模式请参考ppk on javascript 7-c小节)
行内注册模式的等价传统模式程式码为
Lv2.onclick = function () { ajaxget(url,ajaxid); }
在html中 属性onclick = "xxxxxxx" 双括弧中的内文
相当於在传统模式的事件处理函式中了
因此我再尝试将你的问题重新描述一遍
<div id="Lv1">
<div id="Lv2" onclick="ajaxget(url,ajaxid)">
</div>
</div>
也就是我有一段行内注册的码 但是没办法获取event物件
因此不知该怎麽关掉他的bubbling
而错误的用了关闭default action的return false;
要解决这个问题必须分成两段思考
第一先把行内注册翻译成等价的传统模式 写好了传统模式 再把他反推回去
<div id="Lv1">
<div id="Lv2" onclick="ajaxget(url,ajaxid)">
</div>
</div>
相当於
Lv2.onclick = xx;
function xx() {
ajaxget(url,ajaxid);
}
我要如何在没有传参数的event handler中得到event物件呢
答案是 事实上他有传 在ie中无时无刻的window.event记载着event物件
而在W3C中虽然你的处理函式没有参数
但是W3C依旧有传 你可以用arguments[0]获取event物件
在传统模式只要把程式码改成
Lv2.onclick = xx;
function xx() {
var w3cevt=(!!arguments.length)&&arguments[0];
//用arguments.length判断是否有传参数 有的话arguments[0]就是event物件
var event = w3cevt || window.event ;
//如果没有那麽就是ie的window.event了
ajaxget(url,ajaxid);
//再加上停止bubbling的程式片段
if (event.stopPropagation) event.stopPropagation();
event.cancelBubble=true;
}
得到等价的传统模式程式码後 我们再把他回覆成行内注册模式
<div id="Lv1">
<div id="Lv2" onclick="
var w3cevt=(!!arguments.length)&&arguments[0];
var event = w3cevt || window.event;
ajaxget(url,ajaxid);
if (event.stopPropagation) event.stopPropagation();
event.cancelBubble=true;
">
</div>
</div>
以上 请问是否有了解
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.59.19.240
※ 编辑: sk1765 来自: 61.59.19.240 (08/14 11:54)
1F:推 s25g5d4:好...恐怖 高手如云的AJAX版 08/14 12:54
2F:推 s25g5d4:m文!收拉! (快推不然人家说我们看不懂 08/14 12:56
3F:→ grence:jQuery绑定的事件里 return false = 取消预设跟停止buble 08/14 14:11
4F:→ grence:然後,如果可以…还是不建议把事件写在 html里 08/14 14:12
5F:→ TonyQ:那是 jQuery 的自定义行为。:3 08/14 15:01