Aufruft von Funktionen
Markus
- javascript
Moin,
ich benutze Javascript um die Textlänge von Formularfeldern neben die Formularfelder zu schreiben. Die Funktion rufe ich z.B so auf:
<textarea id="test" name="text" rows="10" cols="30" OnFocus="Count('test',20);" OnClick="Count('test',20);" ONCHANGE="Count('test',20);" onKeydown="Count('test',20);" onKeyup="Count('test',20);"> </textarea>
wobei test die id des Feldes ist und 20 die Länge ab wo der Inhalt zu lang ist.
Kann ich den Anruf irgendwie besser hinbekommen? Ich habe es mit addEventListener probiert aber ich weiß nicht wie man damit z.b. alle Formularfelder anspricht und per getElementById geht nicht da ich das Script für verschiedene Formulare verweden will.
Gruß
Markus
Hi,
<textarea id="test" name="text" rows="10" cols="30" OnFocus="Count('test',20);" OnClick="Count('test',20);" ONCHANGE="Count('test',20);" onKeydown="Count('test',20);" onKeyup="Count('test',20);"> </textarea>
ich denke Du solltest onfocus einen setTimout/Interval laufen lassen, den Du onblur mit clearTimeout/Interval wieder stoppst. Dabei ruft Du eine Funktion, die ständig die Länge prüft.
Gruesse, Joachim
Hallo Joachim,
ich denke Du solltest onfocus einen setTimout/Interval laufen lassen, den Du onblur mit clearTimeout/Interval wieder stoppst. Dabei ruft Du eine Funktion, die ständig die Länge prüft.
Das scheint mir auch die beste Lösung zu sein, denn das was ich mir ausgedacht habe, würde bei Copy und Paste nicht funktionieren: Je nach keyCode (backspace oder andere Taste, wird eins zur Länge des Textareainhalts hinzugezählt oder davon abgezogen, denn zum Zeitpunkt des Eventfeuerns ist das Zeichen noch nicht in der Textarea angekommen. Bei STRG+X oder STRG+V weiß man aber nicht wie viele Zeichen hinzukommen und die Summe stimmt erst wieder, wenn man noch eine weitere normale Eingabetaste drückt. Ähnlich verhält es sich beim Markieren und anschließendem Löschen von Text.
Interessant ist in diesem Zusammenhabg die lange Leitung von Opera und Mozilla im Vergleich zum IE6. Bei ersteren beiden Browseren muss die Backspace-Korrektur nämlich doppelt erfolgen:
<html>
<head>
<title>Eingabelängenkontrolle bei Textareas</title>
<meta name="author" content="Gernot Back">
<meta name="generator" content="Ulli Meybohms HTML EDITOR">
<script type="text/javascript">
[code lang=javascript]
function melde (obj, e) {
var keyCode = e.which || e.keyCode;
var laenge = obj.value.length + 1;
if (keyCode == 8) laenge--; //Backspace
if (e.which && e.which == 8 && laenge != 0) laenge--;
if (laenge > 19) {
alert('Die Eingabe ist zu lang!');
return;
}
do obj = obj.nextSibling;
while (obj.nodeName.toUpperCase() != 'INPUT');
obj.value = laenge;
}
</script>
</head>
<body>
<textarea rows="10" cols="30" onkeypress="melde(this, event)"></textarea><br>
Länge des eingegebenen Textes: <input type="text" readonly size="2" value="0">
</body>
</html>[/code]
Gruß Gernot
Hallo nochmal,
ich habe nochmal ein bisschen im Archiv zur hier häufig gestellten Frage nach einem Javascript-Workaround zu "maxlength" in Textareas recherchiert und stieß dabei letztlich auf einen einzigen und auch nur teilweise (nur für den IE) verwertbaren Tipp aus dem Jahre 2002.
http://forum.de.selfhtml.org/archiv/2002/5/t12306/#m68168
führt zu
http://www.siteexperts.com/ie5/htc/ts08/page1.asp
Zu dumm, dass andere Browser als der IE Eventhandler wie "onpaste", "oncut", "onbeforepaste" und "onbeforecut" nicht kennen.
Hat da vielleicht eine(r) eine Idee, was die Funktionalität dieser Handler in anderen Browsern imitieren könnte?
Gibt es wirklich keinen anderen Weg als den von Joachim vorgeschlagenen rechenintensiven mit ständigem Abfragen der eingegebenen Zeichenzahl, sobald die Texarea den Fokus erhält?
Gruß Gernot
Das scheint mir auch die beste Lösung zu sein, denn das was ich mir ausgedacht habe, würde bei Copy und Paste nicht funktionieren: Je nach keyCode (backspace oder andere Taste, wird eins zur Länge des Textareainhalts hinzugezählt oder davon abgezogen, denn zum Zeitpunkt des Eventfeuerns ist das Zeichen noch nicht in der Textarea angekommen. Bei STRG+X oder STRG+V weiß man aber nicht wie viele Zeichen hinzukommen und die Summe stimmt erst wieder, wenn man noch eine weitere normale Eingabetaste drückt. Ähnlich verhält es sich beim Markieren und anschließendem Löschen von Text.
Wie ist es mit onkeyup?
Das funktioniert bei mir im FF, IE 6 und OP 7,8
<form action="#">
<textarea rows="10" cols="30" onkeyup="melde(this)"></textarea><br>
Länge des eingegebenen Textes: <input type="text" readonly size="2" value="0">
</form>
<script type="text/javascript">
function melde (obj)
{
var laenge = obj.value.length;
do obj = obj.nextSibling;
while (obj.nodeName.toUpperCase() != 'INPUT');
obj.value = laenge;
}
</script>
Struppi.
Hallo Struppi,
Wie ist es mit onkeyup?
Das funktioniert bei mir im FF, IE 6 und OP 7,8
Jepp das funktioniert zusätzlich sogar auch in Netscape 7.1 und Mozilla 1.7.2 und IE5 unter Windows 98 sowie IE6 unter Windows XP
Das einzige was mich heute in den frühen Morgenstunden wohl von onkeyup abgebracht hat (damit habe ich neben onkeypress natürlich ebenso experimentiert wie mit onkeydown) war die Tatsache, dass sich damit im als Vorschaubrowser aus Phase 5 heraus aufgerufenen IE5 nichts tat, wohl aber mit onkeypress. Da bin ich ja froh, dass die Lösung letztlich doch so simpel ist.
Allerdings wer über das Kontextmenü mit Einfügen in die Textarea was einfügt oder aus ihr etwas ausschneidet bekommt dabei zunächst keine richtige Meldung über die Länge des Textarea-Value-Strings, sondern erst, wenn er wieder eine Taste drückt. Bei Gelegenheit suche ich da mal eine Lösung für die Borwser, die onpaste und Co. nicht verstehen; die rechte Maustaste lässt sich ja auch abfragen (oder vielleicht bist du ja schneller) ;-)
Gruß Gernot
Allerdings wer über das Kontextmenü mit Einfügen in die Textarea was einfügt oder aus ihr etwas ausschneidet bekommt dabei zunächst keine richtige Meldung über die Länge des Textarea-Value-Strings, sondern erst, wenn er wieder eine Taste drückt. Bei Gelegenheit suche ich da mal eine Lösung für die Borwser, die onpaste und Co. nicht verstehen; die rechte Maustaste lässt sich ja auch abfragen (oder vielleicht bist du ja schneller) ;-)
Nö ;-)
ich hatte das dann auch ausprobiert und festgestellt dass onpaste aber nicht optimal ist, da der Event vor dem einfügen aufgerufen wird. Das einzige was mir dann noch eingefallen ist wäre, zusätzlich mit onmousemove zu arbeiten da man ja immer ein bisschen "zittert" oder mit onblur (wobei dann aber nicht die Anzeige sofoert aktualisiert wird).
Ich denke aber, für das Problem an sich, dürfte eigentlich onkeyup ausreichend sein (evtl. in Verbindung mit einer Prüfung onsubmit), da eine JS Formularprüfung ja immer nur eine Hilfestellung ist und keine Serverseitige Prüfung ersetzen darf.
Struppi.
Hallo Struppi,
ich hatte das dann auch ausprobiert und festgestellt dass onpaste aber nicht optimal ist, da der Event vor dem einfügen aufgerufen wird. Das einzige was mir dann noch eingefallen ist wäre, zusätzlich mit onmousemove zu arbeiten da man ja immer ein bisschen "zittert" oder mit onblur (wobei dann aber nicht die Anzeige sofoert aktualisiert wird).
Eigentlich sollte man doch denken, dass es so gehen müsste:
<textarea rows="10" cols="30" onkeyup="[code lang=javascript]melde(this)
~~~" onmouseup="`melde(this)`{:.language-javascript}"></textarea>
[/code]
Tut es aber nicht, auch nicht, wenn man über eine globale Variable aktObj geht, die man onfocus=this setzt und das mouseup-Event damit mit einer Zeitverzögerung aufruft; erst bei einem weiteren Mouseup oder Keyup ist die Anzeige auf dem aktuellen Stand.
> Ich denke aber, für das Problem an sich, dürfte eigentlich onkeyup ausreichend sein (evtl. in Verbindung mit einer Prüfung onsubmit), da eine JS Formularprüfung ja immer nur eine Hilfestellung ist und keine Serverseitige Prüfung ersetzen darf.
Wenn schon clientseitig, dann soll sie m.E. auch alle Fälle abdecken, denn sonst wundert sich der Nutzer ja über die fehlerhafte Anzeige, die ihm suggeriert, er habe nicht zu viele Zeichen eingegeben wenn anschließend das submit-Event das Gegenteil behauptet.
Gruß Gernot
Hallo nochmal,
Tut es aber nicht, auch nicht, wenn man über eine globale Variable aktObj geht, die man onfocus=this setzt
Ich meinte natürlich
onfocus="aktObj=this
"
Gruß Gernot