Spaß mit Chrome

Chrome macht einige Sachen anders als die „Anderen“. Wenn man im Firefox entwickelt und sich dann die Sachen im Chrome anschaut kann es passieren, dass da gar nichts funktioniert.

Es liegt wohl eher daran, dass Chrome die Sachen „richtiger“ macht als die anderen, aber wenn man nicht daran denkt, kann man ziemlich lange den Fehler suchen. Hier die Sachen, die mir aufgefallen sind:

(Es geht übrigens um JavaScript und PHP 😉 )

Objekte

Angenommen, du willst eine Sortierte Key–Value– Liste an den Browser per JSON schicken und JavaScript soll die dann anzeigen.

PHP-Code (kann auch ne andere Sprache sein:

<?php
echo json_encode(array(
  'foo'=>'bar',
  'bla'=>'blubb'
));
?>

Dann dürfte beim Browser ungefähr folgendes ankommen:

{'foo':'bar','bla':'blubb'}

Soweit so klar. Bei einem Firefox, IE, etc… kann man mit JavaScript auf dieses Objekt in der „richtigen“ Reihenfolge zugreifen. Chrome sortiert das Objekt aber so, wie es will. Das ist laut JS-Spezifikation auch vollkommen ok, nur sollte man einfach darauf achten.

So macht man es richtig: (und besser)

<?php
echo json_encode(array(
  array('foo'=>'bar'),
  array('bla'=>'blubb')
));
?>

Das erzeugt folgenden JSON-Code:

[
  {'foo':'bar'},
  {'bla':'blubb'}
]

Man muss dazu natürlich auch den JavaScript-Code umschreiben, das ist dann aber Standartkomform und funktioniert in allen Browsern.

[edit]

Die Alternativvariante wäre noch Folgende:

<?php
echo json_encode(array(
  array('key'=>'foo','val'=>'bar'),
  array('key'=>'bla','val'=>'blubb')
));
?>

[/edit]

Variablendeklarationen

Es sei folgender JS-Code gegeben:

function foo(blubb) {
  if(typeof(blubb)!='Object'){
    return
  }
  var blaaa=blubb.foo;
}

Beim FF & Co macht dieser Code keine Probleme. Wenn die Funktion im Chrome aber mit einem Nicht-Objekt aufgerufen wird, schmeißt dieser einen Fehler. Warum?

Dies liegt daran, dass Chrome alle Variablendeklarationen, die mit var … anfangen stets an den Anfang der Funktion schieben. Man kann nun entweder die Variablen am Anfang der Funktion ohne Wert deklarieren oder man lagert die Variablen in einen else-Zweig aus.

Dateiupload

Das Chrome Uploads anders behandelt, als man es gewöhnt ist, habe ich bereits hier beschrieben.