处理jQuery(document).ready中的错误

我正在开发用于Web框架的JS,并经常与其他开发人员(通常容易出错)的jQuery代码混合使用。 不幸的是,他们的jQuery(文档).ready块中的错误阻止了我的执行。 采取以下简单示例:

 jQuery(document).ready(function() { nosuchobject.fakemethod(); //intentionally cause major error });   jQuery(document).ready(function() { alert("Hello!"); //never executed });  

不管先前发生了什么,第二个就绪块不应该执行吗? 是否有一种“安全”的方式来运行jQuery(document).ready即使出现以前的错误也会运行?

编辑:我没有对容易出错的块的控制/可见性,因为它们是由其他作者编写的并且是任意混合的。

我没有尝试过这段代码,但它应该可行(至少,这个想法应该是这样)。 确保在jquery之后包含它,但是在任何可能有bug的脚本之前。 (没必要,请参阅评论。)

 var oldReady = jQuery.ready; jQuery.ready = function(){ try{ return oldReady.apply(this, arguments); }catch(e){ // handle e .... } }; 

为了回答你的问题,两个ready块基本上按照jQuery的工作方式组合成一个:

  

所以这就是为什么它没有警告上面的错误。 我不相信有一种方法可以解决这个问题,使每个readyfunction运行,无论以前的故障。

您是否尝试在try … catch括号中包含容易出错的命令?

 $(function(){ try { noObject.noMethod(); } catch (error) { // handle error } }); $(function(){ try { alert("Hello World"); } catch (error) { // handle error } }); 

为避免混淆, $(function(){ ... }); 在function上与$(document).ready(function(){ ... });

这是解决方案,它将使用try-catch块包装任何发送到ready的函数:

 (function($){ $.fn.oldReady = $.fn.ready; $.fn.ready = function(fn){ return $.fn.oldReady( function(){ try{ if(fn) fn.apply($,arguments); } catch(e){}} ); } })(jQuery); 

您可以在每个代码块之前重新引用jQuery。 然后,您的代码将使用库的新实例,并且它将执行。 我已经在OSX上的Safari 4.0.3中对此进行了测试。

         

hello world