我正在重构一些旧的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

但我不确定这样是否更好。


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

例如:

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

然后,如果您愿意,可以通过编程方式填充这个表。

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


这是“一”行中的例子。

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

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

我整理了一个小型基准测试,以下是重复上述选项10万次的大致结果:

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

我觉得这没什么好惊讶的,但是文件。createElement是最快的方法。当然,在开始重构整个代码库之前,请记住我们在这里讨论的差异(除了老式jQuery版本之外的所有版本)相当于每1000个元素增加3毫秒。


更新2

jQuery 1.7.2更新,并将基准放在JSBen上。Ch可能比我的原始基准更科学,而且现在可以众包了!

http://jsben.ch/#/ARUtz


jQuery开箱即用并没有createElement的等价物。事实上,jQuery的大部分工作都是在内部使用innerHTML完成的,而不是纯DOM操作。正如Adam在上面提到的,这是你实现类似结果的方法。

还有一些插件可以在innerHTML上使用DOM,比如appendDOM, DOMEC和FlyDOM。在性能方面,原生jquery仍然是性能最好的(主要是因为它使用了innerHTML)


这一切都非常直截了当!这里有几个简单的例子…


var $example = $( XMLDocRoot );

var $element = $( $example[0].createElement('tag') );
// Note the [0], which is the root

$element.attr({
id: '1',
hello: 'world'
});

var $example.find('parent > child').append( $element );

创建新的DOM元素是jQuery()方法的核心特性,请参见:

http://api.jquery.com/jQuery/#creating-new-elements 特别是http://api.jquery.com/jQuery/#example-1-1


var mydiv = $('<div />') // also works

var div = $('<div/>');
div.append('Hello World!');

是在jQuery中创建DIV元素的最短/最简单的方法。


我是这样做的:

$('<div/>',{
    text: 'Div text',
    class: 'className'
}).appendTo('#parentDiv');

从query1.8开始,使用$. parsehtml()创建元素是一个更好的选择。

有两个好处:

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

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

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

坏人可以输入<script src="xss- attachment .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>​]

更新

在jQuery的最新版本中,下面的方法不分配传递给第二个对象的属性

以前的回答

我觉得使用document.createElement('div')与jQuery一起使用更快:

$(document.createElement('div'), {
    text: 'Div text',
    'class': 'className'
}).appendTo('#parentDiv');

我刚刚做了一个小的jQuery插件:https://github.com/ern0/jquery.create

它遵循你的语法:

var myDiv = $.create("div");

DOM节点ID可以指定为第二个参数:

var secondItem = $.create("div","item2");

严重吗?不。但是这个语法比$("<div></div>")更好,而且它的价值非常高。

我是一个新的jQuery用户,从DOMAssistant切换过来的,它有类似的功能:http://www.domassistant.com/documentation/DOMAssistantContent-module.php

我的插件更简单,我认为attrs和内容最好通过链接方法添加:

$("#container").append( $.create("div").addClass("box").html("Hello, world!") );

同时,它也是一个简单的jquery插件(第100个)的好例子。


虽然这是一个非常老的问题,但我认为用最近的信息来更新它会很好;

自jQuery 1.8以来,有一个jQuery. parsehtml()函数,它现在是创建元素的首选方式。此外,通过$('(HTML代码在这里)')解析HTML也存在一些问题,例如jQuery官方网站在他们的发布说明中提到了以下内容:

轻松的HTML解析:您可以再次使用前导空格或 在$(htmlString)标签前的换行。我们仍然强烈建议这样做 解析从外部获取的HTML时使用$.parseHTML() 源代码,并可能对HTML解析做进一步的更改 的未来。

为切合实际问题,所提供的例子可译为:

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

不幸的是,这比只使用$()更不方便,但它给了你更多的控制,例如你可以选择排除脚本标签(它会留下内联脚本,如onclick):

> $.parseHTML('<div onclick="a"></div><script></script>')
[<div onclick=​"a">​</div>​]

> $.parseHTML('<div onclick="a"></div><script></script>', document, true)
[<div onclick=​"a">​</div>​, <script>​</script>​]

此外,以下是根据新情况调整的排名第一的答案的基准:

JSbin链接

jQuery 1.9.1

  $.parseHTML:    88ms
  $($.parseHTML): 240ms
  <div></div>:    138ms
  <div>:          143ms
  createElement:  64ms

看起来parseHTML更接近createElement而不是$(),但是在将结果包装到一个新的jQuery对象中之后,所有的改进都消失了


在以前的回答中没有提到,所以我添加了如何使用最新的jQuery创建元素元素的工作示例,也有其他属性,如内容,类,或onclick回调:

Const挂载点= 'https://jsonplaceholder.typicode.com/users' Const $button = $('button') Const $tbody = $('tbody') const loadAndRender = () => { 美元.getJSON(挂载点)。然后(data => { 美元。Each (data, (index, {id, username, name, email}) => { Let row = $('<tr>') .append($('<td>', {text: id})) .append($(“< td >”,{ 文字:用户名、 类:“按我”, : { 点击:_ => { console.log(名字) } } })) .append($('<td>', {text: email})) tbody.append美元(行) }) }) } 美元的按钮。(“点击”,loadAndRender) .click-me { background - color: lightgrey } <table style="width: 100% < thead > < tr > < th > ID < / th > < th >用户名< / th > < th > < / th >邮件 < / tr > < / thead > tbody > < tbody > < / 表> < / 加载和渲染</button> < script src = " https://code.jquery.com/jquery-3.3.1.min.js " > < /脚本>


例如,当你想在<select> ! <option>元素中添加<option>

$('<option/>')
  .val(optionVal)
  .text('some option')
  .appendTo('#mySelect')

显然可以应用于任何元素

$('<div/>')
  .css('border-color', red)
  .text('some text')
  .appendTo('#parentDiv')