Internet Explorer 8和getElementsByTagName('script')无法正常工作

时间:2014-09-29 22:19:18

标签: 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');
  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不是一个选项。

3 个答案:

答案 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 );
      }
    }
  }
};