当前位置:嗨网首页>书籍在线阅读

30-讨论

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.7.3 讨论

1.例子

简单表单验证stopImmediatePropagation() 在某种条件不符合的情况下可以撤销实际的提交绑定:

jQuery('form')
   .submit(function(e){
     e.preventDefault(); // Don't submit for real
     if( jQuery('#field').val() == '' )
       e.stopImmediatePropagation();
   })
   .submit(function(e){
     //只在上面的函数不调用e.stopImmediatePropagation时执行
   });

终止所有事件stopImmediatePropagation() 还可以用于暂时禁用元素或者阻塞容器:

(function($){
function checkEnabled(e){
   if( jQuery(this).is('.disabled') ){
     e.stopImmediatePropagation(); // Stop all handlers
     e.preventDefault();
   }
};
jQuery.fn.buttonize = function(){
   return this.css('cursor','pointer')
         .bind('click mousedown mouseup',checkEnabled};
};
})(jQuery);

2.这种方法的缺点

虽然这一新功能在某些情况下可以救急,但是你必须知道,以这种行为为基础来构建逻辑并不总是安全的。当依赖这种功能时,假定处理程序以预期的方式执行,没有其他处理程序会妨碍这种执行。

虽然jQuery绑定的事件运行顺序与它们添加的顺序一样,但是API对此并没有强大的支持,这意味着在某些浏览器或者特殊的情况下执行可能失败。来自不同插件的绑定也可能发生冲突,因为某个插件可能调用 stopImmediatePropagation() ,其他插件中绑定的方法就无法执行。这可能导致需要花费很长时间调试的意外问题。

结论是,如果 stopImmediatePropagation() 确实适用于你的问题,不要担心使用它,但是使用它必须谨慎,并且要符合所有涉及的事件处理程序。

在如下情况下,你应该再三考虑是否使用这种方法:

  • 监听器是一个已经被其他插件使用的“流行”DOM元素。
  • 事件是 click 或者 ready 之类的常见事件。冲突的可能性更大。

另一方面,在如下情况下使用 stopImmediatePropagation() 相当安全:

  • 监听器是动态创建的DOM元素,很少被插件使用。
  • 事件是 change-color 或者 addUser 等自定义事件。
  • 你希望有意地停止任何绑定的处理程序(和第2个例子中类似)。