1319

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

但我不确定这是否更好。

4

14 回答 14

1346

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

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

于 2008-11-06T12:34:58.217 回答
145

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

例如:

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

然后,您可以根据需要以编程方式填充此表。

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

于 2008-11-06T12:30:58.710 回答
68

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

于 2010-07-15T07:14:03.380 回答
64

我正在这样做:

$('<div/>',{
    text: 'Div text',
    class: 'className'
}).appendTo('#parentDiv');
于 2012-11-24T18:07:02.370 回答
45

因为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>​&lt;/div>​]
var b = $.parseHTML('<div>')
// b is [<div>​&lt;/div>​]
$('<script src="xss-attach.js"></script>')
// jQuery returns [<script src=​"xss-attach.js">​&lt;/script>​]
$.parseHTML('<script src="xss-attach.js"></script>')
// jQuery returns []

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

a.html('123')
// [<div>​123​&lt;/div>​]
b.html('123')
// TypeError: Object [object HTMLDivElement] has no method 'html'
$(b).html('123')
// [<div>​123​&lt;/div>​]
于 2013-01-24T03:01:28.973 回答
41

更新

在 jQuery 的最新版本中,以下方法不会分配在第二个 Object 中传递的属性

上一个答案

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

$(document.createElement('div'), {
    text: 'Div text',
    'class': 'className'
}).appendTo('#parentDiv');
于 2013-06-18T05:53:20.620 回答
30

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

从 jQuery 1.8 开始,有一个jQuery.parseHTML()函数,它现在是创建元素的首选方式。此外,通过解析 HTML 存在一些问题$('(html code goes here)'),例如官方 jQuery 网站在其发行说明之一中提到以下内容:

轻松的 HTML 解析:您可以再次在 $(htmlString) 中的标记之前使用前导空格或换行符。我们仍然强烈建议您在解析从外部来源获得的 HTML 时使用 $.parseHTML(),并且将来可能会对 HTML 解析进行进一步的更改。

为了与实际问题相关,提供的示例可以翻译为:

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

不幸的是,这不如使用 just 方便$(),但它为您提供了更多控制权,例如您可以选择排除脚本标签(onclick尽管它会留下内联脚本):

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

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

此外,这是根据新现实调整的最佳答案的基准:

JSbin 链接

jQuery 1.9.1

  $.parseHTML:88 毫秒
  $($.parseHTML):240 毫秒
  <div></div>:138ms
  <div>: 143 毫秒
  创建元素:64 毫秒

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

于 2013-09-29T19:01:11.003 回答
12
var mydiv = $('<div />') // also works
于 2010-11-17T17:03:38.113 回答
6
var div = $('<div/>');
div.append('Hello World!');

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

于 2010-12-22T22:43:07.963 回答
5

我刚刚为此制作了一个小型 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 和 content 最好通过链接方法添加:

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

此外,它是一个简单的 jQuery 插件(第 100 个)的一个很好的例子。

于 2013-08-15T14:49:30.017 回答
4

这一切都很简单!这里有几个简单的例子......


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 );
于 2010-05-25T17:17:22.823 回答
2

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

const mountpoint = 'https://jsonplaceholder.typicode.com/users'

const $button = $('button')
const $tbody = $('tbody')

const loadAndRender = () => {
  $.getJSON(mountpoint).then(data => {

    $.each(data, (index, { id, username, name, email }) => {
      let row = $('<tr>')
        .append($('<td>', { text: id }))
        .append($('<td>', {
          text: username,
          class: 'click-me',
          on: {
            click: _ => {
              console.log(name)
            }
          }
        }))
        .append($('<td>', { text: email }))

      $tbody.append(row)
    })

  })
}

$button.on('click', loadAndRender)
.click-me {
  background-color: lightgrey
}
<table style="width: 100%">
  <thead>
    <tr>
      <th>ID</th>
      <th>Username</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
  
  </tbody>
</table>

<button>Load and render</button>

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

于 2019-05-24T17:47:33.870 回答
2

这个怎么样,例如当你想<option>在一个<select>

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

您显然可以应用于任何元素

$('<div/>')
  .css('border-color', red)
  .text('some text')
  .appendTo('#parentDiv')
于 2020-09-25T15:46:43.753 回答
-2

开箱即用的 jQuery 没有 createElement 等效项。事实上,jQuery 的大部分工作都是在内部使用 innerHTML 而不是纯 DOM 操作完成的。正如亚当上面提到的,这就是你可以达到类似结果的方法。

还有一些插件可以通过 innerHTML 使用 DOM,例如appendDOMDOMECFlyDOM,仅举几例。性能方面,原生 jquery 仍然是性能最高的(主要是因为它使用了 innerHTML)

于 2008-11-06T12:35:57.077 回答