"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[JavaScript] JSON lesen

prayerslayer 04.06.2010 - 18:44 6088 46
Posts

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Hallo,

vorneweg: Ich bin ein JavaScript-Noob.

Bei unserem Webportal zur Ferienhausverwaltung (Uniprojekt, nix wofür ich Geld bekomm) wird auf der Startseite eine Bing Map angezeigt, welche die verfügbaren Häuser anzeigen soll. Die Häuser haben Latitute und Longitude gespeichert und mein Plan war die Daten JSON-formatiert irgendwie ins HTML Dokument zu schreiben, das eben auch die Karte enthält. Nach dem Laden der Karte wird mit JS der JSON-Block ausgelesen und die Pushpins in die Karte eingefügt.

Erster Versuch mit hidden input field: Läuft nicht, da JSON Anführungszeichen enthält. Und wenn ich die escape ist es ja kein JSON mehr, oder?

Zweiter Versuch mit div-Block und opacity=0: Hab eben dank Chrome Dev Tools herausgefunden, dass document.getElementById(jsonID) NICHT den Inhalt des div-Blocks zurückgibt :(

Jetzt bin ich ein bisschen ratlos, vor allem weil es sicher bessere Lösungen gibt. Hat bitte wer einen Tip?

tia!
Bearbeitet von prayerslayer am 07.06.2010, 10:20

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
Mit "JSON-formatiert irgendwie ins HTML" kann ich jetzt nicht viel anfangen .. was soll das Ziel sein? Wenn du von hidden input sprichst, meinst du also nicht dem User irgendwie präsentieren?

document.getElementById macht im Prinzip was der Name sagt "hol mir das DOM Element mit der angegebenen ID", siehe z.B. https://developer.mozilla.org/en/DO....getElementByID .

Um den Inhalt eines Dom-Elementes zu lesen oder zu setzen gibts mehrere Wege und je nach Browser funktionieren die anders, würde daher vorschlagen eine JS Lib zu verwenden die das X-Browser macht, z.B. jQuery.

Musst du jetzt aber nicht verwenden, wenn du genauer beschreiben kannst was dein Ziel ist, gehts vermutlich ohne auch.

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Allgemeines Ziel ist dass in der Karte Pins angezeigt werden, die eine Kurzbeschreibung des jeweiligen Hauses, ein Bild und solche Sachen enthalten. Mit KML-Daten in Layer importieren (ähnlich wie hier unter "Import data into shape layers") hab ich es auch schon probiert. Das würde gehen, ist aber unpraktikabel weil die KML Datei im Internet sein muss.

Zitat von Rektal
Mit "JSON-formatiert irgendwie ins HTML" kann ich jetzt nicht viel anfangen .. was soll das Ziel sein? Wenn du von hidden input sprichst, meinst du also nicht dem User irgendwie präsentieren?
Ist in der Tat ungenau formuliert, sorry :D Das "irgendwie" kommt daher, da ich nicht weiß, was die beste Variante ist. Es soll nur für JS lesbar im HTML Dokument stehen. Der User soll das JSON nicht sehen (wozu auch?). Das Ziel ist, dass eine JS-Funktion das JSON lesen und umwandeln kann, damit sie dann die Pushpins zur Karte hinzufügt.

Zitat von Rektal
document.getElementById macht im Prinzip was der Name sagt "hol mir das DOM Element mit der angegebenen ID", siehe z.B. https://developer.mozilla.org/en/DO....getElementByID
Hab ich gemerkt. Dachte aber, dass ohne weitere Angaben der Inhalt geliefert wird.

Zitat von Rektal
Um den Inhalt eines Dom-Elementes zu lesen oder zu setzen gibts mehrere Wege und je nach Browser funktionieren die anders, würde daher vorschlagen eine JS Lib zu verwenden die das X-Browser macht, z.B. jQuery.
Hm, jQuery haben wir sowieso schon drin. Welchen Teil der Library sollte ich mir da anschauen?

//Edit: Ah, feine Sache. Mit $('#jsonID').html() gehts :) Nur will jetzt die eval-Funktion mein valides JSON nicht lesen :o

///Edit: Statt eval() JSON.parse() und Variable richtig ansprechen, dann funktionierts :) Danke für den Hint auf jQuery!
Bearbeitet von prayerslayer am 04.06.2010, 19:54

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Doch nicht ganz solved, ich hab hier eine Verständnisfrage.

Laut meinem alert() wird $(document).ready() nur auf der Startseite aufgerufen und nicht bei jedem Seitenaufruf. Gehört das so? :confused: Der Header, wo die Scripts drinstehen, ist bei jeder Seite derselbe, kanns sein dass der gecached wird? Aber dann müsste ja beim 2. Aufruf der Startseite auch kein alert() mehr kommen, was aber der Fall ist. Ich bin verwirrt :(

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
Schau mal mit Firebug ob auf den anderen Seiten auch wirkliche alle Daten geladen werden konnten (sprich JS), nicht das es da wegen Pfaden oder so 404er Fehler gibt.

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Ich hab laut Chrome Dev Tools eine uncaught Exception im JS der Bing Maps. Allerdings hab ich auf die keinen Einfluss und viel wichtiger: Auf der betreffenden Seite ist keine Karte. Die anderen Skripts werden geladen und mein eigener Code zeigt keine Fehler.

Nur dass jQuery hier anscheinend 2x geladen wird (hä?), finde ich seltsam:
click to enlarge

Quellcode: http://pastebin.org/313356

//Andererseits werden alle Skripts 2x geladen... Hm.

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
Würde ich zuerst mal fixen, hatte ich letzte Woche auch: 2 Mal geladen, nix ging.

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Okay. Tut mir leid, dass ich mich so blöd anstelle, aber was kann der Grund dafür sein, dass Skripts 2x geladen werden? Den Header, der in jeder Seite eingebunden wird, gibt es nur einmal und dort stehen die JS Sachen offensichtlich auch nur 1x drin. :confused:

//Jedenfalls scheint das wirklich das Problem zu sein, auf allen anderen Seiten werden Skripts 2x geladen.
Bearbeitet von prayerslayer am 07.06.2010, 01:05

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
Uhm .. kenne die Chrome Dev-Tools nicht ... musst analysieren wie es dazu kommt; wenn du es nicht offensichtlich als 2. URL wo stehen hast wird es ev. über einen JS code dynamisch geladen. Firebug Netview und ev. Fiddler2 ftw.

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
einfach mal versuchen die Zeile auszukommentieren, wo das Skript "normal" geladen wird und schaun, ob es dann nur einmal oder gar nicht geladen wird ;)

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Stand der Dinge: Die Netzwerkansicht von Firebug sagt, dass auf der Startseite die Skripte normal 1x geladen werden. Danach aber gar nicht mehr. Auskommentieren der <script> Tags im Header bewirkt, dass die Skripts nicht mehr geladen werden.

Ich hab im Moment ja das ModelAndView Objekt und die Controller des Spring Frameworks in Verdacht, dass die irgendwas cachen/speichern und so erneutes Laden verhindern.

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
wtf :) Na hey, ich drück die Daumen .. würde das "solved" vielleicht weg nehmen, und keep us updated ;)

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Update: Liegt nicht dran, dass Scripts 2x geladen werden - jQuery Datepicker läuft.

