jQuery .html() 是不是操作 DOM?

Posted

技术标签:

【中文标题】jQuery .html() 是不是操作 DOM?【英文标题】:Does jQuery .html() manipulate DOM?jQuery .html() 是否操作 DOM? 【发布时间】:2012-04-01 06:26:52 【问题描述】:

我正在运行以下函数:

    $(function () 
    var tbl = $('table[id^="stg_"]');
    var tmpl = tbl.attr('id').replace('stg_', '');

    // how many elements before
    console.log($(":input, select").length);

    $.get('templates/' + tmpl + '.html', function (data) 
        tbl.html(data);
    );

    // same number after ?
    console.log($(":input, select").length);
);

但是,看起来 jQuery 并没有修改 DOM,因为我在设置表的 html 之前和之后在我的 ":input, select" 选择器上获得了相同的 .length

这只是一个测试,但我很好奇是否有人尝试过这个或者知道为什么在设置表格的 .html 后长度会相同。

【问题讨论】:

【参考方案1】:

$.get是异步的,第二条日志显示相同的数字,因为它是在ajax完成之前记录的,试试

console.log($(":input, select").length);
$.get('templates/' + tmpl + '.html', function (data) 
    tbl.html(data);
    console.log($(":input, select").length);//probably it will give a different number
);

或者在你当前的场景设置async:false(强烈不推荐)

$(function () 
    $.ajaxSetup(
       async:false
    );
    var tbl = $('table[id^="stg_"]');
    var tmpl = tbl.attr('id').replace('stg_', '');

    // how many elements before
    console.log($(":input, select").length);

    $.get('templates/' + tmpl + '.html', function (data) 
        tbl.html(data);
    );   

    console.log($(":input, select").length);
);

【讨论】:

就是这样!非常感谢。我会在 10 分钟内将此标记为答案 :)【参考方案2】:

试试:

$.get('templates/' + tmpl + '.html', function (data) 
    tbl.html(data);
    console.log($(":input, select").length);
);

您正在发出异步请求并在 ajax 请求完成之前打印元素的数量。因此,请尝试在异步执行的回调中打印计数。

【讨论】:

【参考方案3】:

$.get 是异步的 - 它触发它的请求并且代码继续运行。因此,console.log($(":input, select").length);$get 返回之前执行。将console.log($(":input, select").length); 添加到回调中(在tbl.html(data) 之后),您会看到更好的结果。

【讨论】:

【参考方案4】:

您首先报告长度,然后才操作 dom ;)。 @Nemoy 和 @3nigma 说了什么。

【讨论】:

以上是关于jQuery .html() 是不是操作 DOM?的主要内容,如果未能解决你的问题,请参考以下文章

使用jQuery操作DOM

jQuery html操作

jquery(dom操作方法)

使用JQuery操作DOM

使用JQuery操作DOM

jQuery操作DOM