jQuery document.createElement 等效吗?

IT技术 javascript jquery html dom dhtml
2021-01-20 20:55:13

我正在重构一些旧的 JavaScript 代码,并且有很多 DOM 操作正在进行。

var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;

var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);

我想知道是否有更好的方法使用 jQuery 来做到这一点。我一直在尝试:

var odv = $.create("div");
$.append(odv);
// And many more

但我不确定这是否更好。

6个回答

这是您在“一”行中的示例。

this.$OuterDiv = $('<div></div>')
    .hide()
    .append($('<table></table>')
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

更新:我想我会更新这篇文章,因为它仍然有相当多的流量。在下面的评论中,有一些关于$("<div>")vs $("<div></div>")vs$(document.createElement('div'))作为创建新元素的方式的讨论,这是“最好的”。

我整理了一个小基准,这里是重复上述选项 100,000 次的大致结果:

jQuery 1.4、1.5、1.6

               Chrome 11  Firefox 4   IE9
<div>            440ms      640ms    460ms
<div></div>      420ms      650ms    480ms
createElement    100ms      180ms    300ms

jQuery 1.3

                Chrome 11
<div>             770ms
<div></div>      3800ms
createElement     100ms

jQuery 1.2

                Chrome 11
<div>            3500ms
<div></div>      3500ms
createElement     100ms

我认为这并不奇怪,但却document.createElement是最快的方法。当然,在开始重构整个代码库之前,请记住我们在这里讨论的差异(除了旧版 jQuery 之外的所有差异)相当于每千个元素多出 3 毫秒


更新 2

针对jQuery 1.7.2进行了更新,并放置了JSBen.ch可能比我的原始基准更科学的基准,而且它现在可以众包了!

http://jsben.ch/#/ARUtz

简单地提供您想要添加到 jQuery 构造函数的元素的 HTML$()将从新构建的 HTML 返回一个 jQuery 对象,适合使用 jQuery 的append()方法附加到 DOM 中

例如:

var t = $("<table cellspacing='0' class='text'></table>");
$.append(t);

如果您愿意,您可以然后以编程方式填充此表。

这使您可以指定任何你喜欢的任意的HTML,包括类名或其他属性,您可能会发现更简洁比使用的能力createElement,然后设置类似的属性cellSpacing,并className通过JS。

创建新的 DOM 元素是该jQuery()方法的核心功能,请参阅:

我是这样做的:

$('<div/>',{
    text: 'Div text',
    class: 'className'
}).appendTo('#parentDiv');
为什么这个答案这么少?这是我最喜欢的一个!
2021-03-27 20:55:13

因为jQuery1.8,使用$.parseHTML()来创建元素是更好的选择。

有两个好处:

1.如果您使用旧方式,可能类似于$(string),jQuery 将检查字符串以确保您要选择一个 html 标签或创建一个新元素。通过使用$.parseHTML(),您可以明确地告诉 jQuery 您要创建一个新元素,因此性能可能会好一些。

2.更重要的是,如果您使用旧方式,您可能会遭受跨站点攻击(更多信息)。如果你有类似的东西:

    var userInput = window.prompt("please enter selector");
    $(userInput).hide();

一个坏人可以输入<script src="xss-attach.js"></script>来逗你。幸运的是,$.parseHTML()避免你的尴尬:

var a = $('<div>')
// a is [<div>​</div>​]
var b = $.parseHTML('<div>')
// b is [<div>​</div>​]
$('<script src="xss-attach.js"></script>')
// jQuery returns [<script src=​"xss-attach.js">​</script>​]
$.parseHTML('<script src="xss-attach.js"></script>')
// jQuery returns []

但是,请注意它a是一个 jQuery 对象,而它b是一个 html 元素:

a.html('123')
// [<div>​123​</div>​]
b.html('123')
// TypeError: Object [object HTMLDivElement] has no method 'html'
$(b).html('123')
// [<div>​123​</div>​]
“创建[任何]元素”的“更好的选择”可能很强大。@ siergiej的回答确实说的好工作parseHTML是HTML从外部来源的不好,而是说“所有的升压被包裹在一个新的jQuery对象后的结果了。” 也就是说,如果你想硬编码一个新的 jQuery 包装的 html 元素的创建,$("<div>stuff</div>")样式似乎仍然获胜。
2021-04-09 20:55:13