【发布时间】:2018-01-09 22:48:30
【问题描述】:
以下代码在我的 Rails 应用程序中运行了一段时间:
$(function () {
// Change the link's icon while the request is performing
$(document).on('click', 'a[data-remote]', function () {
var icon = $(this).find('i');
icon.data('old-class', icon.attr('class'));
icon.attr('class', 'glyphicon glyphicon-refresh spin');
});
// Change the link's icon back after it's finished.
$(document).on('ajax:complete', function (e) {
var icon = $(e.target).find('i');
if (icon.data('old-class')) {
icon.attr('class', icon.data('old-class'));
icon.data('old-class', null);
}
})
}
代码用“刷新”字形图标替换一个字形图标并旋转它,直到 AJAX 请求完成,然后用原始字形图标替换它。
我最近注意到代码已停止工作。 AJAX 请求工作正常,但在 AJAX 调用期间我不再获得旋转刷新字形图标。升级到 Rails 5.1 可能会导致问题。
我的 Gemfile 中确实有 gem 'jquery-rails',所以我认为 Rails 5.1 升级是完全向后兼容的。可能是其他一些变化导致了这个问题。
我将第一个函数更新如下:
$('a[data-remote]').on('click', function () {
var icon = $(this).find('i');
icon.data('old-class', icon.attr('class'));
icon.attr('class', 'glyphicon glyphicon-refresh spin');
});
这在第一次单击按钮时有效,但如果再次单击相同的按钮,我就没有微调器了。
有没有解决这个问题的方法,最好是使用标准的 DOM API?我搞砸了:
document.querySelectorAll('[data-remote]').onclick = function () { ... }
但没有任何运气。
我是否接近一个可行的答案?这会是使用 addEventListener 的好选择吗?
【问题讨论】:
-
我无法重现您在 Rails 5.1 应用程序中观察到的行为。你在你的应用程序中使用Turbolinks 吗?如果是这样,您应该将 Javascript 包装在
$(document).on('turbolinks:load', function(){...})而不是$(function(){...})。 -
我目前没有使用 Turbolinks。我想在以后使用它,但我想先解决这个问题。
-
既然 Turbolinks 不是问题,还有其他想法为什么这不起作用?使用原始代码,我检查了按钮,并且没有添加事件处理程序。似乎最简单的解决方案是保留
$(document).on('click', '???')模式,但找到一种方法让它附加到现有按钮上,不是吗? -
我使用的是
$(a[data-remote])模式,但在切换到$(document).on('click', ...)时,我可以重现您提到的行为。 -
绑定到
body而不是document似乎实际上触发了监听器函数:$("body").on('click', ...)。
标签: javascript jquery ruby-on-rails ajax