考虑下面的代码,如果我连续点击 3 个链接,最后点击的"部分"更新 3 次,前 2 个 remane 相同。(假设您在 AJAX 完成之前单击 3 个链接)
<div><span class="show-records">click me</span></div>
<div><span class="show-records">click me</span></div>
<div><span class="show-records">click me</span></div>
$('.show-records').on('click', function(e) {
el = $(this).parent(); // get parent of clicked link
$.ajax({
url: "...",
method: 'POST',
data: $(this).data('data'),
beforeSend: function() {
el.html('<p style="margin-left: 24px;">loading <span class="loading-spinner"></span></p>'); // show a spinner
},
error: function() {
alert("{{ 'unknown error'|trans({}, 'alerts') }}");
}
}).then(function(html) {
el.html(html); // update html with table
});
});
我只能假设这是因为我的el
变量在每次点击时都会更新,并且"then"始终使用最新的el
如何在每个点击事件之间隔离父元素?
我尝试在$.ajax
中使用success
&complete
函数,但this
&$(this)
不再是点击的元素。
问题似乎只是el
变量从未在任何地方正式声明过。使用变量而不声明它应该会抛出错误,并且在"严格模式"下会抛出错误,但除非您选择加入(强烈推荐),否则 JS 引擎将隐式声明全局范围内的任何未声明变量。
Tha 可能会导致各种令人讨厌的问题,但这里的特定问题只是三个事件处理程序函数"共享"同一个el
变量,因此以您观察到的方式覆盖它。
而如果你把它声明为局部变量(这与"老式"var
关键字同样有效,但让我们变得现代),有了let el = ...
,这个问题就消失了。 每次运行 3 个事件处理程序中的任何一个时,都会重新创建指向正确的元素el
,并且没有一个可以影响其他处理程序。
[事实上,正如其他评论/答案所指出的,const
在这里比let
更好]
如果将 el 作为常量进行新引用。它将解决您的问题。
const myEl = $(this).parent(); // get parent of clicked link