【问题标题】:How to suspend execution of javascript?如何暂停执行javascript?
【发布时间】:2009-10-01 13:54:37
【问题描述】:

有什么方法可以暂停 javascript 的执行,直到整个页面加载到浏览器中?我正在使用 AJAX 更新文档底部的 div,但是当我在整个页面加载之前单击此链接时出现错误...

<%= link_to_remote 'Update', :update => 'div_at_the_bottom', :url => { :usual_stuff } %>

【问题讨论】:

    标签: javascript ruby-on-rails ajax


    【解决方案1】:

    最简单的方法是在window.onload上做所有事情:

    window.onload = function() {
      // do everything here
    }
    

    您也可以将您的 javascript 放在页面末尾,&lt;/body&gt; 之前。这样,您操作的任何对象都可以保证在 DOM 中。

    正如其他人所说,一些 JS 框架具有在 DOM 加载时运行 JS 的好方法。这样做的主要优点是您不会获得相当于“无样式内容的闪烁”的 JS,即以一种(可能是丑陋的)形式看到一个元素,然后在整个页面加载后进行更改。

    【讨论】:

    • 该事件仅在整个文档加载后触发,包括所有图像等等,这在大多数情况下有点矫枉过正
    • 是的,但 OP 正在修改的对象位于页面底部,因此我认为影响很小。
    • 它甚至是 Google 的网络开发“最佳实践”code.google.com/speed/articles/… 的一部分——“将 Javascript 尽可能放在页面的后面。小工具和网页从上到下加载和呈现。让用户可见的内容(如 HTML、图像和 CSS)在下载顺序中具有更高的优先级。”
    • 请问,您如何将 rails 的 link_to_remote 塞到 window.onload 中?
    【解决方案2】:

    禁用生成的链接并在 dom 加载后启用它:

    1. 禁用链接:

      <%= link_to_remote 'Update', 
              { :update => 'div_at_the_bottom', :url => { :usual_stuff } },
              { :disabled => 'disabled', :id => 'update-trigger' }
      %>
      

      (请注意,为了能够将这个额外的选项传递给link_to_remote,您需要通过用卷曲{} 包裹它来使[2nd] "options" 散列显式。Extra help on this

    2. 然后在某个地方(在包含原型 js 库之后的任何地方)在 DOM 加载后启用链接(这与迄今为止每个人都在说的做的类似):

      <script>
      $(document).observe('dom:loaded', function() {
          $('update-trigger').disabled = false
      })
      </script>
      

    这个解决方案在语义上也是可以接受的,如果这对你很重要(对我很重要)。

    【讨论】:

    【解决方案3】:

    如果您使用像 jQuery 这样的 JavaScript 库,您可以轻松地将任何 JavaScript 代码绑定到 DOM 就绪事件并避免此类问题。

    【讨论】:

    • OP 不是“绑定任何 javascipt 代码”。 OP 正在使用您的答案未解决的link_to_remote。完全没有。
    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多