使用 jQuery 创建 HTML 元素的最有效方法是什么?

IT技术 javascript jquery html dom
2021-01-19 03:54:08

最近我一直在做很多模态窗口弹出窗口,我使用了jQuery。我用来在页面上创建新元素的方法绝大多数都遵循以下原则:

$("<div></div>");

但是,我感觉这不是最好或最有效的方法。从性能角度来看,在 jQuery 中创建元素的最佳方法是什么?

该答案具有以下建议的基准。

6个回答

我使用$(document.createElement('div')); 基准测试表明这种技术是最快的。我推测这是因为 jQuery 不必将其标识为元素并自行创建元素。

您应该真正使用不同的 Javascript 引擎运行基准测试,并根据结果权衡您的受众。从那里做出决定。

基准测试参考很棒,但这也测试了数万个元素的创建。在典型情况下,您何时会处理这么多元素?很有可能,您需要担心的事情比如何创建元素更重要。document.createElement “在 0.097 秒内跑了 39,682 次”,而 $('<div>') “在 0.068 秒内跑了 12,642 次”。我会说如果某样东西可以在不到一秒钟的时间内运行数千次,那么你就是安全的。
2021-03-21 03:54:08
必须像在 javascript 中一样添加在 jquery 中创建的 div。$('<div>') 本身不会附加到 DOM,直到您将它 append() 到某个东西上。
2021-03-23 03:54:08
此外,使用 $(document.createElement('div')); 我会说效率较低,因为如果您一次只在这里和那里创建一个元素,那么为您将在浏览器中获得的微乎其微的好处编写代码需要更长的时间。从技术上讲,由于查找成本和使用它产生的开销,jQuery 本身作为一个库效率较低。如果有人如此热衷于通过使用 document.createElement 而不是 $('<div>') 来节省宝贵的千分之一毫秒,那么他们不应该使用 jQuery :],因为 $('<div>')是您使用它的原因之一!
2021-03-23 03:54:08
jQuery“附加”到DOM?在哪里?这对我来说没有多大意义——div 会去哪里?
2021-03-24 03:54:08
@David - 显然你是对的。我会注意到我在大约 2 年前刚开始学习 jQuery 时添加了评论。你需要做一个appendTo, ... 因为评论显然是错误的,我已经删除了它们。
2021-03-25 03:54:08

我个人建议(为了可读性):

$('<div>');

到目前为止建议的一些数字(safari 3.2.1 / mac os x):

var it = 50000;

var start = new Date().getTime();
for (i = 0; i < it; ++i)  {
  // test creation of an element 
  // see below statements
}
var end = new Date().getTime();
alert( end - start );                

var e = $( document.createElement('div') );  // ~300ms
var e = $('<div>');                          // ~3100ms
var e = $('<div></div>');                    // ~3200ms
var e = $('<div/>');                         // ~3500ms              
@Owen,这种行为是一个错误,而不是一个功能。垃圾进,垃圾出——碰巧你得到的垃圾是可以接受的。但是,不要在 jQuery 版本之间依赖它,除非函数的规范发生变化。
2021-03-16 03:54:08
来自 jquery 文档:'创建单个元素时使用结束标记或 XHTML 格式。例如,要创建跨度,请使用 $("<span/>") 或 $("<span></span>") 而不是没有结束斜杠/标签。
2021-03-18 03:54:08
正如预期的那样,在 Mac OS X Chrome(100ms for createElement() vs. 500ms text parsing)和 Mac OS X Firefox(350ms vs. 1000ms)中看到类似的数字。感谢您编写测试循环。
2021-03-20 03:54:08
@tvanfosson 这显然已经改变了,在当前的文档中它说:“当参数有一个标签时(带有可选的结束标签或快速结束)—— $( "<img />" ) 或 $( "<img>" )、$( "<a></a>" ) 或 $( "<a>" ) — jQuery 使用原生 JavaScript createElement() 函数创建元素。”
2021-03-23 03:54:08
@MarcStober 没有冒犯。它仍然在这里:http : //api.jquery.com/jQuery/#jQuery2文档提到了可选的结束标签或快速关闭
2021-04-02 03:54:08

问题:

使用 jQuery 创建 HTML 元素的最有效方法是什么?

回答:

