[JS:jQuery/html] Selectmenü: option-felder ein und ausblenden?

topfkanne

♪ ♫
ID: 80534
L
20 April 2006
1.578
159
Hallo.

Ich habe seit zwei Stunden folgendes Problemchen:

Ich habe zwei Selectmenüs.

Stadtauswahl:
HTML:
<select id="stadt" name="stadt">
<option value="choose">Bitte wählen</option>
<option value="Köln">Köln</option>
<option value="Bonn">Bonn</option>
</select>

Locationauswahl:
HTML:
<select id="ort" name="ort"  disabled="disabled">
<option value="choose">Bitte zuerst Stadt wählen</option>				<option label="Köln" value="1">Stadtgarten</option>
<option label="Köln" value="2">Bogen 2</option>
<option label="Köln" value="3">Studio</option>
<option label="Bonn" value="5">Session</option>
<option label="Köln" value="6">Artheater</option>				<option label="Bonn" value="7">3-Raum-Wohnung</option>
</select>

Dazu folgendes Javascript:
PHP:
$(document).ready(function(){ 

	$("#stadt").change(function () {
	
		var stadtAuswahl = $("#stadt").val();
		$("#ort option").removeClass("hidden");
                $("#ort option").each(function(){
			var option = $(this);
                        var stadt = option.attr("stadt");
			$("#ort option[stadt='"+stadtAuswahl+"']").addClass("hidden");
    	});
		
		$("#stadt option[value='choose']").remove();
		$("#ort option:first").text("Bitte wählen").attr("selected","selected");
		$("#ort").removeAttr("disabled");
		
	})
});

Funktion im Moment:
Ich wähle eine Stadt aus und das Javascript blendet alle option-Felder, bei denen label nicht der ausgewählten Stadt entspricht, aus – mit einer css-klasse durch display:none;

Das funktioniert im FireFox ganz prima. Opera, IE6 usw. kriegen das nicht hin. Opera zeigt im zweiten Selectmenü plötzlich die Städte (alle) als Text und IE6 lässt die Locationnamen stehen, aber blendet auch nichts aus.

Wie kann ich also vorgehen?
Die Daten kommen aus nem PHP-Script. Ich wollte eigentlich drauf verzichten, die per Ajax und erneutem Datenbank-Query nachzuladen.

:/
 
Hallo,

du könntest versuchen, mit einem Klon des Location-Selects arbeiten. Auf diesen wendest du dann die jQuery-Selektoren an und klonst die Elemente, die matchen, in das angezeigte Select (das du vorher geleert hast). So solltest du das Problem mit dem Ausblenden in den Griff bekommen... ist aber sehr sehr unsauber, wie ich finde...

Greetz

paddya
 
klonen, mhhh, ja. hab dann bloß doppelt so viel (options) im dom stehen.

gibt es vielleicht eine möglichkeit, die daten aus der datenbank raus direkt in ein javascript-array zu packen? das müsst ich dann nur irgendwie an smarty übergeben und mit jquery auslesen, wenns heißt stadt "xyz" ist ausgewählt.
 
Klar geht das. Du schreibst die Daten in JSON-Form und evaluierst sie dann (mit eval()) in JavaScript zu einem Objekt. Die Frage ist, ob du das effizient auswerten kannst ;)

Greetz

paddya
 
Zuletzt bearbeitet:
mhh, ich hab gestern nochmal recherchiert und pear::html_quickform entdeckt, das sieht sehr umfangreich aus und die funktion, die ich benötige, scheint ganz leicht umzusetzen zu sein : )
 
Klar geht das. Du schreibst die Daten in JSON-Form und evaluierst sie dann mit eval() in JavaScript zu einem Objekt.

NEIN !
Das ist sicherheitstechnisch der Obergau !
Um auf der Clientseite Json-Objekte nutzen zu können einen Json-Parser nutzen oder auf eines der Frameworks zurückgreifen, die stellen vor dem Aufruf von eval sicher, dass keine bösen Daten drinne sind.
 
NEIN !
Das ist sicherheitstechnisch der Obergau !
Um auf der Clientseite Json-Objekte nutzen zu können einen Json-Parser nutzen oder auf eines der Frameworks zurückgreifen, die stellen vor dem Aufruf von eval sicher, dass keine bösen Daten drinne sind.

Solange er keine groben XSS-Lücken verbaut hat, sollte es doch nicht möglich sein, dem User ein anderes JSON-Objekt unterzuschieben, oder sehe ich das falsch?
Allerdings ist es natürlich immer sinnvoll, eval() zu vermeiden.

Greetz

paddya
 
Genau das denke ich grad nämlich auch. Solange das JSON inline oder per AJAX kommt, ist doch wurscht, ob da eval() benutzt wird oder nicht. Immerhin sollte man wissen, was für Daten man ausliefert und dass da nix Böses bei ist.

Der einzige Punkt, wo's kritisch wird, ist bei JSONP und ich vermute einfach mal, dass jemand, der eben dieses nutzt, schon recht genau weiss, was er tut. ;)

Nebenbei gibt es auch keinen anderen (effizienten) Weg ausser eval(), um in JavaScript ein JSON-Objekt, das in einem String vorliegt, umzuwandeln.
 
Solange er keine groben XSS-Lücken verbaut hat, sollte es doch nicht möglich sein, dem User ein anderes JSON-Objekt unterzuschieben, oder sehe ich das falsch?

und genau da steckt das Problem.
Anwendungen werden immer komplexer, sie erstrecken sich über immer mehr und mehr Zeilen Code, es werden immer mehr PHP-Dateien, und wer kann heute noch garantieren, dass er in einer Datei, nicht vllt mal genügend Schutz eingebaut hat um damit XSS zu verhindern.
Und gerade dann schafft es jemand solch eine Seite zu finden, deren Daten auch per Ajax mit eval geladen werden, na gute Nacht.
Schau dir den MySpace-Wurm und co an. Man braucht nur einen kleinen Fehler haben und die ganze Anwendung wird kompromitiert.
Klar ist dies auch möglich indem jemand JS inkl. des HTML-Tags einschleust, doch das gestaltet sich dann durch meistens Länge-Beschränkungen der DB eine ganze Ecke schwerer

Nebenbei gibt es auch keinen anderen (effizienten) Weg ausser eval(), um in JavaScript ein JSON-Objekt, das in einem String vorliegt, umzuwandeln.
auf PHP-Seite steht dir für JSON ja auch kein eval zur Verfügung und du beschwerst dich nicht über die Performance ;)