1

我有一系列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,还是使用某种变量,变量名?

4

2 回答 2

3

因为它是一个全局变量!

    $('.details').click(function(e) {

        $this = $(this).parents('.container');
    ^^^    
   No var

添加var它使其具有本地范围并且不会被覆盖

    $('.details').click(function(e) {

        var $this = $(this).parents('.container');
        ^^^    
于 2013-09-07T16:45:52.883 回答
1

$this函数中创建一个局部变量,而不是在页面中创建一个全局变量:

var $this = $(this).parents('.container');

通过在函数中本地声明变量,对函数的每次调用都会获得自己的变量。当 AJAX 调用的回调函数使用该变量时,它使用在回调函数的闭包中捕获的局部变量,而不是全局变量。

于 2013-09-07T16:47:11.330 回答