11

IE8のbestbuy.comにバグが見つかりました。なぜそれが発生するのかわかりません。また、comcast.comやraymourflanigan.comなどのサイトでIE8で発生しますが、google.comやgodaddy.comでは発生しません。BestBuyのWebサイトのInternet Explorer 8で異常なコーナーケースの動作

次のコードは、"Invalid procedure call or argument"エラー(特に最後の行はエラーをスローするものである)スロー:

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

を私はIE8で他のウェブサイトでそれを試してみたし、それがAのように動作しますので、これは非常に奇妙ですチャーム。私はの代わりに.callを使用し、元のappendChildメソッドへの参照をElementプロトタイプの別の変数に格納しようとしましたが、両方の試みで同じエラーが発生しました。

この原因は何ですか?

+0

私にとっては、これはコンソールで問題なくベストサイトのウェブサイトで動作しました。それはIE8ではなくIE8モードです。 –

+0

@TomasKirdaええ、IE8でVMで試してみて、それが動作すれば教えてください。 –

+0

質問には申し訳ありませんが、単にdocument.body.appendChild(p)を使用していない理由はわかりません。 – 1nfiniti

答えて

9

編集

"コードのどのような可能性が、このエラーを引き起こす可能性が?"

このエラーは、ページが厳格なモードであるために利用できないというエラーに関連しているようです。モードはディレクティブの結果としてはBestBuyで入力されます。インターネットエクスプローラに関して

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

、オプションchrome=1Google Content Frame (GCF)がstrictモードで動作するようにページを強制します作成されます。 comcast.comは、doctypeヘッダーがXHTMLを使用しているため、厳密なモードになっています。

There are various ways to enter document modes in IE

strictモードにあるページの最終結果は、レンダリング面が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を使用し、次に「結果」をクリックする必要があります。

したがって、競合の原因となっているサイトに何かがあることを確認してから始めることができます。


私はしかし、これはapplyまたはappendChildあたりでない問題ですbestbuy.comにIE8を使用してエラーを繰り返すことは、それはgoogle.com

で仕事をしたことを確認することができましたいう。具体的には、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'を使うことができます)? –

+0

@JustinMeltzer - 原因コードが見つかりませんでした。おそらく、関数呼び出しの傍受があったかもしれません。おそらくiframeが何らかの形で防止ツール(おそらく)として使用されたか、おそらく 'body'が何らかのカスタム実装のためにどこかで過負荷になっています。 –

+0

@JustinMeltzer - 詳細は編集を参照してください。 –

1

デバッガはTravisのコードで "Element 'が定義されていないと言います。ページをロードするときにJS例外が発生するのは、' hasAttribute 'がサポートされていないメソッドだということです。どちらも、IE8が互換モード(Document Mode:IE7 Standards)でページをロードするときにのみ発生しますが、おそらく私はあなたのコードとElementを使います。

What's IE take on HTMLDocument and HTMLElement

がIE7には '要素' がありません: そして、ここでは答えです。

関連する問題