Was ich herausgefunden habe: $(document).ready() wird auf jeder Seite aufgerufen, die eine Bing Map enthält, bei anderen nicht :D WTF!

//Habe document.ready abgeändert und frage auf null ab - schätz dass es deswegen auf Seiten ohne Map nicht funktioniert hat.

http://pastebin.org/315437

Nur jetzt kommt gar kein alert mehr. Nie. Karten und Datepicker funktionieren aber :confused:
Bearbeitet von prayerslayer am 07.06.2010, 13:57

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4452
Ok, was anderes; nicht unbedingt die beste Lösung aber: wir hatten X-Browser auch nicht gerade gute Erfahrungen mit document.ready() gemacht und im Endeffekt es so umgebaut, das das <script> mit der Initialisierung am Ende, nach dem letzten DOM-Element (vor </body>;) steht; ohne zusätzliche on<irgendwas> event listening.

Am dem Zeitpunkt waren das Behavior über alle Browser wirklich das selbe. HTH ... wobei, unser Target ist auch IE6 *gulp* gewesen, YMMV.

Btw, kannst nicht die Live-URL posten? Wäre einfacher ;)
Bearbeitet von Rektal am 07.06.2010, 14:16

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Ein Skript vor </body> gefällt mir nicht so, weil ich dann ein include in jede JSP bauen muss. Behalte ich aber als Notlösung im Hinterkopf, danke :)

Live-URL is leider blöd, weil das Ding gar nie wirklich online gehen soll läufts halt nur lokal :( Und ich hab keine Lust mir einen free Webspace mit Tomcat zu suchen...

Was anderes: Manchmal funktioniert die Karte aus heiterem Himmel nicht, weil laut Dev Tools "GetMap not defined" ist. Die steht aber 1 Skript drüber, sieht man eh im ersten pastebin-Link, und war sonst auch immer da. An der Reihenfolge der Skripts habe ich nichts geändert, Working Directory gecleaned etc. hab ich auch. Absichtlich hab ich sie dann nicht mehr zum Laufen gebracht.
Bearbeitet von prayerslayer am 07.06.2010, 14:24
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz