11

我在IE8中發現了bestbuy.com上的一個錯誤,我似乎無法理解它發生的原因。 IE8也出現在comcast.com和raymourflanigan.com等網站上,但不在google.com或godaddy.com上。BestBuy的網站上的Internet Explorer 8中的奇怪角落行爲

下面的代碼拋出一個"Invalid procedure call or argument"錯誤(特別是最後一行是什麼引發錯誤):

var p = document.createElement("p"); 
var holder = Element.prototype.appendChild; 
holder.apply(document.body, [p]); 

這是很奇怪的,因爲我已經在IE8其他網站嘗試過了,它像一個魅力。我嘗試使用.call而不是.apply,甚至將原始的appendChild方法的引用存儲到Element原型上的另一個變量,但是這兩種嘗試都拋出了相同的錯誤。

這是什麼造成的?

+0

對我來說,這在bestbuy網站上沒有任何問題在控制檯上工作。儘管它不完全是IE8,而是IE10中的IE8模式。 – 2013-05-02 03:38:27

+0

@TomasKirda是的,用虛擬機在IE8中試試它,讓我知道它是否有效。 – 2013-05-02 04:04:34

+0

對不起,我不明白你爲什麼不簡單地使用document.body.appendChild(p); – 1nfiniti 2013-05-04 05:56:22

回答

9

編輯

「什麼樣的代碼會可能導致這個錯誤?」

看起來這個錯誤與document.body由於頁面處於嚴格模式而不可用有關。該模式進入在百思買作爲指令的結果:

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> 

至於Internet Explorer中的選項chrome=1創建Google Content Frame (GCF)將強制頁面在嚴格模式下進行操作。 comcast.com由於其使用XHTML的doctype標頭而處於嚴格模式。

There are various ways to enter document modes in IE

在嚴格模式頁是的淨結果是,呈現表面在document.documentElement變得可用。

var p = document.createElement("p"); 
p.innerHTML = "APPEND"; 
var holder = Element.prototype.appendChild; 
holder.apply(document.documentElement, [p]); 

我爲了測試這種行爲使這個小提琴:此代碼將在觀看區域的底部添加文本和一個段落http://jsfiddle.net/LAkQk/

我第一次決定測試這種行爲多個瀏覽器。

在chrome,firefox,safari和IE8中運行沒有錯誤。

請注意,要測試這個小提琴(或任何真正的)ie8上,您必須使用/embedded,然後單擊「結果」。

因此,讓我們首先確認這些網站上存在導致衝突的內容。


我能重複上bestbuy.com使用IE8的錯誤,並確認其在google.com

但是沒有工作,這是applyappendChild每一個問題說。這是通過document.body特別是一個問題。你可以在bestbuy.com與此代碼測試這個自己:

(function(){ 
var p = document.createElement("p"); 
p.innerHTML = "APPEND"; 
var holder = Element.prototype.appendChild; 
var d = document.getElementById("header"); 
holder.apply(d, [p]); 
})() 

也許是因爲貼在身上作爲他們的插件之一的結果的東西。有趣的是,這起即控制檯工作在bestbuy.com

$("body").append('<p>Append!</p>'); 

我通過一些插件的看了看,找不到這是造成過載或衝突的準確代碼行,但它必須在那裏,更多的這可能是由於嗅探用戶代理的結果。

+0

有趣。沒有意識到它是特定於'document.body'。什麼樣的代碼可能會導致此錯誤?你能想出任何解決錯誤的方法(同時仍然可以使用'document.body')嗎? – 2013-05-05 00:27:48

+0

@JustinMeltzer - 我無法找到哪個代碼是原因。也許有一個函數調用的攔截,或許一個iframe被用作預防工具(不太可能),或者'body'在某種自定義實現中特別重載。 – 2013-05-05 00:44:51

+0

@JustinMeltzer - 查看編輯瞭解更多信息。 – 2013-05-08 22:13:00

1

調試器說「'元素'是未定義的」對於Travis'代碼,並且當我加載頁面時收到的唯一JS異常是'hasAttribute'是一種不被支持的方法。這兩種情況只有在IE8以兼容模式(文檔模式:IE7標準)加載頁面時纔會發生,但可能是我加載了一個不同於您的頁面:您的代碼使用Element,因此該例外與Travis的代碼相同。 這裏是答案:

What's IE take on HTMLDocument and HTMLElement

沒有 '元素' 在IE7。

相關問題