【问题标题】:jQuery ready event does not fire on every page load when placed in HEAD in Rails当放置在 Rails 的 HEAD 中时,jQuery 就绪事件不会在每次页面加载时触发
【发布时间】:2013-07-19 12:53:41
【问题描述】:

在 Rails 中使用 jQuery 就绪事件时,我注意到一些奇怪的事情。如果将处理程序添加到<head> 部分,直接在脚本标签中或在使用<%= javascript_include_tag ... 包含的资产管道文件中,它只会在第一个页面请求上执行,而不是在后续请求上执行。也就是说,加载/刷新页面的显式浏览器操作将执行它,但通过点击链接触发的新页面视图不会。

另一方面,如果它包含在<body> 中,它会在每次页面查看时触发 - 正如您所期望的那样。

<head>
<script>
jQuery(document).ready(function(){
    console.log('READY in head'); // Fires on first page load only
});
</script>
</head>

<body>
<script>
jQuery(document).ready(function(){
    console.log('READY in body'); // Fires every time
});
</script>
</body>

真的很困惑。我在我所有的 Rails 应用程序中都看到了它,但不明白 Rails 是如何影响这一点的,因为 jQuery 是一种客户端技术?

【问题讨论】:

  • 当您说explicit browser actions to load/refresh a page will execute itnew page views triggered from clicking around on links will not 时,您的页面是如何设置的?单击链接实际上会加载一个新页面,还是会抓取一个页面并将其插入到 dom 中?
  • @Toiletduck- 你问的是 AJAX 吗?不,它们是标准页面加载。
  • Rails 无法影响这一点,除非没有包含代码。您是否从客户端(浏览器)检查过一切都如您所愿?
  • 因为它们都应该可以正常工作。
  • 是的,我在问您是否使用了 AJAX 请求。否则,您的代码没有任何问题,除非您的脚本不在所有页面的头部。

标签: javascript jquery ruby-on-rails document-ready


【解决方案1】:

来自RailsApps Project

Rails 资产管道在 Rails 4.0 中将变得更加重要 使用新的 Turbolinks 功能。 Turbolinks 通过以下方式提高性能 保持当前页面实例处于活动状态并仅替换页面 BODY(加上 HEAD 中的标题)。只要 HEAD 元素是 页面之间相同,Turbolinks 机制可以提供其 “涡轮”速度提升。这增加了避免任何额外的重要性 特定页面上的脚本标签。

【讨论】:

  • 我刚刚意识到 turbolink 是什么——显然这就是问题所在。谢谢!
  • 很高兴,现在你可以继续使用你的 Rails voo-doo
【解决方案2】:

如您所说,使用 AJAX(或 turbolinks)实际上不会加载新页面,而是将其插入到 dom 中。因此,就绪事件不会触发。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多