另一个用户提出了一个函数,用于将字符串转换为dom元素,然后迭代字符串并执行js。它在IE8中工作正常,令人惊讶。
function get_script_src_from_string (INPUT_STRING) {
var tempDiv = document.createElement('div');
tempDiv.innerHTML = INPUT_STRING;
var scripts = tempDiv.getElementsByTagName('script');
var script_urls = [];
for (var i=0; i<scripts.length; i++) {
script_urls.push(scripts[i].src);
}
return script_urls;
}
我只是传入一个测试字符串:
get_script_src_from_string('<div class="tester" id="tester"><script id="tester2" type="text/javascript">alert("test");</script></div>');
如果我用
进行测试var test = tempDiv.getElementsByTagName('*');
alert(test.length);
所有浏览器返回2,ie8返回1,因此它不会将脚本识别为标记。不幸的是,使用jquery不是一个选项。
答案 0 :(得分:1)
function get_script_src_from_string (INPUT_STRING) {
var frag = document.createDocumentFragment();
var tempDiv = frag.appendChild( document.createElement('div'));
tempDiv.innerHTML = 'X' + INPUT_STRING;
var scripts = tempDiv.getElementsByTagName('script');
var script_urls = [];
for (var i=0; i<scripts.length; i++) {
script_urls.push(scripts[i].src);
}
return script_urls;
}
在输入字符串之前添加字符并创建doc片段似乎适用于IE8和所有其他真实浏览器。
答案 1 :(得分:0)
根据另一个post,使用innerHTML分离该元素的所有Dom节点,即节点在那里但是DOM没有更新以识别那些节点。一个解决方案是使用appendChild,它应该更新DOM并通过getElementsByTagName使这些元素可访问。
答案 2 :(得分:0)
这是我正在使用的整个函数,我错过了一些东西,检查jquery是否存在,如果不使用本机js追加。 TODO:除了样式之类的脚本之外,还修复了某些标记名称。
_append = function(selector, d) {
if(typeof(selector)=='string') selector =_select(selector);
if(typeof(selector)!='object'||typeof(d)!='string') {
return false;
}
if(typeof(jQuery)=='function') return (jQuery(selector).append(d)||false); // jQuery available
var content = d;
content = Array.prototype.concat( [], content );
if(content.length) {
var frag = document.createDocumentFragment();
var tmp = frag.appendChild( document.createElement('div'));
tmp.innerHTML = 'X' + content;
var scripts = tmp.getElementsByTagName('script');
// Append html.
if(selector) {
selector.insertAdjacentHTML('beforeend', content);
} else {
console.log('Invalid selector provided.');
}
for(var i=0; i<scripts.length; i++) {
var newScript = document.createElement('script');
if(scripts[i].id) {
newScript.id = scripts[i].id;
}
if(scripts[i].src) {
newScript.type = 'text/javascript';
newScript.src = scripts[i].src;
document.getElementsByTagName('head')[0].appendChild(newScript)
} else {
var nscript = document.createElement('script');
var js = scripts[i].innerHTML;
nscript.text = js;
document.getElementsByTagName('head')[0].appendChild( nscript ).parentNode.removeChild( nscript );
}
}
}
};