<html>
<head>
<script>
var app = function()
{
var obj = document.getElementById("mypp");
obj.attachEvent("onclick",foo1);
obj.attachEvent("onclick",foo2);
}
var foo1 = function()
{
alert("clicked!");
};
var foo2 = function()
{
alert("also clicked!");
};
</script>
</head>
<body onload="app()">
<p id="mypp">test</p>
</body>
</html>
|
先出现also clicked!的,个人认为obj.attachEvent应该是栈结构的缘故,后进先出 听某牛人说过,.net中的事件不一定按绑定的顺序发生, 事件激发的顺序不可控, 但是具体的原因未说明, 不知道在js是否也是这样子滴~~~ 这一个的确是先执行also clicked!,不过,微软说这个执行顺序是随机的,所以不要依赖这个顺序哪怕你是测试过的! 其实事件附加类似于集合操作,每附加一个事件都会往集合里加一条数据,可以添加,但集合是没有办法保证顺序的,虽然每次的顺序可能差不多,但既然他不肯保证,你也就不能依赖,你试下下面这个就知道了,完全没谱: <html> <head> <script> var app = function() { var obj = document.getElementById("mypp"); obj.attachEvent("onclick",foo1); obj.attachEvent("onclick",foo2); obj.attachEvent("onclick",foo3); obj.attachEvent("onclick",foo4); obj.attachEvent("onclick",foo5); obj.attachEvent("onclick",foo6); obj.attachEvent("onclick",foo7); } var foo1 = function(){alert("1");}; var foo2 = function(){alert("2");}; var foo3 = function(){alert("3");}; var foo4 = function(){alert("4");}; var foo5 = function(){alert("5");}; var foo6 = function(){alert("6");}; var foo7 = function(){alert("7");}; </script> </head> <body onload="app()"> <p id="mypp">test</p> </body> </html> |
|
1个月前 丁学 : to BlackPhoenix: obj.attachEvent是集合,不是栈,所以不一定后进先出,呵呵,顺序取决于集合的算法,这个我就不知道了,不知道是不是公开的 to 沙加: 事件激发的顺序不可控是因为.net里的事件附加也是用的集合,集合的排序方式未知,所以说是不可控,其实我觉得微软应该公开这个事件集合的排序方法好让大家重写,毕竟有时候是需要这个的 |