Javascript $在快速连续单击时会覆盖此内容
我有一系列带有锚的Javascript $在快速连续单击时会覆盖此内容,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一系列带有锚的div标记,单击这些标记时,会向下滑动一个用AJAX填充的面板。代码如下所示: $('.details').click(function(e) { $this = $(this).parents('.container'); var id = $this.data('id'); $(this).slideToggle('slow', function() {
div
标记,单击这些标记时,会向下滑动一个用AJAX填充的面板。代码如下所示:
$('.details').click(function(e) {
$this = $(this).parents('.container');
var id = $this.data('id');
$(this).slideToggle('slow', function() {
if ($(this).is(":visible")) {
$.ajax({
type: 'POST',
url: '/method',
data: { id: id },
timeout: 5000
}).done(function(result){
console.log('Done was fired.');
console.log($this);
// This is my headache:
// Using $this here to do some stuff
}).fail(function(jqXHR, textStatus, errorThrown){
console.log('Fail was fired.');
console.log(jqXHR, textStatus, errorThrown);
});
如果我快速单击两个链接,第一个开始,然后在它完成之前,第二个开始,覆盖这一行:
$this=$(this).parents('.container')代码>,这最终给人的印象是ajax永远不会结束。如何确保我有权访问正确的$this
?我应该继续查询DOM,还是使用某种变量,变量名?,因为它是一个全局变量
$('.details').click(function(e) {
$this = $(this).parents('.container');
^^^
No var
添加var
,使其具有本地作用域,并且不会被覆盖
$('.details').click(function(e) {
var $this = $(this).parents('.container');
^^^
因为它是一个全局变量
$('.details').click(function(e) {
$this = $(this).parents('.container');
^^^
No var
添加var
,使其具有本地作用域,并且不会被覆盖
$('.details').click(function(e) {
var $this = $(this).parents('.container');
^^^
将$this
设置为函数中的局部变量,而不是页面中的全局变量:
var $this = $(this).parents('.container');
通过在函数中局部声明变量,每个函数调用都会获得自己的变量。当AJAX调用的回调函数使用该变量时,它使用回调函数闭包中捕获的局部变量,而不是全局变量。使$this
成为函数中的局部变量,而不是页面中的全局变量:
var $this = $(this).parents('.container');
通过在函数中局部声明变量,每个函数调用都会获得自己的变量。当AJAX调用的回调函数使用变量时,它使用回调函数闭包中捕获的局部变量,而不是全局变量。您引用的$this
在全局范围内。只需在声明中以var
作为前缀您在$this
前面缺少一个var
,这导致它成为一个全局变量。不可原谅。谢谢,伙计们。为了避免在开发中出现这种情况,请添加“使用strict”代码>到JS文件的顶级范围,它会抱怨意外使用globals:)太棒了,谢谢Anthony,我没有意识到这一点!您引用的$this
在全局范围内。只需在声明中以var
作为前缀您在$this
前面缺少一个var
,这导致它成为一个全局变量。不可原谅。谢谢,伙计们。为了避免在开发中出现这种情况,请添加“使用strict”代码>到JS文件的顶级范围,它会抱怨意外使用globals:)太棒了,谢谢Anthony,我没有意识到这一点!