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") ) ; |
更新:我想我会更新这篇文章,因为它仍然有相当多的流量。在下面的评论中,有一些关于
我把一个小基准放在一起,这里大致是重复上述选项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 |
我认为这并不奇怪,但
更新2
为jquery 1.7.2更新,并将基准放在jsben.ch上,这可能比我的原始基准更科学,而且现在可以众包了!
http://jsben.ch//阿鲁兹
简单地提供要添加到jquery构造函数中的元素的html,
例如:
1 2 | var t = $("<table cellspacing='0' class='text'></table>"); $.append(t); |
然后,如果您愿意,可以通过编程方式填充此表。
这使您能够指定任何您喜欢的任意HTML,包括类名或其他属性,这些属性可能比使用
创建新的DOM元素是
- http://api.jquery.com/jquery/创建新元素
- 特别是http://api.jquery.com/jquery/example-1-1
我是这样做的:
1 2 3 4 | $('',{ text: 'Div text', class: 'className' }).appendTo('#parentDiv'); |
由于
有两个好处:
1.如果使用旧方法,可能类似于
2.更重要的是,如果使用旧方法,您可能会遭受跨站点攻击(更多信息)。如果你有类似的东西:
1 2 | var userInput = window.prompt("please enter selector"); $(userInput).hide(); |
坏人可以输入
1 2 3 4 5 6 7 8 | var a = $('') // a is [??] var b = $.parseHTML('') // b is [??] $('<script src="xss-attach.js">') // jQuery returns [<script src=?"xss-attach.js">??] $.parseHTML('<script src="xss-attach.js">') // jQuery returns [] |
但是请注意,
1 2 3 4 5 6 | a.html('123') // [?123??] b.html('123') // TypeError: Object [object HTMLDivElement] has no method 'html' $(b).html('123') // [?123??] |
更新
从jquery的最新版本开始,以下方法不分配在第二个对象中传递的属性
先前的答案
我觉得使用
1 2 3 4 | $(document.createElement('div'), { text: 'Div text', 'class': 'className' }).appendTo('#parentDiv'); |
虽然这是一个非常古老的问题,但我认为最好用最新的信息来更新它;
因为jquery 1.8有一个jquery.parsehtml()函数,它现在是创建元素的首选方法。此外,通过
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") ) ; |
不幸的是,这比仅使用
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 |
看起来
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)