2011-03-17 84 views
29

下面片JS的哪個用於IE8工作現在在IE9失敗。無效的字符DOM異常在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>'); 

我出現以下情況例外:SCRIPT5022:DOM異常:INVALID_CHARACTER_ERR(5)

是一個不按照標準的代碼上面片。這個問題的解決方法是什麼?

+0

嘗試轉義您的正斜槓'\ /' – meouw 2011-03-17 19:17:50

+4

這不是創建DOM元素的標準方式。 – 2011-03-17 19:26:48

+2

但是,對於較老的IE,這是推薦的方法: – mplungjan 2011-06-28 09:10:31

回答

29

的的createElement的API指定的構造想要一個string物種元素的名稱。看來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;"); 

http://msdn.microsoft.com/en-us/library/ms536389(v=vs.85).aspx

+0

+1 for setAttribute。 – 2011-03-17 19:26:58

+3

這是否也可以解決舊版IE的問題? – Jason 2011-09-28 13:48:18

-6

這是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); 
      } 
+0

因爲/9.0/.test(navigator.userAgent)是邪惡的,所以我低估了這個,這個bug在IE9中首先彈出來的原因是bgiframe包含/6.0/.test(navigator.userAgent)和很多IE9 UA字符串包含子字符串「6.0」。 – greim 2011-04-12 19:49:56

+2

你大概不想在IE9中的bgiframe – 2011-04-30 19:57:45

+1

greim說什麼。不要使用它,堅持使用標準DOM並使用特徵檢測。 – madr 2011-11-17 09:18:07

13

對於jQuery.bgiframe.js,將是一個更好的解決方案,以解決錯誤的IE6測試?

什麼代替它:

if($.browser.msie&&/6.0/.test(navigator.userAgent) 

像這樣的東西:

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

這個錯誤可以使用標準的JavaScript函數的名稱作爲自己的函數名稱,如果你不使用命名空間來當意外。比如我有一個名爲「屬性」的概念,我想嘗試創建者的一個新的一個新功能:點擊「富」給你什麼

  • 點擊美孚給你INVALID_CHARACTER_ERR (5)

    <button onclick="createAttribute('Pony')">Foo</button> 
    <button onclick="createAttribute('Magical pony')">Bar</button> 
    <script type="text/javascript"> 
        function createAttribute(name) { alert(name); } 
    </script> 
    
    • InvalidCharacterError: DOM Exception 5
    • 打開您的開發者控制檯,並運行createAttribute('Django')給你警告

    正在發生的事情是,按鈕調用document.createAttribute()和您的開發控制檯正在調用您聲明的函數。

    解決方案:使用不同的函數名稱或更好的名稱空間。

  • 0

    如果你願意犧牲一點性能,可以使用一個外部庫,我建議使用:

    原型JS

    var el = new Element('iframe', { 
        id: "<your id here>", 
        src: "<your source here>", 
        style: "<your style here>" 
    }); 
    

    jQuery的

    var el = jQuery('<iframe>', { 
        id: '<your id here>', 
        src: "<your source here>", 
        style: "<your style here>" 
    })[0]; 
    

    這照顧瀏覽器之間的所有不一致,並且也更漂亮:-)

    注:這是未經測試的僞代碼 - 參見Prototype JSjQuery的官方文檔頁面獲取更多信息。