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个例子中类似)。