jQuery追加一组元素
为了这个问题的目的,可以说我们需要append()
1000个对象到body
元素。
你可以这样做:
for(x = 0; x < 1000; x++) { var element = $('<div>'+x+'</div>'); $('body').append(element); }
这可以工作,但是对于我来说AFAIK似乎效率低下,这将导致1000个文档重排。 更好的解决scheme是:
var elements = []; for(x = 0; x < 1000; x++) { var element = $('<div>'+x+'</div>'); elements.push(element); } $('body').append(elements);
但是,这不是一个理想的世界,并引发错误Could not convert JavaScript argument arg 0 [nsIDOMDocumentFragment.appendChild]
。 我明白append()
不能处理数组。
我如何使用jQuery
(我知道DocumentFragment节点,但假设我需要使用诸如.css()
类的元素上的其他jQuery函数.css()
一次性向DOM添加一堆对象以提高性能?
你可以使用一个空的jQuery对象而不是一个数组:
var elements = $(); for(x = 0; x < 1000; x++) { elements = elements.add('<div>'+x+'</div>'); // or // var element = $('<div>'+x+'</div>'); // elements = elements.add(element); } $('body').append(elements);
这可能是有用的,如果你想在循环内使用新生成的元素做东西。 但请注意,这将创build一个巨大的内部堆栈元素(在jQuery对象内)。
看来,虽然你的代码与jQuery 1.8完美的工作 。
你可以打电话
$('body').append(elements.join(''));
或者你可以在第一个地方创build一个大的string。
var elements = ''; for(x = 0; x < 1000; x++) { elements = elements + '<div>'+x+'</div>'; } $(document.body).append(elements);
就像你提到的那样,可能最“正确”的方式是使用一个DocFrag。 这可能看起来像
var elements = document.createDocumentFragment(), newDiv; for(x = 0; x < 1000; x++) { newDiv = document.createElement('div'); newDiv.textContent = x; elements.append( newDiv ); } $(document.body).append(elements);
.textContent
不被IE <9支持,而需要一个条件检查才能使用.innerText
或.text
。
升级到jQuery 1.8,按预期工作:
$('body').append([ '<b>1</b>', '<i>2</i>' ]);
由于$ .fn.append需要可变数量的元素,我们可以使用apply
将数组作为parameter passing给它:
el.append.apply(el, myArray);
这有效果,如果你有一个jQuery对象的数组。 根据规范,尽pipe你可以附加一个元素数组,如果你有DOM元素。 如果你有一个htmlstring数组,你可以直接join('')它们,并将它们一次追加。
稍微改变你的第二种方法:
var elements = [], newDiv; for (x = 0; x < 1000; x++) { newDiv = $('<div/>').text(x); elements.push(newDiv); } $('body').append(elements);
$ .append()肯定可以附加一个数组: http : //api.jquery.com/append/
.append(content)| content(内容):一组或多个额外的DOM元素,元素数组,HTMLstring或jQuery对象,以便在匹配元素集合中的每个元素的末尾插入。
有时候,jQuery不是最好的解决scheme。 如果你有很多元素要附加到DOM, documentFragment
是一个可行的解决scheme:
var fragment = document.createDocumentFragment(); for(var i = 0; i < 1000; i++) { fragment.appendChild(document.createElement('div')); } document.getElementsByTagName('body')[0].appendChild(fragment);
如果你要进行原始性能的话,我会build议纯JS,尽pipe有些人会认为你的开发性能比你的网站/程序性能更重要。 检查这个链接的基准和不同的DOM插入技术的展示。
编辑:
作为一种好奇心, documentFragment
certificate是最慢的方法之一。
我会使用原生JavaScript,通常要快得多:
var el = document.getElementById('the_container_id'); var aux; for(x = 0; x < 1000; x++) { aux = document.createElement('div'); aux.innerHTML = x; el.appendChild(aux); }
编辑:
在那里你可以使用不同的选项来实现一个jsfiddle 。 @ jackwander的解决scheme显然是最有效的解决scheme。