我正在重构一些旧的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构造函数的元素的HTML $()将从新建的HTML返回一个jQuery对象,适合使用jQuery的append()方法追加到DOM中。

例如:

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

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

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

更新

在jQuery的最新版本中,下面的方法不分配传递给第二个对象的属性

以前的回答

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

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

我刚刚做了一个小的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个)的好例子。

我是这样做的:

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

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

自jQuery 1.8以来,有一个jQuery. parsehtml()函数,它现在是创建元素的首选方式。此外,通过$('(HTML代码在这里)')解析HTML也存在一些问题,例如jQuery官方网站在他们的发布说明中提到了以下内容:

轻松的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链接

jQuery 1.9.1

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

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