忽略页面中的javascript语法错误并继续执行脚本

时间:2012-08-31 16:20:13

标签: javascript jquery html wordpress plugins

我为WordPress开发插件。它使用用户端(主题)中的一些jquery作为jquery插件。 问题是,当其他autors制作的其他插件出现javascript错误时,我的插件的javascript无法执行。

最糟糕的是,人们认为我的插件存在严重错误,即使它在处理条件语句时处理100%正常。但这实际上是由于其他一些WP插件/主题作者的一些其他javascript语法错误。

有没有办法继续执行我的插件JS忽略其他JS错误。或者我可以有建议来处理这个问题吗?

enter image description here

11 个答案:

答案 0 :(得分:23)

尝试:

window.onerror = function(){
   return true;
}

如果您可以在执行错误脚本之前包含此内容。

答案 1 :(得分:8)

你应该纠正旧的JavaScript错误,因为它可能会产生很多问题,不是现在,而是下次。

将您的JavaScript文件/代码放在顶部(在JS出错之前),并在JavaScript受其他JavaScript代码影响之前调用它。

如果您在运行时需要处理JavaScript异常,最好的选择是

try { /* run js code */ } 
    catch (error){ /* resolve the issue or bug */ }

答案 2 :(得分:4)

您应该可以使用error事件吞下任何错误:

$(window).error(function(e){
    e.preventDefault();
});

我从来没有尝试过这个,但它应该在理论上起作用。

应该注意的是,这可能不是解决您问题的好方法。可能是你的插件干扰了其他插件。当然,错误可能不属于您自己的错误,但一般来说(使用公开发布的插件)并非如此。

答案 3 :(得分:4)

我遇到了同样的问题:有很多插件在你的页面上做了太多的假设并导致JavaScript错误,即使你是一个好公民;这些错误与您的插件无关。

试图处理其他插件中的错误是没有意义的 - IMO最好是自包含但能够适应他们的错误。

就我而言,错误是暂停jquery DOM ready事件,我的JavaScript init代码没有被执行。但错误的确切形式并不重要 - 解决方案只是触发多个事件。

对我来说,解决方案除了依赖jQuery DOM ready事件外还要有后备:

  1. 我将想要触发DOM准备事件的任何代码包装到他们自己的函数中 - 例如my_hardened_init_action();
  2. 我添加了一个只运行一次的函数my_hardened_init()。它在第一次调用时调用my_hardened_init_action(),并且在后续调用中不执行任何操作。
  3. 我添加了各种方法来调用WordPress页脚中的my_hardened_init()。就我而言,我只需要两个。首先,尝试通常的jQuery DOM init,但又回到简单的setTimeout()。因此,如果jQuery DOM init从未因JavaScript损坏而触发,则超时将在页面加载完成后不久触发。
  4. 您可以添加多个其他回退 - 如果需要,甚至可以将代码添加到标题中。由于my_hardened_init()只运行一次,您可以尝试多次尝试触发它。

    这已经在一堆客户端站点上运行,其中包含一系列其他破坏的插件。

    希望这有帮助。

答案 4 :(得分:2)

答案 5 :(得分:1)

如果您的页面正在运行。使用:

$(window).error(function(e){
        e.preventDefault();
});  // IGNORE ALL ERROR JQUERY!

或使用:

window.onerror = function(){
   return true;
}  // IGNORE ALL ERROR JAVASCRIPT!

答案 6 :(得分:1)

<script>
var _z = console;
Object.defineProperty(window, 'console', {
    get: function(){
        if (_z._commandLineAPI) {
         return true;   
        }
        return _z;
    },
    set: function(val) {
        _z = val;
    }
});
</script>

答案 7 :(得分:0)

常规try catch语句不适用于这些类型的错误。

可能的解决方法:

使用inline-css将条形图浮动到左边而不是jQuery(我不确定你的插件的全部功能是什么,但是如果它只是将条形图向左浮动,为什么不只是使用css?)

有一个不可见的iframe尝试在父页面上运行一些代码。如果它失败了,则提醒用户(在这个iframe中),这不是你的错:)

答案 8 :(得分:0)

也许你可以尝试将你的js放在一个html对象中,这样它就可以在一个单独的页面中执行。如果主页面上的js不会与对象进行交互,那可能无济于事。只是可以玩的东西。

答案 9 :(得分:0)

中调用插件
try{
  ......
}
catch(e){

}

答案 10 :(得分:0)

这对我有用:

try{
    //your code
}
catch(error)
{
    return true;
}