Liebe Cracks: Ich habe eine DHTML-Version des chinesischen Brettspiels Mahjongg im Netz stehen (http://www.thomasweibel.ch), das unter Windows-Browsern wie MSIE 5.x, 6.x, und Mozilla 0.6x und 1.0 gut läuft. Für alle komplexeren Funktionen (unlimitierte Zugrücknahme, Zugzähler, Zuganzeige, Spiel wiederholen) benötige ich Arrays, die ich auf- und wieder abbaue. Dabei stosse ich auf ein Problem bei der Kompatibilität mit Macintosh-Browsern: Offensichtlich unterstützt MSIE 5.x für Mac die Befehle
MeinArray.push();
MeinArray.shift();
MeinArray.pop();
nicht, was ich einigermassen skandalös finde. Um Mac-Fans nicht allzu sehr zu brüskieren, habe ich mittels brutaler Browserweiche die Macs auf die unmittelbarsten Spielfunktionen setzen müssen (nur der Button "Neues Spiel"); die genannten Funktionen erscheinen nur auf Nicht-Mac-Systemen - eine mehr als nur unelegante Lösung. Meine Frage: Gibt's taugliche und, da ich auf knappen Code achte, kurze Alternativen für push, shift, pop? Ein Riesendank für entscheidende Tipps! twb
Hallo Crack,
hier mein Vorschlag:
Rufe beim Macintosh jedesmal, wenn Du mit MeinArray=new Array() ein neues Array erzeugst, die folgende Funktion MacArray(MeinArray) auf, dann sollte es gehen.
function MacArray(obj)
{ obj.push=mac_push;
obj.shift=mac_shift;
obj.pop=mac_pop;
}
function mac_push(vv)
{ var ll=this.length;
this[ll]=vv;
return(ll+1);
}
function mac_shift()
{ var ii, vv=this[0];
for (ii=1; ii<this.length; ii++)
this[ii-1]=this[ii];
return(vv);
}
function mac_pop()
{ var vv, ll=this.length;
if (ll>0)
{ vv=this[ll-1];
this.length=ll-1;
}
}
Ich weiß leider nicht, wie man in JS den Constructor new Array() überschreiben kann, oder wie man beispielsweise ein Objekt array definieren kann, welches alle Eigenschaften vom (vordefinierten) Objekt Array erbt, deshalb ist hier der (unästhetische) Funktionsaufruf MacArray() notwendig. Vieleicht weiß ja jemand, wie man das besser machen könnte, das würde mich echt intessieren.
MfG. Lutz T.