JS-Sortierfunktion, aktueller Wert von mit onfocus in onchange()
Patrick
- javascript
Hallöchen,
ich hantiere äußerst selten mit JavaScript und bin in dieser Hinsicht absoluter Laie. Suchen im Forum und über Google haben mir bei meinen Stichworten leider nicht wirklich geholfen.
Ich habe ein Formular über welches man die Position von Menüpunkten festlegen kann und wollte hier per JS eine Verrechnung einbauen, welche soweit auch wunderbar funktioniert.
Problem ist nur, dass der aktuelle Wert mit übergeben werden muss und sich dieser bei mehreren Umpositionierungen ändert und daher nicht fest übergeben werden kann.
Rein sinngemäß müsste ich also folgendes tun:
<input type="text" name="pos[3]" class="anz2" id="posid3" onfocus="JS-Funktion" onchange="resortList('6','3','3')" value="3" maxlength="2" />
// JS-Funktion im onfocus sollte Value-Wert an 2. Position in Funktion resortList() schreiben
Kann das überhaupt funktionieren, wenn ja, wie? onfus ist ja nur ein Attribut und keine Funktion, welche ich einfach an der Stelle aufrufen könnte. Und wenn ich this.value dort eintragen würde, würde ja mit der Änderung auch der neue Wert übergeben werden und nicht der Aktuelle, welcher dann eingetragen und durch onchange genutzt wird.
Das Ganze auch nochmal grafisch, so wirds vielleicht etwas deutlicher.
Gruß Patrick
Hi,
von hinten durch die Brust, beide Beine weg...
Warum willst du onchange einen statischen Wert übergeben? this.value ist in jedem Fall mit dem aktuellen Wert belegt und verlangt kein Ändern des DOM.
Übrigens ist onfocus zwar ein HTML-Attribut, aber in Javascript ein Event-Handler, der (eine) Funktion(en) aufnehmen kann.
Der Yeti
Hallo Yeti,
deswegen habe ich ja "sinngemäß" geschrieben, weil mir auch bewusst ist, dass es so wohl nicht der feine Weg ist.
Dass onfocus eine Funktion oder mehr aufnehmen kann, ist mir klar, nur wie bekomme ich den aktuellen (statischen) Wert als zweites Argument für die resort-Funktion übergeben?
Den statischen Wert brauche ich um die vorher-nachher Differenz zu berechnen und die übrigen Werte neu verrechnen zu können...
denn wenn ich den Wert im Textfeld ändere ist der value-Wert ja der neue und nicht mehr der Urspüngliche...
Oder ist nen Gedankenwurm in meiner Sortierfunktion drin?
function resortList(anzahl,itsID,aktueller_wert) {
// alert("wurde ausgeführt in ID: "+ itsID +", Anzahl: "+ anzahl);
var neuer_wert = document.getElementById('posid' + itsID).value;
for (i = 1; i <= anzahl; i++) {
if (i != itsID) {
var thisval = document.getElementById('posid' + i).value;
// Wenn Zahl erniedrigt wurde
if (aktueller_wert > neuer_wert) {
if ((thisval >= neuer_wert) && (thisval < aktueller_wert)) {
document.getElementById('posid' + i).value = ((thisval * 1) + 1);
}
}
// Wenn Zahl erhöht wurde
if (neuer_wert > aktueller_wert) {
if ((thisval > aktueller_wert) && (thisval <= neuer_wert)) {
document.getElementById('posid' + i).value = ((thisval * 1) - 1);
}
}
/*
if ((thisval > neuer_wert) && (i != itsID)) {
document.getElementById('posid' + i).value = ((thisval * 1) + 1);
}else if ((thisval == neuer_wert) && (i != itsID)) {
document.getElementById('posid' + i).value = ((thisval * 1) - 1);
}
*/
}
}
}
Hi,
ah, alles klar. Du brauchst also zusätzlich zum geänderten Wert noch den alten und den willst du onfocus setzen. Eine Möglichkeit wäre, ein globales Array zu nehmen, das zu jedem Feld diesen Wert abspeichert und auf den du dann in der Funktion zugreifen kannst.
Deine Funktion habe ich mir jetzt leider nicht genauer angeschaut, aber vielleicht ist script.aculo.us für deinen Fall geeigneter, als jedem Menüpunkt manuell einen neuen Sortierwert vergeben zu müssen.
Der Yeti
Hi nochmal,
ja, das geht theortisch in die richtige Richtung, nur dass ich zur Zeit noch keine laufende AJAX-Engine habe und aber an der Stelle auch kein Drag and Drop möglich sein soll, da meine Kunden mit sowas "neumodischem" kaum klarkommen...
solche AJAX-Lösungen hatte ich auch schon gefunden, nur bisher zu wenig Ahnung von AJAX, während das von deinem Link ja auch noch Ruby ist.
Die JS-Verrechnung soll eigentlich auch nur etwas komfortabler machen, um selbst nichts durchsehen zu müssen. Die funktionsweise der Zeichenprüfung und ggf. Positionsprüfung vorm Speichern erfolgt eh noch...
Was das globale Array betrifft... soweit theoretisch ja. Ist aktuell auch so, dass der erste Wert auch per php an die Stelle generiert wird, da funktioniert das auch. Nur wenn man halt anfängt umzusortieren, DANN erst taucht das problem auf, dass die übergebenen Werte mit den neu verrechnenten Werten ggf. nicht mehr übereinstimmen und da kommt dann das Zahlenchaos.
ich kenne nur keine Funktion, mit der ich entweder in die Funktionswerte reinschreiben kann, oder aber eine JS-Funktion, die mir den focus-vlaue-Wert liefert.
Ich habs in der Zwischenzeit mal mit this-value ausprobiert, aber da kommt wie erwartet nur der neue Wert mit rüber, nciht aber im onfucos
Hi,
solche AJAX-Lösungen hatte ich auch schon gefunden, nur bisher zu wenig Ahnung von AJAX, während das von deinem Link ja auch noch Ruby ist.
Das ist bei script.aculo.us ganz einfach. Du bindest deren Bibliothek ein und vergibst ein paar CSS-Klassen, bindest eine Zeile Code ein, den sie dir auch noch vorkauen und dann klappt es. ;-)
Das Ergebnis wird dann eine bestimmte Seite geschickt, wo es ausgewertet werden kann.
Was das globale Array betrifft... soweit theoretisch ja. Ist aktuell auch so, dass der erste Wert auch per php an die Stelle generiert wird, da funktioniert das auch. Nur wenn man halt anfängt umzusortieren, DANN erst taucht das problem auf, dass die übergebenen Werte mit den neu verrechnenten Werten ggf. nicht mehr übereinstimmen und da kommt dann das Zahlenchaos.
Dann würde ich ein Array für die alten Werte und eins für die neuen nehmen, umsortieren und am Schluss dann die neu gesetzten Werte wieder in das Array mit den alten Werten übertragen.
ich kenne nur keine Funktion, mit der ich entweder in die Funktionswerte reinschreiben kann, oder aber eine JS-Funktion, die mir den focus-vlaue-Wert liefert.
Ersteres gibt es auch nicht, höchstens eben über Variablen.
Den Wert, den das Feld bei onfocus hast, musst du selbst wegspeichern. Z.B. eben über onfocus="oldVal['feld1'] = this.value", dann kannst du auch später noch auf ihn zugreifen.
Ich habs in der Zwischenzeit mal mit this-value ausprobiert, aber da kommt wie erwartet nur der neue Wert mit rüber, nciht aber im onfucos
Genau. this.value ist immer der aktuelle Wert und wenn du den erst onblur abrufst, ist er bereits geändert.
Der Yeti
Joah, also die Einbindung von Fremddingen kommt aus mehreren Gründen nicht in Betracht, da es zum einen kommerziell ist, zum anderen weiß ich nicht, wie sich das auf ssl-verschlüsselten Seiten verhält, ich aber davon abgesehen meinen Code komplett auf meinem Sever habe.
Aber trotzdem danke für die Hilfe und die Denkanstöße...
Jetzt muss ich nur noch rausfinden, wie ich Arrays in JS handhabe und verbastele... aber das find ich noch raus ;-)
Gruß Patrick