既然差不多了,jQuery我认为最好使用这种(干净的)方法(您正在使用)

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'text':'Text Only',
}).on('click', function(){
    alert(this.id); // myDiv
}).appendTo('body');

演示。

这样,您甚至可以为特定元素使用事件处理程序,例如

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'style':'cursor:pointer;font-weight:bold;',
    'html':'<span>For HTML</span>',
    'click':function(){ alert(this.id) },
    'mouseenter':function(){ $(this).css('color', 'red'); },
    'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');

演示。

但是当你处理大量动态元素时,你应该避免handlers在特定元素中添加事件,相反,你应该使用委托的事件处理程序,比如

$(document).on('click', '.myClass', function(){
    alert(this.innerHTML);
});

var i=1;
for(;i<=200;i++){
    $('<div/>', {
        'class':'myClass',
        'html':'<span>Element'+i+'</span>'
    }).appendTo('body');
}

演示。

因此,如果您创建并附加数百个具有相同类的元素,即 ( myClass) 那么事件处理将消耗更少的内存,因为只有一个处理程序将在那里为所有动态插入的元素执行工作。

更新:由于我们可以使用以下方法来创建动态元素

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    'size': '30'
}).appendTo("body");

但是size不能使用这种方法 usingjQuery-1.8.0或 later设置属性,这是一个旧的错误报告,查看此示例usingjQuery-1.7.2显示size属性设置为30using 上面的示例,但使用相同的方法我们无法设置size属性 using jQuery-1.8.3,这里是一个不工作的小提琴因此,要设置size属性,我们可以使用以下方法

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    attr: { size: "30" }
}).appendTo("body");

或者这个

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    prop: { size: "30" }
}).appendTo("body");

我们可以attr/prop作为子对象传递,但它可以在jQuery-1.8.0 and later版本检查这个例子中工作但它不会工作jQuery-1.7.2 or earlier(未在所有早期版本中测试)。

顺便说一句,取自jQuery错误报告

有几种解决方案。首先是根本不使用它,因为它不会为您节省任何空间,这会提高代码的清晰度:

他们建议使用以下方法(也适用于较早的方法,已在 中测试1.6.4

$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");

因此,最好使用这种方法,IMO。此更新是在我阅读/找到此答案后进行的,并且在此答案中显示,如果您使用'Size'(capital S)而不是'size'then 它将正常工作,即使在version-2.0.2

$('<input>', {
    'type' : 'text',
    'Size' : '50', // size won't work
    'autofocus' : 'true'
}).appendTo('body');

另请阅读prop,因为存在差异Attributes vs. Properties,它因版本而异。

搜索jQuery.com网站可能会有所帮助@RafaelRuizTabares,或谷歌它:-)
2021-03-17 03:54:08
这个 $('<div/>', {..........}) 是什么样的语法,我已经找过了,我发现了一些类似的使用 $('<div>).attr( {......}) ?
2021-03-19 03:54:08
@RafaelRuizTabares,$('<div>', {...})您正在传递一个包含所有属性的对象,并且$('<div>').attr({...})您正在创建一个没有任何属性的元素,但attr()稍后使用方法设置属性
2021-03-19 03:54:08
@TheAlpha 在哪里可以找到有关我可以在 {} 中写入的内容的信息?因为我看到它们是属性和事件,但是对于 <div> 你也使用 html。谢谢!
2021-03-25 03:54:08
这是迄今为止最干净、更易读的方式!可能不是快速的方法,但字符串添加肯定不太容易出错。谢谢@TheAlpha
2021-03-26 03:54:08

实际上,如果你在做$('<div>'),jQuery 也会使用document.createElement().

(看看第 117 行)。

有一些函数调用开销,但除非性能至关重要(您正在创建数百 [数千] 个元素),没有太多理由恢复到普通DOM

只是为新网页创建元素可能是您最好坚持使用jQuery做事方式的情况。

如果您有很多 HTML 内容(不仅仅是单个 div),您可能会考虑将 HTML 构建到隐藏容器内的页面中,然后更新它并在需要时使其可见。这样,您的大部分标记可以由浏览器预先解析,并避免在调用时陷入 JavaScript 的困境。希望这可以帮助!

感谢您的建议。我以前使用过这种方法,但是在这种特殊情况下,我特别想了解创建元素。
2021-03-17 03:54:08