52

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

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

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

在此处输入图像描述

4

11 回答 11

25

尝试 :

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

也就是说,如果您可以在执行错误脚本之前包含它。

于 2012-09-17T14:07:01.730 回答
8

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

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

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

try { /* run js code */ } 
    catch (error){ /* resolve the issue or bug */ }
于 2012-08-31T16:28:12.730 回答
4

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

尝试处理其他插件中的错误是没有意义的——IMO 最好是独立的,但对它们的错误有弹性。

就我而言,错误正在停止 jquery DOM 就绪事件,并且我的 JavaScript 初始化代码没有被执行。不过,错误的确切形式并不重要——解决方案就是触发多个事件。

对我来说,解决方案是除了依赖 jQuery DOM 就绪事件之外还有后备:

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

您可以添加多个其他后备 - 如果需要,甚至可以将代码添加到标题中。由于 my_hardened_init() 只运行一次,您可以尝试多次触发它。

这已经在带有一系列其他损坏插件的客户端站点上起作用。

希望这可以帮助。

于 2012-12-31T07:10:30.347 回答
4

您应该能够使用该error事件吞下任何错误:

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

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

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

于 2012-08-31T16:52:02.090 回答
2

怎么样window.onerror

https://developer.mozilla.org/en-US/docs/DOM/window.onerror

于 2012-09-11T01:52:56.633 回答
1
<script>
var _z = console;
Object.defineProperty(window, 'console', {
    get: function(){
        if (_z._commandLineAPI) {
         return true;   
        }
        return _z;
    },
    set: function(val) {
        _z = val;
    }
});
</script>
于 2014-08-11T12:53:02.807 回答
1

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

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

或使用:

window.onerror = function(){
   return true;
}  // IGNORE ALL ERROR JAVASCRIPT!
于 2014-07-28T16:28:01.433 回答
0

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

可能的解决方法:

使用 inline-css 将栏浮动到左侧而不是 jQuery(我不确定您的插件的完整功能是什么,但如果它只是将栏浮动到左侧,为什么不使用 css?)

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

于 2012-09-11T00:40:44.247 回答
0

也许您可以尝试将您的 js 放在一个 html 对象中,以便在单独的页面中执行它。如果主页上的 js 不会运行以与对象交互,那可能不会有太大帮助。只是可以玩的东西。

于 2012-09-18T20:38:44.817 回答
0

将您对插件的调用放入

try{
  ......
}
catch(e){

}
于 2012-09-22T04:22:10.560 回答
0

这对我有用:

try{
    //your code
}
catch(error)
{
    return true;
}
于 2018-01-20T10:09:24.220 回答