• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

einmal javascript-hilfe bitte

bog

Mitglied seit
02.08.2002
Beiträge
10.121
Reaktionen
0
Ort
auf dem mutterschiff
moin,

ich arbeite gerade an einem (html-)formular, das eine etwas eigentuemliche eingabe erfordert. ich kann javascript quasi gar nicht, und das DOM-gefuhrwerke macht mir angst. und zwar habe ich in besagtem formular ein multiselect-item, das diverse options enthaelt.

nehmen wir der einfachheit halber mal an, das multiselect enthaelt pizzen. nun soll ein benutzer hergehen koennen und mehrere pizzen auswaehlen duerfen. sobald er eine pizzasorte ausgewaehlt hat, soll sich ein eingabefenster oeffnen, das eine abfrage ueber die anzahl der pizzen dieses typs macht.
letztendlich moechte ich dann wissen, wieviele pizzen welcher art verlangt wurden.

rudimentaererweise:
Code:
<select name='pizzen' multiple='multiple' onchange='prompt("wieviele davon?",1);'>
der rueckgabewert dieses prompt() soll nun wiederum dazu verwendet werden, ein verstecktes input element zu erstellen, welches dann innerhalb des formulars eingefuegt wird. natuerlich sollte beim DEselektieren eines eintrags ein solches element wieder entfernt werden und keine abfrage stattfinden. das hinzufuegen habe ich mir so ueberlegt:
Code:
	var newHiddenInput = document.createElement("input");
	newHiddenInput.type = "hidden";
	newHiddenInput.name = "pizza[" + i + "]";
	newHiddenInput.value = promptreturnvonebengerade;
	fuegdenrotzirgendwieein();

wie man sieht hab ich da noch sehr viele luecken. ich lese staendig irgendwas von getElementById() und -Name(), was mir auch durchaus sinnvoll erscheint, bei versuchen, damit umzugehen, geht aber einfach alles schief.

wonach ich suche ist vermutlich eine einzige funktion, die durch das onchange-event im select-element ausgeloest wird und in pseudocode etwa so aussieht:
Code:
funktion Anzahl {
if (ausloesende_option.selected == true)
	then loesche getElementById("pizza_i");

	else prompt(wieviele?)
		erstelle unsichtbares input mit passendem name/value
		fuege es ein
}
irgendwie muss man hier wohl auch noch zwischen dem option-teil der ge-change-ten auswahl und dem im else-teil erstellten feld einen bezug herstellen, damit der if-teil funktionieren kann.

wie man vielleicht merkt, habe ich echt keinen plan, wie das elegant funktionieren soll. ich waere fuer ein passendes beispiel wirklich extrem dankbar. hier mal ein schnipsel, wie der code (ganz javafrei) aussieht:
Code:
<html><head><title>Test</title>
<script type="text/javascript">
function Anzahl () {
// hier dann irgendwas
}
</script>
</head><body>
<form name="Auswahl" method="post">
<select name="produkte[]" multiple='multiple' onchange="Anzahl()">
  <option value="pizza_3">drei</option>
  <option value="pizza_1">eins</option>
</select>
<input type='submit' value='klick'>
</form>
</body></html>
ein erwuenschtes unsichtbares input-feld saehe fuer zwoelf pizzen der nummer 3 so aus:
Code:
<input type='hidden' name='anzahl[3]' value='12' />

