jQuery document.createElement等价?

时间:2008-11-06 12:26:32

标签: javascript jquery html dom dhtml

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

但我不确定这是否更好。

14 个答案:

答案 0 :(得分:1250)

这是“一行”中的例子。

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

更新:我以为我会更新此帖子,因为它仍然会获得相当多的流量。在下面的评论中,我们讨论了$("<div>") vs $("<div></div>") vs $(document.createElement('div'))作为创建新元素的方法,这是“最好的”。

我把a small benchmark放在一起,这里大致是重复上述选项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

答案 1 :(得分:129)

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

例如:

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

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

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

答案 2 :(得分:67)

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

答案 3 :(得分:41)

我这样做:

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

答案 4 :(得分:40)

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

有两个好处:

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

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

    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>​]

答案 5 :(得分:35)

<强>更新

从最新版本的jQuery开始,以下方法不会分配在第二个对象

中传递的属性

上一个回答

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

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

答案 6 :(得分:28)

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

由于jQuery 1.8有一个jQuery.parseHTML()函数,现在是创建元素的首选方法。此外,通过$('(html code goes here)')解析HTML存在一些问题,例如官方jQuery网站在one of their release notes中提及以下内容:

  

轻松的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 Link

jQuery 1.9.1

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

看起来parseHTMLcreateElement更接近$(),但在将结果包装到新的jQuery对象后,所有提升都消失了

答案 7 :(得分:12)

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

答案 8 :(得分:7)

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

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

答案 9 :(得分:5)

这一切都很直接!下面是几个简单的例子......


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 );

答案 10 :(得分:5)

我刚刚为此制作了一个小型jQuery插件:https://github.com/ern0/jquery.create

遵循您的语法:

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

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

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

严重吗?不。但是这种语法比 $(“&lt; div&gt;&lt; / div&gt;”)更好,而且这个价值非常高。

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

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

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

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

答案 11 :(得分:0)

在先前的答案中未提及,因此我添加了一个工作示例,该示例如何使用最新的jQuery创建元素元素,还具有诸如content,class或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>

答案 12 :(得分:0)

例如,当您想在<option>内添加<select>元素时

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

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

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

答案 13 :(得分:-1)

开箱即用的jQuery没有相当于createElement的东西。事实上,jQuery的大部分工作是使用innerHTML内部完成纯粹的DOM操作。正如亚当上面提到的那样,你可以获得类似的结果。

还有一些插件可以使用DOM而不是像appendDOMDOMECFlyDOM这样的innerHTML,仅举几例。性能方面,本机jquery仍然是性能最高的(主要是因为它使用innerHTML)