Javascript Internet Explorer 8和getElementsByTagName(';脚本';)不工作

Javascript Internet Explorer 8和getElementsByTagName(';脚本';)不工作,javascript,internet-explorer,Javascript,Internet Explorer,另一个用户建议使用一个函数将字符串转换为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

另一个用户建议使用一个函数将字符串转换为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;

}
所有浏览器都返回2,ie8返回1,所以它不会将脚本识别为标记。不幸的是,在这个项目中使用jquery不是一个选项。

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

函数get_script_src_from_string(输入_string){
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;

}
var frag=document.createDocumentFragment(); var tempDiv=frag.appendChild(document.createElement('div'); tempDiv.innerHTML='X'+输入字符串; var scripts=tempDiv.getElementsByTagName('script'); var脚本_url=[];
对于(var i=0;i,这里是我正在使用的整个函数。如果我遗漏了什么,请检查jquery是否存在,如果没有使用原生js append。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 );
      }
    }
  }
};
\u append=函数(选择器,d){
if(typeof(selector)='string')selector=\u select(selector);
if(typeof(选择器)!='object'| | typeof(d)!='string'){
返回false;
}
if(typeof(jQuery)='function')返回(jQuery(selector).append(d)| | false);//jQuery可用
var含量=d;
content=Array.prototype.concat([],content);
if(content.length){
var frag=document.createDocumentFragment();
var tmp=frag.appendChild(document.createElement('div');
tmp.innerHTML='X'+内容;
var scripts=tmp.getElementsByTagName('script');
//附加html。
如果(选择器){
selector.insertAdjacentHTML('beforeend',content);
}否则{
console.log('提供的选择器无效');
}

对于(var i=0;iyou不能用字符串追加Child,但是,您必须创建元素。在下一个函数中,我拥有所有脚本URL,创建元素并将它们追加到dom以执行js。同时处理内联js。因此基本上是tempDiv.appendChild(输入字符串)将返回一个错误,因为它不是一个节点,但在ie8中获得脚本标记之前,我无法将其转换为节点。不过感谢您的回复。啊,您是正确的,我跳过了这一步。我们需要强制dom重新渲染器,我知道ie8有两种方法可以实现这一点,即向父div添加类或使用应用程序endChild追加一个空div(两者都将在innerHTML之后应用)。这通常会导致浏览器重新渲染该元素,并应用所有样式。我假设并希望它在更新CSSOM时更新DOM。试一试!只需在之后修剪X。这对我很有用。谢谢!当IE8取代7和6时,我们都会过得更好。。。
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;

}
_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 );
      }
    }
  }
};