有没有可能禁用 Turbolinks,以防止页面刷新和滚动,针对特定的 jQuery Ajax 调用?

7
我有一个Rails 5应用程序,非常希望使用Turbolinks。在应用程序中,有几个PATCH ajax调用,仅使用新数据更新服务器,但不需要担心更新页面状态。每当这些ajax请求返回时,Turbolinks会刷新页面并将浏览器滚动到屏幕顶部。这是不可取的行为;更好的做法是让事情保持原样。禁用Turbolinks可以消除此问题。以下是一个(超级基本)导致问题的ajax调用示例:
$.ajax({
  method: "PATCH",
  url: url,
  data: obj
});

还有其他人遇到这个问题吗?或者有什么想法可以防止页面滚动发生吗?


嗨@mindtonic,你尝试过使用event.preventDefault()吗? - Ezequiel García
@EzequielGonzálezGarcía - 是的,我在每个具有事件对象的位置都尝试了这个方法。一些ajax调用是由插件的回调触发的,一些是由我编写的函数触发的。在所有情况下,页面都会刷新并且屏幕会移动。 :( - mindtonic
好的,当我想要排除Turbolinks时,我使用data-no-turbolink。例如{{link1:文章}},你可以在调用ajax的标签中使用它,试试告诉我,呵呵。 - Ezequiel García
3个回答

1
我在这里找到了答案: Github 上 Turbolinks 文档
步骤 1:用自定义的 turbolinks:load 替换通常的 document.ready。
步骤 2:确保指定类型为 json。
document.addEventListener('turbolinks:load', function() {
// your ajax code: 
    $.ajax({
        method: 'PATCH',
        url: url,
        dataType: 'json'
    })
}

1

我曾遇到同样的问题,并通过另一个StackOverflow问题找到了解决方案。

思路是通过JS请求Rails(使用dataTypeformat选项):

$.ajax({
    method: "PATCH",
    url: url,
    dataType: 'script',
    format: 'js',
    data: obj
});

在你的Rails控制器中,只需用以下代码响应此JS调用:
respond_to do |format|
    format.js
end

没有页面重新加载!

我有一个类似的设置,这会破坏JSON调用,并且仍然会滚动页面。但是,我必须承认:内容并不总是刷新。 - Katinka Hesselink

0

嗯...好吧,这些调用与锚元素没有关联,并且我实际上不想从整个body元素中删除它,只是特定的ajax调用。我希望Turbolinks在其他所有地方都能正常工作。 - mindtonic
所以您想要仅在某些页面上禁用它,对吗? - Anthony E
不,只是针对特定的jQuery Ajax调用。但实际上我只是不希望页面在Ajax调用完成后移动。 - mindtonic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接