danke :[
 
Mitglied seit
03.08.2002
Beiträge
3.257
Reaktionen
14
http://www.lorenz-media.com/zeugs/js.html

Das Ding hat in IE aber noch nen massiven Bug!

Multiselectform-handling in IE ist der größte Scheiss.
Da muss jetzt noch nen temporäre var rein oder das Selectfield nach nem onchange geclont werden, um festzustellen, welche Drecksoption sich da nun geändert hat (im Augenblick nimmt er da nur die erste der Liste per selectedIndex). Im Gegensatz zu FF kann man da halt keine Events auf die <option>'s legen.

Weiss jetzt aber nicht, ob ich da jetzt noch die Tage weiterkomme (Umzug steht bevor).

Hier nochmal für IE weitere Hilfe:
http://msdn.microsoft.com/en-us/library/ms535893(VS.85).aspx

Aber so zum Weitermachen sollts erstmal ok sein. Muss noch ne Runde pennen nun.

P.S: Ach ja, das Textfeld drunter ist nur debug.
In PizzaFactory.prototype.rewrite html += "<input type=\"hidden\" kannst auch zu type="text" setzen. Dann kannst es auch sehen.

document.getElementById("debug").value = html; halt raus...
 

RRA^StArFiRe

Guest
beschreib mal kurz deinen quasi "page-information-flow".

parentpage: seite mit pizzasorte -> bei klick popup
popup: combo/selectbox mit auswahl der anzahl -> bei klick wertrückgabe an parentpage

und dein problem ist jetzt, dass du zwar den wert zurück an die hauptseite schon bekommst (machst du das mit onunload an den opener?) und ein hidden feld erstellen kannst, aber nicht mehr löschen?

rein spontan würd ich da ein array für die hiddenfelder nehmen und für jede checkbox dahinter n event zum löschen geben.


aber keine ahnung was dein onchange=anzahl() da machen soll.
willst du damit den wert an die hauptseite werfen?
und ich seh grad dass du da multiple hast, also sind das die pizzasorten?

hm... am besten du erklärst mal, wie die informationen durchlaufen sollen ;D
 

bog

Mitglied seit
02.08.2002
Beiträge
10.121
Reaktionen
0
Ort
auf dem mutterschiff
starfire: mein problem war, dass ich javascript gar nicht kann und nur pseudocodeartig und mit kleinen schnipseln, die selfhtml und google brachten, mein problem beschreiben konnte :elefant:. die idee mit dem hiddenfeld je option kam mir auch schon, das finde ich allerdings graesslich in bezug auf sauberkeit des sourcecodes und den overhead. denn soein input field hat geschaetzte 60 characters. und wenn ich nun mal ne auswahl von 100 pizzen habe und nur eine ausgewaehlt wird, macht das schlappe 6 nutzlose kbyte.

sowas aehnliches wie das was butze beschreibt (klonen->abgleichen) hab mich mir nun nach laengerem rumprobiere auch gedacht, .selectedIndex ist da nicht gerade schoen implementiert.
riesen dank uebrigens fuer das beispiel! das hat mir mehr oder weniger beigebracht wie ich das hidden input einfuege und hat mich gleichzeitig davon ueberzeugt, dass ich das ganze wohl am besten doch anders machen sollte.

mein aktueller ansatz ist es nun (darauf wurde ich auch erst in #javascript @ efnet gebracht), und der ist denke ich viel sauberer implementierbar, im form selbst den onSubmit-event auszunutzen und dort eine funktion einzufuegen, die ueberprueft, welche elemente zum submit-zeitpunkt selektiert sind, eben fuer diese werte prompt()s oeffnet und die eingaben in ein array schreibt, dessen werte im spaeteren verlauf zum einfuegen der hidden inputs verwendet wird, bevor das formular abgeschickt wird. letzteres schaue ich mir nun an, ersteres habe ich mehr oder weniger hingekriegt.


edit: zur referenz mal meine loesung:
Code:
function createInvisInputField(optionid, amount, thisform) {
	var newInvisField = document.createElement("input");
	newInvisField.type = "hidden";
	newInvisField.name = "anzahl["+optionid+"]";
	newInvisField.value = amount;
	thisform.appendChild(newInvisField);
}
function askForAmounts(thisform) {
	var fail = true; // check for whether something is even selected
	var mySel = document.getElementById('productSel'); // our selection object
	var amount = new Array(); // where we save the amount
	for(i=0; i<mySel.options.length; i++) {
		if(mySel.options[i].selected == true) {
			fail = false;
			amount[i] = prompt("Anzahl von '"+mySel.options[i].text+"'",1);
		}
	}
	
	for(i=0; i<amount.length; i++) {
		if(amount[i] != undefined) {
			createInvisInputField(mySel.options[i].value, amount[i], thisform);
		}
	}
	
	if(fail) {
		alert("Kein Produkt ausgewählt!");
		return false;
	} else {
		return true;
	}
}
auf diesem form:
Code:
<form method="post" onSubmit='return askForAmounts(this);'>
<select id='productSel' name="produkte[]" multiple='multiple'>
  <option value="3">drei</option>
  <option value="1">eins</option>
</select>
<input type='submit' value='senden' />
</form>

noch nicht ausgiebig getestet, aber funktioniert bislang ganz gut fuer meine beduerfnisse. irgendwie kann man sicher auch noch abfangen wenn jemand bei der eingabe der anzahl abbrechen drueckt, aber amount==false ging nicht. naja
 
Mitglied seit
12.01.2004
Beiträge
8.557
Reaktionen
0
Ort
Gießem
hm du willst ja die daten sicherlich weiterverarbeiten (z.b. via serverseitigem script in einer db speichern?)

ka, ich hätte da sicherheitsbedenken, js kann man schließlich beliebig manipulieren. eine gute hybridlösung würdest du da sicherlich mit ajax hinbekommen...

sieht man z.b. gut auf pizza.de:

https://pizza.de/pizza-pasta-ciao-bella-berlin-flemmingstr-33?lgs=32576

und dann mal einfach in der adresszeile:

Code:
javascript:parent.addArt('2209','822242','527050','711544;711543;','601','3758127','','Pimmelkopfpizza',%20'1.00','',1,0)

eingeben ;)

€: nehmt die leerzeichen raus, die macht das forum automatisch rein :S

just my 2 cents
 

bog

Mitglied seit
02.08.2002
Beiträge
10.121
Reaktionen
0
Ort
auf dem mutterschiff
danke fuer deinen input, aber die anwendung ist darauf ausgelegt, eben diese daten vom anwender zu bekommen, also macht es wenig sinn, sich gegen individuelle eingaben dahingehend abzusichern.


ich habe allerdings mittlerweile ein neues problem; es betrifft immernoch dieselbe thematik:
ich hab immernoch die beiden oben geposteten funktionen und nun allerdings zwei formulare. beide formulare haben im onsubmit-trigger denselben funktionsaufruf, wie er auch oben drinsteht. nun funktioniert aber dieser funktionsaufruf nur im ersten formular; im zweiten wird die gesamte routine komplett uebergangen.
kann mir jemand sagen, warum?
 
Oben