11

Ich habe einen Fehler auf bestbuy.com in IE8 gefunden und ich kann nicht verstehen, warum es auftritt. Es tritt auch in IE8 auf Websites wie comcast.com und raymourflanigan.com auf, aber nicht auf google.com oder godaddy.com.Sehr seltsames Verhalten in der Ecke von Internet Explorer 8 auf der Website von BestBuy

Der folgende Code wirft einen "Invalid procedure call or argument" Fehler (insbesondere die letzte Zeile ist, was den Fehler wirft):

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

Das ist sehr seltsam, weil ich es in anderen Websites in IE8 habe versucht, und es funktioniert wie ein Charme. Ich versuchte mit .call anstelle von .apply, und sogar eine Referenz auf die ursprüngliche appendChild Methode zu einer anderen Variablen auf dem Element-Prototyp speichern, aber beide dieser Versuche warf den gleichen Fehler.

Was verursacht das?

+0

Für mich funktionierte dies auf Bestbuy-Website ohne Probleme in der Konsole. Es ist zwar nicht IE8 aber IE8 Modus in IE10. –

+0

@TomasKirda Ja, versuche es in IE8 mit einer VM und lass es mich wissen, wenn es funktioniert. –

+0

Sorry für die Umleitung der Frage, aber ich verstehe nicht, warum Sie nicht einfach document.body.appendChild (p) verwenden; – 1nfiniti

Antwort

9

bearbeiten

"Welche Art von Code möglicherweise diesen Fehler verursachen könnte?"

Es scheint, dass der Fehler damit zusammenhängt, dass die document.body nicht verfügbar ist, weil die Seite im strikten Modus ist. Der Modus wird bei bestbuy als Folge der Richtlinie eingetragen:

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

In Bezug auf Internet Explorer die Option chrome=1 schafft eine Google Content Frame (GCF) die Seite zwingen wird im Strict-Modus zu betreiben. comcast.com befindet sich im strikten Modus aufgrund seines Doctype-Headers unter Verwendung von XHTML.

There are various ways to enter document modes in IE

Das Nettoergebnis der Seite im Strict-Modus ist, dass die Rendering-Oberfläche bei document.documentElement verfügbar wird. Dieser Code wird von Text und einen Absatz am unteren Rand des Ansichtsbereichs anhängen:

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

Ich habe diese Geige, um dieses Verhalten zu testen: http://jsfiddle.net/LAkQk/

ich zum ersten Mal dieses Verhalten zu testen entschieden mehrere Browser

Läuft ohne Fehler in Chrome, Firefox, Safari und IE8.

Beachten Sie, dass, um diese Geige (oder wirklich) auf ie8 zu testen, müssen Sie /embedded verwenden und klicken Sie dann auf "Ergebnis".

Also lassen Sie uns mit der Bestätigung beginnen, dass auf diesen Seiten etwas ist, das den Konflikt verursacht.


konnte ich den Fehler mit IE8 auf bestbuy.com wiederholen und zu bestätigen, dass es bei google.com

Allerdings funktioniert, dann ist dies nicht ein Problem mit apply oder appendChild pro sagen.Es ist speziell ein Problem mit der document.body übergeben. Sie können selbst testen diese mit diesem Code bei 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]); 
})() 

Vielleicht ist es wegen etwas, an dem Körper angebracht ist, als Ergebnis eines ihrer Plugins. Komisch, funktioniert diese von der Konsole dh bei bestbuy.com

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

ich durch eine Reihe von Plugins angesehen und kann nicht die genaue Codezeile finden, die die Überlastung oder Konflikt verursacht, aber es muss es sein, mehr als wahrscheinlich als Ergebnis des Schnüffelns des Benutzeragenten.

+0

Interessant. Ich wusste nicht, dass es spezifisch für "document.body" war. Welche Art von Code könnte möglicherweise diesen Fehler verursachen? Können Sie sich den Fehler irgendwie vorstellen (während Sie immer noch "document.body" verwenden können)? –

+0

@JustinMeltzer - Ich konnte nicht finden, welcher Code die Ursache war. Vielleicht gab es eine Unterbrechung des Funktionsaufrufs, vielleicht wurde ein Iframe irgendwie als Präventionswerkzeug verwendet (unwahrscheinlich), oder vielleicht wurde "Körper" für irgendeine Art von kundenspezifischer Implementierung speziell überlastet. –

+0

@JustinMeltzer - Siehe bearbeiten für weitere Informationen. –

1

Debugger sagt "'Element' ist undefined" für Travis 'Code und die einzige JS-Ausnahme, die ich erhalte, wenn ich die Seite lade, ist' hasAttribute 'ist eine nicht unterstützte Methode. Beides passiert nur, wenn der IE8 die Seite im Kompatibilitätsmodus lädt (Document Mode: IE7 Standards), aber wahrscheinlich lade ich eine andere Seite von Ihnen: Ihr Code verwendet Element, so dass die Ausnahme dieselbe wie für Travis 'Code wäre. Und hier ist die Antwort:

What's IE take on HTMLDocument and HTMLElement

Es gibt kein 'Element' in IE7.