点击冒泡的问题 不行onmouseup跟click根本不同onmouseup的话什么地方点只要拖到外面div松开就触发了,更不行 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我要的效果是只有mousedown和mouseup都在外面div时才触发onclick就是ff那样 提供一个思路,把onclick拆成两个,而只有当up和down都起作用在外层时才做你要做的事情<script>var sff=false;</script><div style="width:100px; height:100px; background-color:#CCC;" onmousedown="sff=true;" onmouseup="if(sff)alert(1);sff=false;" ><div style="width:50px; height:50px; background-color:#C11;" onmousedown="sff=false;event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);" onmouseup="sff=false;event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);"></div></div> 看看这个http://fasterwind.spaces.live.com/Blog/cns!D3B9A037EF9FF2CF!480.entryIE跟其他浏览器的事件机制是不太一样的 这种方式我这里也有一个有没有更好的解决方法最好是不用修改原来的onclick不然就麻烦了 是触发的顺序不一样.句柄按照从外向里的顺序加载.我也弄了个土办法 up和down共同控制click<div style="width:100px; height:100px; background-color:#CCC;" id="overdiv" ><div style="width:50px; height:50px; background-color:#C11;" onclick="event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);"></div></div><script>function Action(){this.dclick=0;this.onClick=function(ev){if(!this.dclick){alert(111)}}this.onMouseDown=function(ev){ ev =ev || window.event; var target = ev.target || ev.srcElement; if(target.id=="overdiv"){this.dclick=1;}else{this.dclick=0;}}this.onMouseUp=function(ev){ ev =ev || window.event; var target = ev.target || ev.srcElement; if(target.id=="overdiv"){this.dclick=!this.dclick;}}}try{var ac=new Action();}catch(e){alert(e.description)}(function(){var od=document.getElementById("overdiv");od.onclick=new Function ("return ac.onClick();")od.onmousedown=new Function ("return ac.onMouseDown();");od.onmouseup=new Function ("return ac.onMouseUp();") ;})()</script> 是鼠标捕获问题...就是说你触发div的onmousedown后,div并没有鼠标捕获,所以你即使没有释放鼠标移动到div外,这时div没有鼠标捕获,鼠标就和它"没关系"了,所以它会触发外面的mouseup等...原先不是说ff等默认鼠标捕获,而IE要手动一下么...所以只要手动加上鼠标捕获即可...方法如下...<body onclick="alert(2)"><div style="width:100px; height:100px; background-color:#CCC;" onclick="alert(1)" ><div style="width:50px; height:50px; background-color:#C11;" onmouseup="this.onlosecapture()" onmousedown="var wc = this;this.setCapture();this.onlosecapture=function(){wc.onlosecapture=null;wc.releaseCapture();}" onclick="this.onlosecapture();event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);"></div></div></body> <div style="width:100px; height:100px; background-color:#CCC;" onmousemove="document.getElementById('t').innerHTML+='1';"><div style="width:50px; height:50px; background-color:#C11;" onmousemove="event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);"></div></div><div id="t"></div>但onmousemove就可以哦我觉得是ie的onclick的机制问题 onclick是两个事件的和onmousemove onmouseout onmouseover onmousedown onmouseup就只有一个事件。小弟估计onclick是依赖对onmousedown onmouseup两个句柄的监听。正如王好奇所说 而且捕获也解析不了从外面div拖到里面div也会触发onclick我觉得根本的问题是只要点击是在对象内部包括内部其他对象内完成就会触发onclick<div style="width:100px; height:100px; background-color:#CCC;" onclick="alert(1)" ><div style=" height:50px; background-color:#C11;" ></div><div style=" height:50px; background-color:#111;" ></div></div>像这段点上面div拖到下面div放即使完全碰不到外面的div仍然会触发 而ff就认为只有点和放都在同一个对象内完成才会触发onclick 那就点什么捕获什么...给document.onmousedown加一个对event.srcElement的鼠标捕获...即可.注意控制释放和兼容就好... 这样的话跟click就又不同了click虽然内部有问题但对于外部元素还是正常的这样一捕获就.... 呵呵 是吗研究研究而已其实我的问题已经解决了只是想找有没有更好的方法顺便研究一下onclick 哎,IE毛糙的处理onclick,认了吧 <div id=wrap> <div id=inner1> <div> <div id=inner2> <div></div>一次配对的mousedown/mouseup,构成一次click.所以:A---在inner1里mousedown/mouseup,会触发inner1的click,也会触发wrap的click,B---在inner1里mousedown,在inner2里mouseup,会触发wrap的click,但是却不会触发inner1或inner2里的click 而且捕获也解析不了从外面div拖到里面div也会触发onclick 我觉得根本的问题是只要点击是在对象内部包括内部其他对象内完成就会触发onclick 什么意思.刚没看清.貌似从外面down后挪近来释放默认就不会触发里面的click但是会触发up.这样很合理吧. 就是说ie认为点击的点和放可以在不同的元素而ff就认为点击的点和放只能在同一个元素内才有效 是的,ie特立独行,不过我觉得IE的处理更合理一点 呃.刚刚测了下...ff如果down和up不是一个对象,就会把所有的click事件处理掉...这个貌似是唯一的不同了...IE里从mouseup里写alert竟然可以河蟹掉所有的click,真的好神奇... 多级JSON的读取 JS 正則表達式匹配 为什么加了<span></span>就不起作用了 如何使鼠标移动到连接上时有ALT的效果? 请问高手,为什么我把网页编码改成UTF-8,原来得JS函数全都失效了 点击下一个问题,前一个问题自动收回 超简单的问题 非一般着急!!! 可以在父窗口的代码中访问弹出子窗口中的控件或数组(最好是数组)吗?~ 怎么实现?~~ 请高手不惜赐教! 小生不才~~! 请教一个Ext问题 求 一简单正则匹配
<div style="width:100px; height:100px; background-color:#CCC;" onmousedown="sff=true;" onmouseup="if(sff)alert(1);sff=false;" ><div style="width:50px; height:50px; background-color:#C11;" onmousedown="sff=false;event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);" onmouseup="sff=false;event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);">
</div></div>
http://fasterwind.spaces.live.com/Blog/cns!D3B9A037EF9FF2CF!480.entry
IE跟其他浏览器的事件机制是不太一样的
有没有更好的解决方法
最好是不用修改原来的onclick不然就麻烦了
句柄按照从外向里的顺序加载.
我也弄了个土办法 up和down共同控制click<div style="width:100px; height:100px; background-color:#CCC;" id="overdiv" ><div style="width:50px; height:50px; background-color:#C11;" onclick="event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);">
</div></div>
<script>function Action(){
this.dclick=0;
this.onClick=function(ev){
if(!this.dclick){alert(111)}
}
this.onMouseDown=function(ev){
ev =ev || window.event;
var target = ev.target || ev.srcElement;
if(target.id=="overdiv"){this.dclick=1;}else{this.dclick=0;}
}
this.onMouseUp=function(ev){
ev =ev || window.event;
var target = ev.target || ev.srcElement;
if(target.id=="overdiv"){this.dclick=!this.dclick;}
}
}
try{var ac=new Action();}catch(e){alert(e.description)}
(function(){
var od=document.getElementById("overdiv");
od.onclick=new Function ("return ac.onClick();")
od.onmousedown=new Function ("return ac.onMouseDown();");
od.onmouseup=new Function ("return ac.onMouseUp();") ;
})()
</script>
就是说你触发div的onmousedown后,div并没有鼠标捕获,所以你即使没有释放鼠标移动到div外,这时div没有鼠标捕获,鼠标就和它"没关系"了,所以它会触发外面的mouseup等...
原先不是说ff等默认鼠标捕获,而IE要手动一下么...
所以只要手动加上鼠标捕获即可...
方法如下...
<body onclick="alert(2)"><div style="width:100px; height:100px; background-color:#CCC;" onclick="alert(1)" ><div style="width:50px; height:50px; background-color:#C11;" onmouseup="this.onlosecapture()" onmousedown="var wc = this;this.setCapture();this.onlosecapture=function(){wc.onlosecapture=null;wc.releaseCapture();}" onclick="this.onlosecapture();event.stopPropagation?event.stopPropagation():(event.cancelBubble=true);">
</div></div>
</body>
</div></div><div id="t"></div>但onmousemove就可以哦
我觉得是ie的onclick的机制问题
小弟估计onclick是依赖对onmousedown onmouseup两个句柄的监听。
正如王好奇所说
我觉得根本的问题是只要点击是在对象内部包括内部其他对象内完成就会触发onclick
<div style="width:100px; height:100px; background-color:#CCC;" onclick="alert(1)" ><div style=" height:50px; background-color:#C11;" >
</div>
<div style=" height:50px; background-color:#111;" >
</div></div>像这段点上面div拖到下面div放即使完全碰不到外面的div仍然会触发
那就点什么捕获什么...
给document.onmousedown加一个对event.srcElement的鼠标捕获...即可.
注意控制释放和兼容就好...
这样的话跟click就又不同了
click虽然内部有问题但对于外部元素还是正常的
这样一捕获就....
呵呵 是吗
研究研究而已
其实我的问题已经解决了
只是想找有没有更好的方法
顺便研究一下onclick
<div id=inner1>
<div>
<div id=inner2>
<div>
</div>一次配对的mousedown/mouseup,构成一次click.
所以:
A---在inner1里mousedown/mouseup,会触发inner1的click,也会触发wrap的click,
B---在inner1里mousedown,在inner2里mouseup,会触发wrap的click,但是却不会触发inner1或inner2里的click
我觉得根本的问题是只要点击是在对象内部包括内部其他对象内完成就会触发onclick
什么意思.刚没看清.
貌似从外面down后挪近来释放默认就不会触发里面的click但是会触发up.
这样很合理吧.
而ff就认为点击的点和放只能在同一个元素内才有效
ff如果down和up不是一个对象,就会把所有的click事件处理掉...
这个貌似是唯一的不同了...IE里从mouseup里写alert竟然可以河蟹掉所有的click,真的好神奇...