我正在重构一些旧的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创建元素元素的工作示例,也有其他属性,如内容,类,或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 " > < /脚本>
我刚刚做了一个小的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个)的好例子。
从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>]
这是“一”行中的例子。
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