jQuery .find () иногда не удается найти - PullRequest
0 голосов
/ 04 июня 2011

Я пытаюсь проанализировать HTML-код веб-страницы в DOM, загрузив его в iframe и затем выполнить поиск в DOM. Вот код

function f(callback) {
    var tmp = document.createElement('iframe');
    $(tmp).hide();
    $(tmp).insertAfter($('foo'));
    $(tmp).attr('src', url);

    $(tmp).load(function() {
        var bdy = tmp.contentDocument.body;
        callback(bdy);
        $(tmp).remove();
    });
}

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

function callback(bdy) {
    alert($(bdy).find('bar').length);
}

иногда это дает мне правильное значение, но иногда дает 0. Однако, если я сделаю следующее, это сработает

var tmp = document.createElement('iframe');
$(tmp).hide();
$(tmp).insertAfter($('foo'));
$(tmp).attr('src', url);

$(tmp).load(function(tmp) {
    setTimeout(function() {
        var bdy = tmp.contentDocument.body;
        callback(bdy);
        $(tmp).remove();
    }, '100');
});

Поскольку setTimeout () зависит от конца клиента, я хотел бы знать, есть ли лучший способ достичь той же цели. Благодаря.

1 Ответ

0 голосов
/ 04 июня 2011

Отметьте этот вопрос, а также множество ответов и связанных с ним вопросов.


Обновление ; Вот код, который ожидает загрузки #bar:

function f(callback) {
    var tmp = document.createElement('iframe'),
        $tmp = $(tmp);
    $tmp.hide()
        .insertAfter($('foo'))
        .attr('src', url);

    $tmp.load(function() {
        var bdy = tmp.contentDocument.body,
            $bdy = $(bdy); // small optimization

        var waitForBar = function() {
            if($bdy.find('#bar').length > 0) {
                callback(bdy);
                $tmp.remove();
            } else
                setTimeout(waitForBar, 50);
        };
        waitForBar();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...