我正在开发用于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即使在之前的错误的情况下也会运行?
编辑:由于他们是由其他作者撰写并随意混合,因此我无法控制/了解容易出错的块。
答案 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>