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

时间:2009-12-11 20:02:47

标签: javascript jquery

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

<script type="text/javascript">
    jQuery(document).ready(function() {
        nosuchobject.fakemethod();       //intentionally cause major error
    });
</script>
<script type="text/javascript">
    jQuery(document).ready(function() {
        alert("Hello!");                 //never executed
    });
</script>

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

编辑:由于他们是由其他作者撰写并随意混合,因此我无法控制/了解容易出错的块。

5 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:2)

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

<script type="text/javascript">
  jQuery(document).ready(function() {
      nosuchobject.fakemethod();       //intentionally cause major error
      alert("Hello!");                 //never executed
  });
</script>

这就是为什么它没有警告上面的错误。我不相信有办法解决这个问题,无论以前的失败如何,每个ready函数都会运行。

答案 2 :(得分:1)

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

$(function(){
    try {
        noObject.noMethod();
    } catch (error) {
        // handle error
    }
});

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

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

相同

答案 3 :(得分:1)

这是解决方案,它将使用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);

答案 4 :(得分:-2)

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

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            nosuchobject.fakemethod();       //intentionally cause major error
        });
    </script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>    
    <script type="text/javascript">
        jQuery(document).ready(function() {
            alert("Hello!");                 //executed!
        });
    </script>   

</head>
<body>

<p>hello world</p>

</body>
</html>