我維護的一些門戶網站使用document.createElement
在運行時在dropdownlist
中創建options
。一直很好,直到IE10,但在IE11
或Edge
突然表現已經大幅下降。document.createElement性能:Edge/IE11太慢v/s Chrome /火狐瀏覽器
我創建了一個小提琴:https://jsfiddle.net/nitinph/ej5p65um/
使用瀏覽器的兩個組(IE11 /邊緣和Chrome/Firefox瀏覽器),請運行它。您會注意到IE11/Edge需要10秒以上,而Chrome/Firefox需要不到一秒的時間。
我的問題是,有什麼替代方式使用document.createElement
,以便在IE11/Edge中的性能相似。
var pTime = document.getElementById("pTime");
var d = new Date();
var n = d.getTime();
var ddl = document.getElementById("TestDDL");
for (var i = 0; i < 5000; i++) {
var opt = document.createElement("option");
opt.text = i;
opt.value = i;
ddl.options.add(opt);
}
d = new Date();
var n1 = d.getTime();
pTime.innerHTML = 'Time: ' + (n1 - n)/1000 + ' sec.';
<select id="TestDDL">
</select>
<p id="pTime">
</p>
更新:禮貌@Squint,這裏有四個備選方案,以實現在IE11 /邊緣性能:
var ddl = document.getElementById("TestDDL");
console.time("html")
var s = ""
for (var i = 0; i < 5000; i++) {
s += "<option value='" + i + '>' + i + "</option>"
}
ddl.innerHTML = s;
console.timeEnd("html")
clearContent()
console.time("insertAdjacentHTML")
for (var i = 0; i < 5000; i++) {
\t ddl.insertAdjacentHTML("beforeend", "<option value='" + i + '>' + i + "</option>")
}
console.timeEnd("insertAdjacentHTML")
clearContent()
console.time("frag")
var frag = document.createDocumentFragment();
for (var i = 0; i < 5000; i++) {
var opt = document.createElement("option");
opt.text = i;
opt.value = i;
frag.appendChild(opt);
}
ddl.appendChild(frag);
console.timeEnd("frag")
clearContent()
console.time("direct add")
for (var i = 0; i < 5000; i++) {
var opt = document.createElement("option");
opt.text = i;
opt.value = i;
ddl.options.add(opt);
}
console.timeEnd("direct add")
function clearContent() {
\t while (ddl.firstChild) {
\t ddl.removeChild(ddl.firstChild)
}
}
clearContent()
console.time("direct append")
for (var i = 0; i < 5000; i++) {
var opt = document.createElement("option");
opt.text = i;
opt.value = i;
ddl.appendChild(opt);
}
console.timeEnd("direct append")
function clearContent() {
\t while (ddl.firstChild) {
\t ddl.removeChild(ddl.firstChild)
}
}
<select id="TestDDL">
</select>
<p id="pTime">
</p>
請將所有相關代碼直接放在問題中,而不是僅僅鏈接到其他某個網站上。 – 2016-06-09 11:10:08
這個問題特定於'option'元素嗎?或者使用'.add()'方法?你有嘗試追加到循環中的'documentFragment',然後將其附加到'select'元素? – 2016-06-09 11:12:49
@squint:這個問題特定於'document.createElement'。下面的標記答案觸及了靶心。 – NP3