jQuery document.createElement等价?

jQuery document.createElement equivalent?

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

1
2
3
4
5
6
7
8
9
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来实现这一点。我一直在尝试:

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

但我不确定这是否更好。


这是"一"行中的示例。

1
2
3
4
5
6
7
this.$OuterDiv = $('')
    .hide()
    .append($('<table></table>')
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

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

我把一个小基准放在一起,这里大致是重复上述选项100000次的结果:

jquery 1.4、1.5、1.6

1
2
3
4
               Chrome 11  Firefox 4   IE9
            440ms      640ms    460ms
      420ms      650ms    480ms
createElement    100ms      180ms    300ms

jQuery 1.3

1
2
3
4
                Chrome 11
             770ms
      3800ms
createElement     100ms

jQuery 1.2

1
2
3
4
                Chrome 11
            3500ms
      3500ms
createElement     100ms

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

更新2

为jquery 1.7.2更新,并将基准放在jsben.ch上,这可能比我的原始基准更科学,而且现在可以众包了!

http://jsben.ch//阿鲁兹


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

例如:

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

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

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


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

  • http://api.jquery.com/jquery/创建新元素
  • 特别是http://api.jquery.com/jquery/example-1-1


我是这样做的:

1
2
3
4
$('',{
    text: 'Div text',
    class: 'className'
}).appendTo('#parentDiv');

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

有两个好处:

1.如果使用旧方法,可能类似于$(string),jquery将检查字符串,以确保要选择HTML标记或创建新元素。通过使用$.parseHTML(),您告诉jquery您想要显式地创建一个新元素,这样性能可能会更好一些。

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

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

坏人可以输入


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

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

Relaxed HTML parsing: You can once again have leading spaces or
newlines before tags in $(htmlString). We still strongly advise that
you use $.parseHTML() when parsing HTML obtained from external
sources, and may be making further changes to HTML parsing in the
future.

与实际问题相关,前提是示例可以翻译为:

1
2
3
4
5
6
7
this.$OuterDiv = $($.parseHTML(''))
    .hide()
    .append($($.parseHTML('<table></table>'))
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

不幸的是,这比仅使用$()不太方便,但它提供了更多的控制,例如,您可以选择排除脚本标记(但它会留下像onclick这样的内联脚本):

1
2
3
4
5
> $.parseHTML('')
[??]

> $.parseHTML('', document, true)
[??, ??]

此外,这里还有一个根据新现实调整的最高答案的基准:

JSBN链路

jQuery 1.9-1

1
2
3
4
5
  $.parseHTML:    88ms
  $($.parseHTML): 240ms
  :    138ms
  :          143ms
  createElement:  64ms

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


1
var mydiv = $('') // also works

1
2
var div = $('');
div.append('Hello World!');

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


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

它遵循您的语法:

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

可以将dom节点id指定为第二个参数:

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

严重吗?不,但是这个语法比$(")好,而且它对这笔钱来说是一个很好的价值。

我是一个新的jquery用户,从domassistantcontent-module.php切换到domassistantcontent-module.php。

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

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

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


一切都很直接!这里有几个简单的例子…

1
var $example = $( XMLDocRoot );
1
2
3
4
5
6
7
var $element = $( $example[0].createElement('tag') );
// Note the [0], which is the root

$element.attr({
id: '1',
hello: 'world'
});
1
var $example.find('parent > child').append( $element );


开箱即用的jquery没有等效的createElement。实际上,jquery的大部分工作都是在内部使用innerhtml而不是纯DOM操作完成的。正如亚当上面提到的,这就是你如何获得类似的结果。

还有一些插件可以在innerhtml上使用dom,比如appenddom、domec和flydom等等。性能方面,本地jquery仍然是性能最高的(主要是因为它使用innerhtml)