jQuery .find()偶尔找不到

时间:2011-06-04 09:40:48

标签: javascript jquery iframe load

我试图通过将网页的HTML加载到iframe中来解析网页的HTML,然后在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 :(得分:0)

检查this问题以及许多答案和相关问题。


<强>更新;这里有一些等待#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();
    });
}