【问题标题】:jQuery $(document).ready error blocking footer scriptjQuery $(document).ready 错误阻止页脚脚本
【发布时间】:2015-03-09 19:17:48
【问题描述】:

所以我遇到了一个独特的问题。

我有一个网站,我根本无法编辑模板,我只能更改嵌入的脚本。

这个嵌入的脚本被注入到相关网站的页脚中。

嵌入脚本依赖$(document).ready 启动。

问题是,页面上方的脚本会在其 $(document).ready 函数中引发错误,这会阻止我的 $(document).ready 被调用。

我尝试设置try .. catch 块,例如this,但我相信这只有在我的脚本仍然位于页面较高位置时才有效。

我的问题,是否可以让我的$(document).ready 调用运行,即使它在页面上较低,并且之前的调用有错误?

在我的脚本上方的站点中:

<script type="text/javascript">
  jQuery(document).ready(function($) {
    $('#logo').vAlign();
  });
</script>

.vAlign(); 未定义,因此它正在抛出:Uncaught TypeError: undefined is not a function

在我的嵌入式 js 中:

jQuery(document).ready(function() {
  console.log('ready!');
});

我从来没有看到“准备好!”在控制台中。

【问题讨论】:

  • 使用 finally 调用方法或函数(ready-function)作为 try-catch 的第三个代码块是可能的,因为无论抛出什么错误,finally-codeblock 总是会执行。
  • @Blauharley 您能否使用我上面的编辑详细说明如何在答案中使用它?
  • 或者你可以简单地使用(function() { ... })()代替jQuery(document).ready(function() { ... })

标签: javascript jquery html wordpress


【解决方案1】:

当必须始终执行重要操作时,可以使用 try-catch 的 finally-codeblock。即使 catch-codeblock 没有通过 finally-codeblock is 运行,所以 callReady-function 在最后肯定会被调用,无论是否有错误(除了语法错误)。如下所示:

<script language="JavaScript" src="https://code.jquery.com/jquery-1.11.2.js" type="text/javascript"></script>
<script type="text/javascript">

  try{
    jQuery(document).ready(function($) {
      $('#logo').vAlign();
    });
  }
  catch(e){
    console.log(e);
  }
  finally{
    // some fallback code might be executed here
    callReady();
  }


  jQuery(document).ready(callReady);

  function callReady(){
    console.log('ready!');
  }

</script>

不幸的是,如果没有错误 callReady 被调用了两次(因为 finally 总是在最后运行)但您可以检查这种情况:

<script type="text/javascript">

  var errorHappened = true;

  function checkForErrors(callback){

      callback();

      // when interpreter reaches this point no error with business-code is thrown
      errorHappened = false;

  }

  try{
    jQuery(document).ready(function($) {

      try{

        checkForErrors(function(){

            // put business-code in here

            $('#logo').vAlign();

        })


      }
      finally{
        if(errorHappened){
            callReady();
        }
      }

    });
  }
  catch(e){
    console.log(e);
  }


  jQuery(document).ready(callReady);

  function callReady(){
    console.log('ready!');
  }

</script>

【讨论】:

  • 这很有帮助,但是 $('#logo').vAlign(); 代码是我无法触摸的代码,这意味着我无法将其包装在 try 块中。
【解决方案2】:

页面中一个脚本标记中的错误不会阻止其他脚本运行。

例子:

<script>
    $(function(){ console.log(1); });
</script>
<script>
    $(function(){ console.log 2; });
</script>
<script>
    $(function(){ console.log(3); });
</script>

这将首先记录第二个脚本标记的语法错误,然后记录值 1 和 3,因为其他准备好的事件正常工作。

演示:http://jsfiddle.net/Guffa/am4f7f18/

【讨论】:

  • 我还以为是这样呢!但这里有一个明确的问题。请使用所使用的确切代码查看我的编辑。
  • @goddamnyouryan:啊哈,错误的类型很重要。尽管语法错误不会停止其他脚本,但 ready 事件处理程序中的运行时错误会阻止以下处理程序运行。不幸的是,它还阻止了 load 事件的工作,否则这将是一个替代方案。我有一个想法,您可以在错误的ready 事件发生之前解除绑定,但我无法让它工作......
  • 是的,我也尝试解绑它,但它也对我不起作用。我确信有办法解决这个问题,我只是不知道它是什么。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多