【问题标题】:Ignore javascript syntax errors in a page and continue executing the script忽略页面中的 javascript 语法错误并继续执行脚本
【发布时间】:2012-08-26 11:54:53
【问题描述】:

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

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

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

【问题讨论】:

  • 你希望,但总有 try/catch ??
  • 你抓不到不属于你的东西。
  • @raina77ow - 你应该制作以开发者为主题的幸运饼干。
  • @raina77ow - 你说得对,哈哈!但如果你的插件有冲突,通常是你做的。
  • 大多数错误出现在ready 事件中,我的建议是使用您自己的$(function() { 等效项,以便您的回调能够正常工作

标签: javascript jquery html wordpress plugins


【解决方案1】:

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

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

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

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

【讨论】:

  • 其实是其他作者的js文件造成的。所以我不知道如何尝试捕捉它,并且在WP中有很多插件,一开始很难让我的插件加载。
  • 不要在生产中使用“try catch”块,因为它不被推荐,也没有得到广泛的支持。
【解决方案2】:

您应该能够使用error 事件处理任何错误:

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

我从未尝试过,但理论上应该可行。

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

【讨论】:

【解决方案3】:

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

可能的解决方法:

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

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

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

      试试:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 不太清楚你想说什么。你能改写一下,让它更清楚吗?
        • 对不起,我有一些 html 搞砸了帖子。
        【解决方案7】:

        把你对插件的调用放在

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

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题:有很多插件会做出过多的假设并在您的页面上导致 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 init 由于 JavaScript 损坏而从未触发,则超时将在页面完成加载后不久触发。

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

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

          希望这会有所帮助。

          【讨论】:

            【解决方案9】:

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

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

            或使用:

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

            【讨论】:

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

              【讨论】:

                【解决方案11】:

                这对我有用:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-03-12
                  • 1970-01-01
                  • 2013-03-13
                  • 2019-04-10
                  • 2011-08-22
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多