【问题标题】:Initiate onclick faster than with document.onload启动 onclick 比使用 document.onload 更快
【发布时间】:2009-07-20 14:15:57
【问题描述】:

我有带有链接的 html 页面,我想在其中将函数附加到他们的 onclick 事件。一种方法当然是:

<a href="save.php" onclick="save(); return false;" rel="save">Save</a>

但我知道这不是最佳做法。所以我等待window.onload,循环遍历链接并将保存功能附加到rel =“save”的链接。这样做的问题是它会等到整个页面完成加载,这可能是在链接显示和可点击之后的几秒钟。

那么还有其他方法可以做到这一点吗?避免在 html 中点击 onclick,但这样可以在呈现链接时立即工作。

【问题讨论】:

    标签: javascript javascript-events event-handling


    【解决方案1】:

    Internet Explorer 为

    <script type="text/javascript" defer>
    //- Run this code when the DOM parsing has completed
    </script>
    

    我在 Google 上快速搜索了“DOMContentLoaded defer”,发现以下页面可能会有所帮助:

    http://tanny.ica.com/ica/tko/tkoblog.nsf/dx/domcontentloaded-event-for-browsers

    【讨论】:

      【解决方案2】:

      在您的情况下,您可以保持原样。坚持尽可能简单的事情,即使这不是一般的最佳实践。

      【讨论】:

      • 我的案例只是一个例子,很多时候我都需要这个功能。最好的做法是我正在寻找的。​​span>
      【解决方案3】:

      您可以尝试DOMContentLoaded 事件而不是load。 IE 还为脚本标签提供了 defer 属性,该属性会延迟执行,直到加载 DOM。如果这些对你不起作用,那么据我所知,你会被你提到的解决方案所困扰。

      【讨论】:

      • 这是正确答案的一部分。 jQuery 著名的 ready 事件使用它和其他一些选项在最佳时间触发事件。
      【解决方案4】:

      我不知道这是否适合您的解决方案,但您可以在下面立即插入脚本,其中包含您需要更改的链接。这个脚本不会被包装在一个函数中,允许浏览器在看到它时立即执行它。效果是您可以在加载整个页面之前运行脚本,只更改正在运行的脚本上方存在的项目。 (如果您在脚本下方引用某些内容,它将失败。)

      顺便说一句,这几乎肯定不是最佳做法,有些人可能会将其标记为最差做法。

      【讨论】:

      • 是的,我想过,但正如你所说,这可能是最糟糕的做法;)
      【解决方案5】:

      这个怎么样?

      <a href="javascript:void(save());">Save</a>
      

      注意:此解决方案要求用户启用 Javascript。不完全是最佳实践,但可能适合您的场景。

      【讨论】:

      • 这几乎与我想要的相反。现在一切都没有javascript,我只想加快事件的初始化。有没有什么情况下这个 javascript:-thing 比使用 onclick 更好?
      • 当您不想延迟事件处理程序时会更好。除此之外,您加快速度的唯一方法是使用“内容加载”事件而不是 window.onload
      • 是的,但它比 Save 快吗?
      • 它更快,因为您不必分配事件处理程序。一旦链接出现在浏览器中,Javascript 将立即 100% 正常运行,假设您的保存功能是在标记中较早导入的(如在 HEAD 部分中)。
      【解决方案6】:

      这里的理想是使用 Unobtrusive Javascript 的思想。

      这样,如果没有加载 Javascript,链接仍然会做一些事情。这是一个正确的链接,所以它会将用户引导到另一条内容? - 这应该在没有 Javascript 的情况下工作。 如果链接上的功能只能使用 Javascript,您应该使用 Javascript 创建并将它们插入到 DOM 中(如果它们不存在,则它们不可点击...)。

      (否则如何将点击事件委托给包装元素?这在元素完成之前有效吗?)

      edit:哦,“保存”听起来很像它应该是表单中的按钮而不是链接。不过,Unobtrusive JS 的东西仍然适用。

      【讨论】:

      • 是的,一切都可以在没有 javascript 的情况下运行。我从不依赖javascript。但是如果能够利用 ajax 的优点而不必等待 10 秒来加载所有内容,那就太好了。不要担心“保存”,我只是举个例子。如果这个问题得到解决,我有很多功能会受益。
      • 好东西。在文档仍在加载时使用事件委托是否有意义?:
        ...正在加载内容...
      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多