什么时候动态创建对象插入DOM?

时间:2011-12-22 13:50:38

标签: javascript jquery ajax internet-explorer dom

我有以下代码:

$(function () {
    var html = $('<div></div>');

    html.load('preview.html', function (responseText, textStatus, XMLHttpRequest) {
        $('#some_id_in_loaded_html')...
    }

    html.dialog();
}

但是在IE7中,回调函数中的jQuery选择器失败,因为它找不到指定的ID。它在Firefox中运行良好。

为什么会发生这种情况,哪种行为正确(根据标准)?

请注意,使用$('#some_id_in_loaded_html',this)

可以轻松纠正此问题

2 个答案:

答案 0 :(得分:2)

$("#foo")使用document作为搜索的上下文,因此不会返回任何内容,因为html div(及其所有后代包括具有该ID的元素)不是DOM的一部分。

您必须先将html div插入DOM,例如html.appendTo("body");。然后,所有后代也自动也在DOM中,$("#foo")可以工作。

使用实际搜索功能(querySelectorAll)测试案例:http://jsfiddle.net/k7muh/

var div = $("<div><div id='foo'></div></div>");

// tests to expect div#foo

console.log(document.querySelectorAll("#foo"));   // searches in document and
                                                  // does not find the element

console.log(div.get(0).querySelectorAll("#foo")); // searches in the (detached)
                                                  // div and finds the element

答案 1 :(得分:0)

在这种情况下,我认为它是在你调用.dialog()时插入的,它可能会在你的异步回调之前运行(但在某些情况下可能会稍后?)。