结合DOM0和DOM2事件处理程序 - 在DOM0处理程序中取消可能的事件?

时间:2010-04-01 16:45:04

标签: javascript javascript-events lazy-loading

请考虑以下问题:

(1)您已为DOM元素分配了内联事件处理程序,如<a id="link1" href="..." onclick=" ... ´"&gt;

(2)您还将一个或多个其他事件处理程序分配给具有DOM2或IE特定分配机制的link1的onclick事件。

FF3.019和IE7中验证的行为是:在(1)中分配的处理程序在(2)中分配的所有处理程序之前执行。这很好(所以,可能没有写入石头......)。但是让我们暂时依赖这种行为。

现在问题:是否可以取消将click事件冒泡到(2)WITHIN中分配的处理程序中(1)中指定的处理程序?

在您尖叫之前:当然,为什么不,请看以下内容: 假设您分配onclick =“if(ready1)返回true;否则返回loading(事件);”到link1并定义加载

function loading(e) {
    // alert("Still loading functionality - sorry, slow line perhaps...");
    // no propagation
    if( e.stopPropagation ) { e.stopPropagation(); }
    e.cancelBubble = true;
    return false; // Cancel default handling
}

在上面的一些脚本标签中。这不会阻止(2)中指定的处理程序的传播(在FF3.019和IE中都不会)。

任何暗示都表示赞赏!提前谢谢!

Jannico

上下文(或:我为什么要这样做?):

A)懒惰/延迟加载javascript以快速重新录制内容 - &GT;你想通知用户一些功能仍在加载(而不是简单地禁用一个UI元素,这不是真正用户友好的 - 为什么这个按钮被禁用???)。您还希望使用已经嵌入到页面中的最小javascript,因为首先使用附加请求加载javascript库会使某些目的失败(否则您当然可以使用允许事件注册的实现机制之一来保证执行顺序(您需要B,见下文)

和B)你还想在一个“原子”时间点“设置野兽自由”,即:你不希望被迫集成/改变在(2)中分配的所有处理程序等待对于某种信号“现在你被允许工作因为一切都被加载了”,你只想把这个信号发送到事件处理链的头部(在(1)中分配的处理程序),然后它就可以简单地开始传播任何可能发生的事件(否则,可能会发生对用户输入的部分反应,因为某些功能已经附加而其他功能没有 - 这可能比什么都不做更糟糕;)

1 个答案:

答案 0 :(得分:0)

简短回答:不。

答案很长:您可以使用第一个处理程序来设置第二个(和后续)处理程序检查的变量。这是一个简单的例子

<div id="outer">
  <a id="link1" href="#" onclick="return loading();">test</a>
</div>

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>
<script type="text/javascript">

var passCheck = false;

setTimeout( function()
{
  passCheck = true;
}, 5000 );

function loading()
{
  alert( 'a#link1 was clicked!' );
  return false;
}

$(function()
{
  $('#link1').click( function( event )
  {
    if ( !passCheck )
    {
      event.stopPropagation();
    }
  });

  $('#outer').click( function( event )
  {
    alert( 'div#outer was clicked!' );
  });
});

</script>

尽管如此,这一切都让人非常讨厌。感觉你应该使用一些完成回调,或者应用一些continuation passing style