Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IE9中的无效字符DOM异常_Javascript_Dom_Internet Explorer 9_Domexception - Fatal编程技术网

Javascript IE9中的无效字符DOM异常

Javascript IE9中的无效字符DOM异常,javascript,dom,internet-explorer-9,domexception,Javascript,Dom,Internet Explorer 9,Domexception,下面一段曾经在IE8中工作的JS现在在IE9中失败了 document.createElement('<iframe id="yui-history-iframe" src="../../images/defaults/transparent-pixel.gif" style="position:absolute;top:0;left:0;width:1px;height:1px;visibility:hidden;"></iframe>'); document.cre

下面一段曾经在IE8中工作的JS现在在IE9中失败了

document.createElement('<iframe id="yui-history-iframe" src="../../images/defaults/transparent-pixel.gif" style="position:absolute;top:0;left:0;width:1px;height:1px;visibility:hidden;"></iframe>');
document.createElement(“”);
我得到以下异常:SCRIPT5022:DOM异常:无效字符错误(5)


以上代码是否不符合标准。该问题的解决方法是什么?

createElement的API指定构造函数需要一个
字符串,该字符串指定元素的名称。IE9似乎更严格地遵循标准。您可以使用以下代码完成与您尝试执行的相同的操作:

var iframe = document.createElement("iframe");
iframe.setAttribute("id", "yui-history-iframe");
iframe.setAttribute("src", "../../images/defaults/transparent-pixel.gif");
iframe.setAttribute("style", "position:absolute;top:0;left:0;width:1px;height:1px;visibility:hidden;");

这是jquery的jquery.bgiframe.js的解决方案

if ( $.browser.msie && /9.0/.test(navigator.userAgent) ) {
                var iframe = document.createElement("iframe");
                iframe.setAttribute("class", "bgiframe");
                iframe.setAttribute("frameborder", "0");
                iframe.setAttribute("style", "display:block;position:absolute;z-index:-1;filter:Alpha(Opacity=\'0\');top:expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\');left:expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\');width:expression(this.parentNode.offsetWidth+\'px\');height:expression(this.parentNode.offsetHeight+\'px\');");
                this.insertBefore( iframe, this.firstChild );
            } else {
                this.insertBefore( document.createElement(html), this.firstChild );
            }

对于jQuery.bgiframe.js,修复错误的IE6测试是更好的解决方案吗

替换这个怎么样:

if($.browser.msie&&/6.0/.test(navigator.userAgent)
比如说:

if ($.browser.msie && $.browser.version=="6.0")

对于jquery.bgiframe.js:

我在上下载了1.1.3版本


这就解决了问题。

如果您不使用名称空间,当您意外地将标准JavaScript函数名用作自己的函数名时,可能会出现此错误。例如,我有一个称为“属性”的概念,我想尝试一个新函数,创建一个新函数:

<button onclick="createAttribute('Pony')">Foo</button>
<button onclick="createAttribute('Magical pony')">Bar</button>
<script type="text/javascript">
    function createAttribute(name) { alert(name); } 
</script>
Foo
酒吧
函数createAttribute(名称){alert(名称);}
  • 点击“Foo”什么都不会给你
  • 单击Foo将显示
    INVALID\u CHARACTER\u ERR(5)
    InvalidCharacterError:DOM异常
    5
  • 打开您的开发控制台并运行
    createAttribute('Django')
    会发出警报
发生的情况是,按钮正在调用,而开发人员控制台正在调用您声明的函数


解决方案:使用不同的函数名或更好的名称空间。

如果您愿意牺牲一点性能并可以使用外部库,我建议您使用:

原型JS

var el = new Element('iframe', {
  id: "<your id here>",
  src: "<your source here>",
  style: "<your style here>"
});
var el=新元素('iframe'{
id:“”,
src:“,
风格:“
});
jQuery

var el = jQuery('<iframe>', {
  id: '<your id here>',
  src: "<your source here>",
  style: "<your style here>"
})[0];
var el=jQuery(“”{
id:“”,
src:“,
风格:“
})[0];
这解决了浏览器之间的所有不一致性,而且更美观:-)


注意:这是未经测试的伪代码-有关详细信息,请参阅和的官方文档页。

尝试避开前斜杠
\/
这不是创建DOM元素的标准方法。但是,对于较旧的IE,建议使用此方法:|根据mplungjan的评论展开,在IE 8之前的版本中,无法对createElement()创建的元素设置name属性,这就是为什么他们建议将此方法用于较旧的IE版本。我否决了这一点,因为/9.0/.test(navigator.userAgent)是邪恶的,而这个bug首先出现在IE9中的全部原因是bgiframe包含/6.0/.test(navigator.userAgent)和许多IE9 UA字符串包含子字符串“6.0”。你大概不想像格雷姆所说的那样在IE9中使用bgiframe。不要使用它,坚持使用标准DOM并使用特性检测。我相当确定他指的是2.1.3-pre。顺便说一句,他为我工作。