実際には、より単純な方法、より単純な正規表現で「オプション」要素を処理するためにこれが必要でした。要素に使用innerHTML = append content
する場合、ie の Cos は追加されません。select
追加操作は以下のリンクに記載されていますが、オプション要素では機能しません。そして、この問題の解決策を見つけます。追加コンテンツがオプションである場合、または使用よりもオプションが使用さhandleOptionElements
れていない場合は、使用されますasyncInnerHTML
。
function append(el, child) {
if (child.nodeType === 1 || child.nodeType === 3) {
// Without clone, removes element if it is copied from document
return el.appendChild(child.cloneNode(true));
}
content = trim(content);
if (content.substring(0, 7) === "<option" &&
content.substring(content.length - 7) === "option>") {
handleOptionElements(content, el);
} else {
el.innerHTML = content;
}
return el;
}
http://james.padolsey.com/javascript/asynchronous-innerhtml/
innerHTML に大きな値を設定したときにパフォーマンスを向上させる方法
var re_standaloneAttributes = /^(select|disabl)ed$/i,
re_optionSearch = /<option\s*([^>]*)>(.*?)<\/option>/gi,
re_attributeSearch = /([^\s]*)=["'](.*?)["']|([\w\-]+)/g;
function handleOptionElements(content, targetElement) {
var options = [], attributes = [],
optionElement, optionElements = [], createOption;
(""+ content).replace(re_optionSearch, function(src1, attr, text) {
if (!src1) return;
(""+ attr).replace(re_attributeSearch, function(src2, name, value) {
if (!src2) return;
name = name || src2;
value = value || (value = re_standaloneAttributes.test(name) ? name : "");
attributes.push({name: name, value: value});
});
options.push({text: text || "", attributes: attributes});
// Reset attributes for each element
attributes = [];
});
createOption = (function() {
var option = document.createElement("option");
return function() { return option.cloneNode(true) };
})();
forEach(options, function(option) {
optionElement = createOption();
// optionElement.text doesn't work on ie 7-8
optionElement.textContent = optionElement.innerText = option.text;
forEach(option.attributes, function(attribute) {
optionElement.setAttribute(attribute.name, attribute.value);
});
if (targetElement !== undefined) {
targetElement.appendChild(optionElement);
} else {
optionElements.push(optionElement);
}
});
return optionElements;
}