Array.indexOf("String") läuft in FF, nicht aber in MSIE
twb
- javascript
Liebe alle - es scheint, dass ich bei keinem meiner Webspiele ohne Hilfe von Euch Experten auskomme. Selbst das Forumsarchiv hat mir in diesem Fall nicht weitergeholfen.
Diesmal habe ich ein Master Mind geschrieben, das auf www.mah-jongg.ch/mastermind steht. Es enthält ein Skript, das mittels Array.indexOf("irgendwas") das Vorkommen eines Strings prüft. Das Problem ist in Firefox keines, weil der das Skript anstandslos ausführt und die Fehlerkonsole schweigt. Hier läuft mein Spiel anstandslos. Der MSIE will dagegen von dieser Zeile hier nichts wissen (Meldung: "Fehler auf Zeile 113; Das Objekt kennt die Eigenschaft oder Methode nicht"):
if (Array.indexOf(Anderer_Array[index])!=-1&&(...))
Ebenso problematisch ist offenbar die Zeile
Array[Array.indexOf(Anderer_Array[index])]="String";
Das ganze Skript steht auf www.mah-jongg.ch/mastermind/engine.js - was mach' ich falsch? Weshalb gaukelt mir mein Referenzbrowser Firefox vor, alles sei in Ordnung, und MSIE und Opera belehren mich eines Schlechteren?
Mit grossem Dank für kundige Hilfe, twb
Der MSIE will dagegen von dieser Zeile hier nichts wissen (Meldung: "Fehler auf Zeile 113; Das Objekt kennt die Eigenschaft oder Methode nicht"):
So sieht's aus, die funktion ist relativ neu daher auch nichts im Archiv und wird bisher soweit ich weiss nur vom FF umgesetzt. Du musst dir dazu selber eine Erweiterung schreiben, was aber in dem Fall relativ einfach ist
if(!Array.indexOf)
{
Array.prototype.indexOf = function(el)
{
for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
}
}
Struppi.
hi,
if(!Array.indexOf)
{
Array.prototype.indexOf = function(el)
{
for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
return -1;
}
}
Dieses return sollte man vielleicht noch ergänzen, damit man auch im Nicht-Erfolgsfall einen klar definierten Rückgabewert erhält.
(Ich nehme an, beim nativ implementierten Array.indexOf dürfte der auch -1 lauten, analog zu ähnlichen Methoden?)
gruß,
wahsaga
--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
Dieses return sollte man vielleicht noch ergänzen, ...
natürlich.
Struppi.
Hallo wahsaga.
if(!Array.indexOf)
{
Array.prototype.indexOf = function(el)
{
for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
return -1;
}
}
>
> Dieses return sollte man vielleicht noch ergänzen, damit man auch im Nicht-Erfolgsfall einen klar definierten Rückgabewert erhält.
> (Ich nehme an, beim nativ implementierten Array.indexOf dürfte der auch -1 lauten, analog zu ähnlichen Methoden?)
[Exakt](http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf).
Einen schönen Mittwoch noch.
Gruß, Mathias
--
ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
debian/rules
hi,
Und da dort noch ein optionaler fromIndex erwähnt wird, könnte man die Methode auch noch dazu kompatibel erweitern:
if(!Array.indexOf)
{
Array.prototype.indexOf = function(el, fromIndex)
{
// fromIndex
// The index at which to begin the search. Defaults to 0, i.e. the whole array will be searched.
if(!fromIndex) { var fromIndex = 0; }
// If negative, it is taken as the offset from the end of the array.
// Note that even when the index is negative, the array is still searched from front to back.
// If the calculated index is less than 0, the whole array will be searched.
else if(fromIndex < 0) {
fromIndex += this.length;
if(fromIndex < 0) { fromIndex = 0; }
}
// If the index is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched.
else if(fromIndex >= this.length) { return -1; }
for(var i = fromIndex; i < this.length; i++) { if(el == this[i]) { return i; } }
return -1;
}
}
gruß,
wahsaga
hi,
Und da in der Mozilla Core JavaScript 1.5 Reference noch gesagt wird,
"indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator)",
passen wir den Vergleich auch noch an [1]:
for(var i = fromIndex; i < this.length; i++) { if(el === this[i]) { return i; } }
[1] === können aktuelle IE doch auch, oder?
gruß,
wahsaga
hi,
Und da in der Mozilla Core JavaScript 1.5 Reference noch gesagt wird,
"indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator)",
passen wir den Vergleich auch noch an [1]:for(var i = fromIndex; i < this.length; i++) { if(el === this[i]) { return i; } }
so!
Dann ist jetzt meine Schusseligkeit komplett behoben ;-)
Ich hab's übernommen.
[1] === können aktuelle IE doch auch, oder?
Meines Wissens auch ältere.
Struppi.
Hi,
[1] === können aktuelle IE doch auch, oder?
Meines Wissens auch ältere.
ja. Ältere IEs (zumindest 5.0, bei 5.5 bin ich gerade nicht sicher) haben allerdings Probleme mit dem 'in'-Operator: Dieser wird zwar bei 'for'-Schleifen unterstützt, nicht aber bei Prüfungen der Art 'if (foo in object)'.
Das hat zwar nichts mit dem Problem zu tun, ist aber in diesem Zusammenhang vielleicht für jemanden interessant :-)
Cheatah
Hallo Cheatah.
[1] === können aktuelle IE doch auch, oder?
Meines Wissens auch ältere.ja. Ältere IEs (zumindest 5.0, bei 5.5 bin ich gerade nicht sicher) haben allerdings Probleme mit dem 'in'-Operator: Dieser wird zwar bei 'for'-Schleifen unterstützt, nicht aber bei Prüfungen der Art 'if (foo in object)'.
Das hat zwar nichts mit dem Problem zu tun, ist aber in diesem Zusammenhang vielleicht für jemanden interessant :-)
Ja und zwar insofern, dass mir diese Anwendung des in-Operators bisher gänzlich unbekannt war.
Einen schönen Mittwoch noch.
Gruß, Mathias
Hallo wahsaga.
Und da dort noch ein optionaler fromIndex erwähnt wird, könnte man die Methode auch noch dazu kompatibel erweitern:
… und das Rad neu erfinden.
Einen schönen Mittwoch noch.
Gruß, Mathias
if(!Array.indexOf)
{
Array.prototype.indexOf = function(el)
{
for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
}
}
Ihr seid ja wirklich unglaublich. Erstens bin ich, trotz mittlerweile dreier DHTML-Webspiele, nach wie vor ein Dummie (wie ich u.a. hier immer wieder zu lesen bekomme, wenn ich statt DOM immer noch mit dem praktischen .innerHTML rumhantiere), zweitens hab' ich von Prototyping nach wie vor nicht die leiseste Ahnung (Nachholbedarf, jaja, ich weiss), und drittens - nun ja, klar: Struppis/wahsagas Lösung läuft auf Anhieb, klaglos und perfekt. War ja eigentlich nicht anders zu erwarten. :-)
www.mah-jongg.ch/mastermind läuft jetzt reibungslos auf MSIE, und ich denke, auch Opera wird nichts mehr dagegen haben. Mit einem so recht bernischen Riesenmerci, twb
gruss Struppi,
ich muss mal den korinthenkacker spielen,
natuerlich nur fuer das archiv, und weil es
eben doch auf ein paar feinheiten ankommt:
... Du musst dir dazu selber eine Erweiterung schreiben,
was aber in dem Fall relativ einfach ist
if(!Array.indexOf)
hier begehst Du zwei unvorsichtigkeiten auf einmal, indem
Du pruefst, ob ein *objekt* [indexOf] fuer das objekt [[Array]]
implementiert ist.
eigentlich willst Du wissen, ob eine gleichnamige *methode*
fuer das *[prototype]*-objekt von [[Array]] existiert.
die abfrage auf das generische (statisch im klassenkontext)
Array.indexOf
kollidiert bis jetzt zwar nirgendwo mit der
gleichlautenden prototypenmethode, da im moment nur
geckos sowohl die generischen [[Array]]-methoden als
auch die gleichnamigen prototypischen erweiterungen im
zuge von JavaScript 1.6 eingepflanzt bekommen haben -
dennoch gibt es den von mir nicht ganz an den haaren
herbeigezogenen fall, dass eine auf Deine art geschriebene
bibliothek im zusammenspiel mit den scripten anderer bei
einem weniger versierten dritten nicht genau das ergebnis
liefert, welches sich der letztgenannte vorgestellt haben
mochte ...
... und deswegen dann doch lieber so:
if (typeof Array.prototype.indexOf != "function") {
Array.prototype.indexOf = function (obj) {/*
code;*/
};
}
so long - peterS. - pseliger@gmx.net
Hallo,
Das ganze Skript steht auf www.mah-jongg.ch/mastermind/engine.js - was mach' ich falsch? Weshalb gaukelt mir mein Referenzbrowser Firefox vor, alles sei in Ordnung, und MSIE und Opera belehren mich eines Schlechteren?
Weil Mozilla genauso wie Microsoft proprietäre Objekte einbaut (»JavaScript 1.6«, »JavaScript 1.7«), die nirgendwo standardisiert und von den anderen Browsern nicht unterstützt werden, weil die nicht einfach jede unabgestimmte Bewegung anderer Browserhersteller mitmachen.
Mathias
gruss twb,
... Selbst das Forumsarchiv hat mir in diesem Fall nicht weitergeholfen.
dann musst Du nur weit genug zurueck und/oder spezifischer suchen?
und fuer array-iteratoren gerne auch so:
+JavaScript +Array +iterator +methode
zur bekraeftigung dessen, was Mathias schon sagte:
http://developer.mozilla.org/en/docs/New_in_JavaScript_1.6
und weil ich ohne eigenwerbung nicht auskomme, vor urzeiten
das letzte mal for (var i=0; i<arr.length; ++i) {...;}
geschrieben
habe, dies hoechst elegant finde und am liebsten haette, wenn
alle nur noch mit iteratoren arbeiteten, moechte ich die letzten
links streuen:
jsApi.Array.mozExtensions.dev.js
jsApi.Array.mozExtensions.js
jsApi.Array.mozGenerics.dev.js
jsApi.Array.mozGenerics.js
so long - peterS. - pseliger@gmx.net