0

我试图通过递归 $.ajax() 调用从服务器检索信息,但希望在它们绑定到的元素被删除时关闭这些调用。

function check_for_update($element) {

    // this is where I need your help fellas:
    $does_this_element_currently_reside_in_the_dom = ????? ; 

    if ($does_this_element_currently_reside_in_the_dom) {
        $.ajax({ ... });
        setTimeout(function() { 
            check_for_update($element) 
        }, 1000);
    } 
}
$ele = $('<div id="element1"></div>');

// start recursion
check_for_update($ele);

从 DOM 中移除元素应该会停止递归:

$ele.remove();

由于可以通过多种方式删除元素,因此为每个场景编写回调会很麻烦。(即:可以删除,可以删除其父级,可以删除其父级的父级....)。

谢谢!!

4

2 回答 2

1

检查元素是否存在于 setTimeout 中并清除计时器。见下文,

function check_for_update($element) {

    var timer; //added
    // this is where I need your help fellas:
    $does_this_element_currently_reside_in_the_dom = ????? ; 

    if ($does_this_element_currently_reside_in_the_dom) {
        $.ajax({ ... });
        //v-- Added timer var
        timer = setTimeout(function() { 
            if ($('#element1').length) clearTimeout(timer); //Added
            check_for_update($element) 
        }, 1000);
    } 
}
$ele = $('<div id="element1"></div>');

// start recursion
check_for_update($ele);
于 2013-03-07T16:21:58.360 回答
0

谢谢您的帮助!你们是一群绅士!

这是我在递归函数中的解决方案:

function check_for_update($element) {

    // check for the check_for_update_id attribute
    if ($element.attr('check_for_update_id') === undefined) {
        // set the attribute if it's currently undefined
        d = new Date();
        check_for_update_id = String(d.getTime()) + String(d.getMilliseconds());
        $element.attr('check_for_update_id', check_for_update_id);
        }
    // create $element_new using the check_for_update_id attribute
    $element_new = $(  '[check_for_update_id=' + 
                        $element.attr('check_for_update_id') +
                       ']');

    // if $element has been removed from the DOM,
    // $element_new will not have a 'check_for_update_id' attribute
    if ($element_new.attr('check_for_update_id') !== undefined) {
        $.ajax({ ... });
        setTimeout(function() { 
            check_for_update($element_new);
        }, 1000);
    } 
}

第一次将元素传递给函数时,属性“check_for_update_id”将在 $element 中未定义。如果当前未定义,则设置了“check_for_update_id”,并且所有后续 setTimeout() 调用 check_for_update() 函数,$element 现在将与此“check_for_update_id”值相关联。为避免冲突,我在调用此函数时将“check_for_update_id”设置为秒 + 毫秒(这对我来说有点矫枉过正,但总比抱歉更安全)。

然后使用 'check_for_update_id' 属性作为选择器在函数内创建 $element_new:

$element_new = $(  '[check_for_update_id=' + 
                    $element.attr('check_for_update_id' + 
                   ']');

如果在 setTimeout() 迭代之间删除了 $element,则 $element_new 将未定义“check_for_update_id”属性,并且不会再次调用 setTimeout()。

于 2013-03-07T17:24:35.203 回答