是否可以为特定的 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 请求(使用 dataTypeformat 选项):

$.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 以防止页面刷新和滚动?的主要内容,如果未能解决你的问题,请参考以下文章

在php中使用jquery禁用输入框中的特定日期不起作用

jQuery UI Datepicker - 禁用特定日期

Knockout + MVC 禁用 html 按钮并在 ajax 调用后更改颜色

基于数据库选择在 ajax 日历控件中突出显示/禁用特定日期

如何通过 AJAX 调用使用 jQuery 渲染 HTML

是否可以为每个 GWT RPC 调用无缝显示一个 ajax 微调器?