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

我开发WordPress的插件。 它在用户端(主题)中使用一些jquery作为jQuery插件。 问题是,当其他的插件由其他插件的JavaScript错误,我的插件的JavaScript无法执行。

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

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

在这里输入图像说明

试试:

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

这就是说,如果你可以在bug的脚本执行之前包含这个。

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

把你的JavaScript文件/代码放在最前面(在JS出错之前),然后在JavaScript受其他JavaScript代码影响之前调用它。

如果你需要在运行时处理JavaScriptexception,最好的select是

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

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

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

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

应该指出,这可能不是一个很好的解决您的问题。 这可能是你的插件干扰其他插件。 当然,错误可能不是你自己的错,但一般来说(与公开发布的插件)并非如此。

我遇到了同样的问题:即使你是一个很好的公民,也有很多插件会造成太多的假设,导致页面上的JavaScript错误; 这些错误与你的插件没有任何关系。

尝试处理其他插件中的错误是没有意义的 – 海事组织最好是自包含的,但对其错误具有弹性。

在我的情况下,错误是停止jQuery的DOM准备事件,我的JavaScript的init代码没有得到执行。 错误的确切forms并不重要 – 解决scheme只是触发多个事件。

我的解决scheme是除了依靠jQuery DOM就绪事件之外还有一些回退:

  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断开而触发,超时将在页面加载完成后立即触发。

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

这已经在一堆客户端网站与其他一些破碎的插件工作。

希望这可以帮助。

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

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

或使用:

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

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

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

可能的解决方法:

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

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

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

把你的电话插入

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