2014-09-29 86 views
1

另一个用户提出了一个函数,用于将字符串转换为dom元素,然后遍历字符串并执行js。它工作正常,只是不在IE8中,令人惊讶。Internet Explorer 8和getElementsByTagName('脚本')不起作用

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不是一种选择。

回答

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

只是修剪X后。 – user1572796 2014-09-30 23:39:15

+0

这适用于我。谢谢! IE8走7路和6路时我们都会变得更好...... – 2015-02-05 01:28:47

0

根据这个其他post,使用innerHTML分离该元素的所有Dom节点,即节点在那里,但DOM不会更新以识别这些节点。解决方案是使用appendChild,它应该更新DOM并通过getElementsByTagName使这些元素可访问。

+0

虽然不能用字符串appendChild,但必须创建元素。在下一个函数中,我有所有的脚本URL,创建元素并将它们附加到DOM以执行js。还处理内联js。 – user1572796 2014-09-29 22:42:22

+0

所以基本上tempDiv.appendChild(INPUT_STRING)会返回一个err,因为它不是一个节点,但我不能'把它变成一个节点,直到我可以在ie8中获得脚本标记。感谢您的回复。 – user1572796 2014-09-29 22:43:31

+0

啊,你是对的,我跳过了枪。我们需要强制dom重新渲染,我知道有两种方法可以为IE8执行此操作以拾取css样式,即向父级div添加类或使用appendChild追加空div(两者都将应用于innerHTML之后)。这通常会导致浏览器重新渲染该元素并应用所有样式。我会假设并希望在更新CSSOM时更新DOM。试一试! – zmehboob 2014-09-29 23:02:46

0

这里是我使用的整个功能incase我错过了东西,检查是否存在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); 
     } 
    } 
    } 
};