setTimeout не работает правильно с jQuery и load () - PullRequest
2 голосов
/ 09 марта 2011

У меня проблема с моим кодом. У меня есть две таблицы, загруженные в два блока, например:

loadTable($("#vbeTable"),'getUpdateA')
loadTable($("#vbcTable"),'getUpdateB')

У меня также есть это:

$("#vbeTable, #vbcTable").live('mouseover mouseout', function(event) {
    if (event.type == 'mouseover') {
//        console.log('hovering over',$(this));
        $(this).attr('update',false)
    } else {
//        console.log('NOT hovering over',$(this));
        $(this).attr('update',true)
    }
})

и функция loadTable выглядит так:

function loadTable($table, $php, $noRefresh){
    if($table.attr('update') == 'false'){
        console.log('not updating', $table, $table.attr('update'))
        setTimeout( function () { loadTable($table, $php); }, 1000)
    }
    $table.load($php+'.php',function(response, status, xhr) {
        if (status == "success") {
            if(!$noRefresh){
                console.log('acquired table')
                setTimeout( function () { loadTable($table, $php); }, 1000)
            }
        }
        else {
            console.log('error aquiring lock on', $table.attr('id'), response, status, xhr)
        }
    });

}

* по какой-то причине функция setTimeout не ожидает нужное количество времени, и в консоли я получаю:

(96) liveLoads.js: 35приобретенная таблица
(7711) liveLoads.js: 29 не обновляется [<div id=​"vbcTable" update=​"true">​…​</div>] false
(2) <exception> <exception> <exception> <exception>* изначально и vbe, и vbc - пустые div.

Может ли кто-нибудь помочь мне здесь?

* UPDATE *

У меня также есть этот код:

function expand(EntID) {
    console.log('expand',EntID)
    $.ajax({
        url: "showRows.php?ID=" + EntID
    });
}

, который, когда что-то щелкает по таблице и вызывает эту функцию, запускается.

но затем другие функции setTimeouts впадают в волнение и их вызывают миллион раз подряд, не обращая внимания на время

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Вы вызываете функцию обратного вызова тайм-аута вместо передачи ее тайм-ауту.

Вместо:

// this will call loadTable right away and setTimeout will trigger the returned value in a sec.
setTimeout( loadTable($table, $php), 1000)

Do:

// setTimeout will trigger the anon. function in a sec
setTimeout( function () { loadTable($table, $php); }, 1000)

Вы также вызываете ту же функцию loadTable из loadTable. И я не вижу разрыва в этом бесконечном цикле.

0 голосов
/ 09 марта 2011

Эта часть выглядит неправильно:

if (status == "success") {
    if(!$noRefresh){
        console.log('acquired table')
        setTimeout( loadTable($table, $php), 1000)
    }
}

В дополнение к тому факту, что это не передает правильный тип в setTimeout (param1 должен быть функцией, вы даете ему возвращаемый результат вызова функции loadTable) - я не думаю, что вы хотите, чтобы он вызывал loadTable ТЕМ НЕ МЕНИЕ. Вместо этого вызовите функцию, которая анализирует данные и заполняет ваши HTML-элементы! Итак:

if (status == "success") {
    if(!$noRefresh){
        console.log('acquired table')
        setTimeout(function () {drawMyTableWithThisData(someTable, data);}, 1000);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...