今天用ie9用测试,发现报js错误 DOM Exception: INVALID_CHARACTER_ERR (5)
原因是 IE9创建DOM元素的方式较之前有了改变,开始严格遵循标准的实现,不允许通过直接传入一个完整html标记的方式来创建Dom元素。
document.createElement('<iframe id="yui-history-iframe" src="http://images.cnblogs.com/defaults/transparent-pixel.gif" style="position:absolute;top:0;left:0;1px;height:1px;visibility:hidden;"></iframe>');这种方式不可以了。
解决方法:
采用标准的方式来实现:
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\');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.ui.dialog 调用了方法
if ($.fn.bgiframe) {
uiDialog.bgiframe();
}
意思就是如果jquery加载了bgiframe插件,就调用bgiframe的兼容ie6 select功能,其函数会判断是否是ie6,如果是就动态生成一个iframe遮盖住select,但之前j版本的query.bgiframe-2.1.1.js的判断有问题,ie9也会判断为true,就会执行会报错的那句语句document.createElement(html)。替换为新版本的jquery.bgiframe-2.1.2.js即可。
------------------------------------------------
以上都是很容易解决的问题,网上一查就有答案,关键我是照着网上的做了,还是报错。让我无从下手,改了jquery.bgiframe-2.1.2.js的代码,在ie上用开发人员工具debug发现没有一点变化,我甚至删除了这个js,但juery仍有这个函数。我在项目里全盘搜索这个函数名,都搜不到,完全不知道jquery怎么加载这个函数的。被卡了好久,以为是我自己对js不熟悉,哪里不懂。
一时我突然想到去看下jsp页面加载js的代码,一行一行看加载了哪些js,都是加载项目本地的js,然后突然发现有一个js不是加载的本地的。我像发现新大陆一样,一下子就觉得问题在这里。点进去看这个js,这个js是公司自己写的,用来联想工号的,这个js其他项目都在用,写好很久了,这个js也写了bgiframe的函数。肯定是用的旧版本iframe的判断。
找到原因了,jsp页面先引用我的jquery.bgiframe-2.1.2.js,然后又引用这个js, 就把新的函数又覆盖为旧的了。我把jquery.bgiframe-2.1.2.js的引用放在这个js后面就解决了。
真是定位问题99%的时间,修只要很小的一下操作啊。
我最大的疏忽就是忘了jsp可以引用项目外,网络上的js了。这个肯定可以,只是经验少了,没想到,一直以为是自己哪些地方没考虑到呢。要相信自己,能力还是很强的。