Prototype und der Internet Explorer

nCL

Grünschnabel
Hallo,

kann mir einer von euch sagen warum diese Javascriptfunktion (Prototype) in jedem Browser funktioniert, nur nicht im Internet Explorer?
Code:
function init() {
	menu = new nav("menu");
	new Ajax.Updater("board","login.php",{
		evalScripts:true
	});
}

Der IE sagt immer das bei "new nav("menu")" der Fehler sei....
Meldung: "Das Objekt unterstützt diese Eigenschaft oder Methode nicht"

Falls ihr noch mehr Infos braucht sagt bitte bescheid.

Vielen Dank schonmal für eure Hilfe!
 
Moin,

ich würde mal tippen, dass es dort einen Namenskonflikt gibt.

Du hast, so vermute ich, sowohl ein Element mit der ID "menu" im Dokument, willst aber auch eine Variable mit dem Namen "menu" registrieren.

Das Problem: der IE hat die dumme Angewohnheit, Elemente, welche eine ID besitzen, unter dieser ID dem window-Objekt als Member zuzuweisen.

Da du innerhalb der Funktion die Variable "menu" ohne das Schlüsselwort "var" deklarierst, wird diese ebenfalls dem window-Objekt zugeordnet, denn dies ist in browserbasiertem JS der globale Geltungsbereich....und dieser Versuch schlägt dann fehl.

Hier mal zum Testen:
Code:
<script id="testscript" type="text/javascript">
<!--
function foo()
{
  //wird fehlschlagen
  testscript=4711;
}
function bar()
{
  //das wird klappen
  var testscript=4711;
}
foo();
bar();
//-->
</script>

Also: entweder verwendest du var, womit die Variable nicht window zugewiesen wird, oder, falls dies in deinem Fall nicht geht aufgrund deiner Anwendung, ändere eines von beiden: die ID des Elementes oder den Namen der Variable.

Es hat somit auch nichts mit prototypejs zu tun, es ist ein generelles Problem mit dem IE und JS.
 
Vielen Dank Sven! Du hast mir super geholfen! Das war genau das Problem! Habe es jetzt einfach anders genannt und alles funktioniert. Echt ein gutes Forum hier.
 
Das Problem: der IE hat die dumme Angewohnheit, Elemente, welche eine ID besitzen, unter dieser ID dem window-Objekt als Member zuzuweisen.

Huch. Wusste ich noch gar nicht. Vielleicht sollte ich doch mal ab und an den IE benutzen :rolleyes:
 
Huch. Wusste ich noch gar nicht. Vielleicht sollte ich doch mal ab und an den IE benutzen :rolleyes:

Jo, das ist schon eine dumme Sache.

Ich kann generell nur empfehlen, sich die Namenswahl immer gut zu überlegen, der wohl gebräuchlichste Fehler dürfte das submit-Problem bei Formularen sein: http://www.tutorials.de/webmaster-faq/218365-html-js-warum-funktioniert-bei-mir-submit-nicht.html

Hier mal ein Beispiel:
Code:
<form id="alert" action="AKTION"><input name="action"></form>
<script  type="text/javascript">
<!--
alert(document.forms[0].action+'\n'+
      document.forms[0].getAttribute('action'));
//-->
</script>

Man könnte denken, dass der alert dort 2x "AKTION" liefert, tut er aber nicht.
Im IE macht er garnichts(durch die ID des Formulars wurde die Methode alert() gekillt :-)), in anderen liefert er 'HTMLInputElement' (das INPUT mit dem Namen action) und 'AKTION' .

Und dann noch ein Test nur für den IE:
Code:
<script  type="text/javascript">
<!--
alert('moin');
//-->
</script>
<form id="alert" action="AKTION"><input name="action"></form>
<script  type="text/javascript">
<!--
alert(document.forms[0].action+'\n'+
      document.forms[0].getAttribute('action'));
//-->
</script>

Siehe da, auf einmal geht alert(), bei der ersten Benutzung scheint eine Art Schreibschutz darauf gesetzt worden zu Sein :suspekt:

Das Ergebnis ist aber trotzdem ein anderes in den restlichen Browsern, nämlich 2x ein Zeiger auf das <input> :-)

Daher:
Augen auf beim Namenskauf

Am Besten keine Strings verwenden, die in HTML oder JS irgendeine Bedeutung haben, und zusätzlich die Liste reservierterWörter beachten, denn es gibt einige Wörter, die in JS zwar aktuell nicht genutzt werden, aber dennoch als Vorsorge für die Zukunft reserviert sind.(z.B. goto,class oder super)
 
Zuletzt bearbeitet:
Hi,

@Sven, bei welchen IEs tritt bei dir das Phänomen mit dem ausgelöschten alert auf? Ich kann das Problem hier nicht nachstellen. Das Mitteilungsfenster wird immer angezeigt.

Der Vollständigkeit wegen noch zum anderen Problem: es gibt weiterhin noch die attributes-Eigenschaft (siehe w3.org), über die wenigstens noch ein Zugriff auf Attribute möglich ist, deren Attribut-Name dem Name eines Elements entsprechen.
Code:
<form id="alert" action="AKTION"><input name="action" value="AKTION (input)"></form>
<script type="text/javascript">
<!--
alert(document.forms[0].action.value+'\n'+document.forms[0].attributes.getNamedItem('action').nodeValue);
//-->
</script>
Ciao
Quaese
 
@Sven, bei welchen IEs tritt bei dir das Phänomen mit dem ausgelöschten alert auf? Ich kann das Problem hier nicht nachstellen.

  • 5.51.4807(XP SP3)
  • 6.0.2900(XP SP3)
  • 7.0.6000(Vista)
  • 8.0.7100(Win7)
...alle 4 verweigern den alert(), solange das Formular die ID "alert" hat.

Bei der Variante
Code:
document.forms[0].attributes('action').value
...ist das Verhalten auch anders. Nicht-IE reagieren darauf mit einer Fehlermeldung(attributes is not a function)
Lt. DOM-Specifikation ist es das auch nicht.
Lt. MS kann es das aber sein: http://msdn.microsoft.com/en-us/library/ms537438(v=VS.85).aspx

In nicht-IEs ist der Zugriff per
Code:
document.forms[0].attributes.getNamedItem('action').nodeValue;
...möglich.
 
Zuletzt bearbeitet:
Hi,

ok, jetzt tritt bei mir das Phänomen auch auf. Ich hatte in meinem Testdokument noch ein script-Tag im head-Element. Nach einigen Tests hat sich herausgestellt, dass das Verhalten nicht auftritt, wenn sich ein script-Element vor dem form-Tag befindet.

Mit folgendem Codefragment wird im IE die Meldungbox ebenfalls angezeigt. Wäre schon interessant zu wissen, was im Hintergrund passiert, wenn ein script-Tag eingebunden wird.
Code:
<script  type="text/javascript"></script>
<form id="alert" action="AKTION"><input name="action"></form>
<script  type="text/javascript">
<!--
alert(document.forms[0].action+'\n'+
      document.forms[0].getAttribute('action'));
//-->
</script>

Den Zugriff über getNamedItem als Methode des Objekts NamedNodeMap hatte ich auch gelesen, wollte jedoch nur eine Alternative für den IE aufzeigen. Auf einen Test in anderen Browsern habe ich schlampiger Weise verzichtet. Danke, dass du es klar gestellt hast. Ich habe es auch in meinem vorherigen Post geändert.

Ciao
Quaese
 

Neue Beiträge

Zurück