jquery - 为什么向 HTML 页面元素添加 CSS 类会破坏 Turbolinks 获取的页面上的滚动?

标签 jquery ruby-on-rails turbolinks

我在涉及 Turbolinks 的 Rails 遗留项目中遇到了一个非常有趣的错误。以下是该错误的描述:

每当用户单击汉堡包导航图标时,侧面导航就会以动画形式打开要单击的导航链接列表。单击此图标后,jQuery 会将一个类添加到页面上的 html 元素中。每当用户单击这些导航链接之一时,Turbolinks 就会执行 Turbolinks 所做的事情:向服务器发出 XHR 请求以获取页面所需的 HTML,并将页面的 body 标记替换为响应中的 body 标记。然而,当 Turbolinks 从服务器绘制带有新 body 标记的页面时,访问者无法向下滚动页面 - 页面似乎卡住了。

当我删除在单击导航时向 html 元素添加 CSS 类的 jQuery 时,所有动画都会提醒相同的情况。然后我点击其中一个链接,Turbolinks 运行了,现在页面突然解冻了——我可以上下滚动页面。

为什么原作者在汉堡导航上的点击事件期间将CSS应用到html,我不知道。然而,当我删除这个向 html 元素添加 CSS 类的 jQuery 行为时,Turbolinks 绘制的页面是可滚动的。

有谁知道为什么向 html 元素添加 CSS 类会破坏 Turbolinks 获取和绘制的页面?有谁知道为什么当我删除向 html 元素添加 CSS 类的 jQuery 时,Turbolinks 绘制的页面是可滚动的?

编辑:

jQuery 添加到 html 元素的 CSS 类是这样的:

.-page-overflow-hidden {
  overflow: hidden;
}

最佳答案

这不是一个错误,这是在 Turbolinks 自述文件 https://github.com/turbolinks/turbolinks#navigating-with-turbolinks 中指定的

During rendering, Turbolinks replaces the current body element outright and merges the contents of the head element. The JavaScript window and document objects, and the HTML html element, persist from one rendering to the next.

检查粗体部分。 html 元素从一页持续到下一页,因此,应用于它的任何类都会持续存在。您的代码设置了 overflow:hidden CSS 属性,因此在新页面呈现后它仍然存在。

我建议在你的 js 文件中添加类似的内容

document.addEventListener('turbolinks:before-render', function(event) {
  document.getElementsByTagName('HTML')[0].classList.remove('-page-overflow-hidden');
})

它将监听 Turbolink 的 before-render 事件(该事件在开始渲染新页面后立即触发),并且您可以从第一个 HTML 元素中删除该类,以防万一它被设置。

关于jquery - 为什么向 HTML 页面元素添加 CSS 类会破坏 Turbolinks 获取的页面上的滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52337055/

相关文章:

javascript - getElementbyId 隐藏?

ruby-on-rails - 使用 beginning_of_month 时 Rails 5 中的时区

ruby-on-rails - 使用 rspec 测试导出到 excel 或 csv 的最佳方法是什么?

ruby-on-rails - 将页面预加载到 turbolinks 转换缓存中

ruby-on-rails - 带有 Turbolinks 的 StimulusJS,必须等待 "turbolinks:load"事件才能执行 StimulusJS Controller

javascript - 在下拉列表中显示带有复选框的选项 - HTML/JAVASCRIPT

javascript - 原生 javascript 中的事件和选择器

ruby-on-rails - 你能告诉我 Rails 添加到现有 Ruby 类的任何方法吗?

javascript - Turbolinks 与 Adsense 异步广告代码

javascript - 在 Firefox 中多次触发拖动输入事件