是否可以为特定的 jQuery Ajax 调用禁用 Turbolinks 以防止页面刷新和滚动?
Posted
技术标签:
【中文标题】是否可以为特定的 jQuery Ajax 调用禁用 Turbolinks 以防止页面刷新和滚动?【英文标题】:Is it possible to disable Turbolinks for specific jQuery Ajax calls to prevent the page from refreshing and scrolling? 【发布时间】:2016-07-21 12:48:03 【问题描述】:我有一个 Rails 5 应用程序,非常想使用 Turbolinks。
在应用程序中有几个 PATCH ajax 调用,它们只是用新数据更新服务器,而不需要担心更新页面的状态。
每当这些 ajax 请求返回时,Turbolinks 就会刷新页面,并且浏览器会滚动到屏幕顶部。这不是可取的行为;最好让事情保持原样。
禁用 Turbolinks 可消除此问题。
导致问题的示例(超级基本)ajax 调用:
$.ajax(
method: "PATCH",
url: url,
data: obj
);
是否有其他人遇到这种情况或对如何防止页面滚动有任何想法?
【问题讨论】:
嗨@mindtonic 你尝试使用 event.preventDefault() 吗? @EzequielGonzálezGarcía - 是的,我在每个有事件对象的位置都试过了。有些 ajax 调用是由插件的回调触发的,有些是由我编写的函数触发的。在所有情况下,页面都会刷新并且屏幕会移动。 :( 好的,当我想为 turbolinks 排除某些内容时,我使用 data-no-turbolink 例如 Articles 你可以在标签中使用你在哪里打电话 ajax,试着告诉我呵呵 【参考方案1】:遇到了同样的问题,通过another *** question找到了解决方案。
这个想法是向 Rails 发出 JS 请求(使用 dataType
和 format
选项):
$.ajax(
method: "PATCH",
url: url,
dataType: 'script',
format: 'js',
data: obj
);
在您的 Rails 控制器中,只需使用以下代码响应此 JS 调用:
respond_to do |format|
format.js
end
没有页面重新加载!
【讨论】:
我有一个类似的设置,这打破了 json 调用,并且仍然向上滚动页面。但是,我不得不同意:内容并不总是刷新。【参考方案2】:我在这里找到了答案:Turbolinks documentation on Github。
第 1 步:用自定义的 turbolinks:load 替换通常的 document.ready。
第 2 步:确保指定类型为 json
document.addEventListener('turbolinks:load', function()
// your ajax code:
$.ajax(
method: 'PATCH',
url: url,
dataType: 'json'
)
【讨论】:
【参考方案3】:将data-no-turbolink=true
属性添加到触发AJAX 调用的<a>
或<body>
标记。
见:https://github.com/turbolinks/turbolinks-classic/issues/19 另一个与您的问题类似的 SO 帖子:Rails 4: disable Turbolinks in a specific page
【讨论】:
嗯...嗯,这些调用没有绑定到锚元素,我实际上不想从整个 body 元素中删除它,只是特定的 ajax 调用。我希望 Turbolinks 在其他任何地方都能正常运行。 所以您只想对某些页面禁用它,对吗? 不,只是为了确定,非常具体的 jquery ajax 调用。 --- 但实际上我只是不希望页面在 ajax 调用完成后移动。以上是关于是否可以为特定的 jQuery Ajax 调用禁用 Turbolinks 以防止页面刷新和滚动?的主要内容,如果未能解决你的问题,请参考以下文章
Knockout + MVC 禁用 html 按钮并在 ajax 调用后更改颜色