Verzögern einer Aktion
moO
- javascript
0 Klawischnigg0 Gunnar Bittersmann0 moO0 Beat0 Klawischnigg
0 Beat0 dave
1 Struppi0 moO
0 Matti Mäkitalo0 tk
Hi alle,
ich habe folgendes Problem: per jquery löse ich einen ajax-request aus, etwa so:
$('#textfeld').keyup(
function(){
$.get(
'datei.php',
{ frage: 'wert' },
function (antwort){
alert(antwort);
}
);
}
);
Der Haken dabei ist, dass jetzt bei jeder Eingabe, egal wie schnell sie erfolgt, der request geschickt wird, vollkommen wurst ob der Nutzer fertig ist mit eingeben oder nicht. Das findet der Server natürlich garnicht toll, besonders wenn er nen riesigen Berg Daten zum verschieben hat. Und ich als Nutzer finds auch doof, das ganze wird nämlich sehr sehr langsam obwohl es eigentlich wahnsinnig schnell ist.
Eine Begrenzung à la 'ab dem dritten Zeichen gehts los' ist für diesen Fall nicht praktikabel oder gewünscht.
Ist es möglich das absenden des requests davon abhängig zu machen ob das letzte keyup länger als z.B. 1 sekunden zurückliegt?
Danke schonmal :)
Hi there,
Der Haken dabei ist, dass jetzt bei jeder Eingabe, egal wie schnell sie erfolgt, der request geschickt wird, vollkommen wurst ob der Nutzer fertig ist mit eingeben oder nicht.
Du hast (von der Verwendung von jquery einmal abgesehen) einen gewaltigen Designfehler in Deiner Anwendung. Wenn Du oder Dein Server mit wie Du schriebst einem "riesigen Berg Daten" operiert, dann macht ein keyup als Trigger nicht wirklich viel Sinn. Was spricht gegen einen Absende-Button?
Ist es möglich das absenden des requests davon abhängig zu machen ob das letzte keyup länger als z.B. 1 sekunden zurückliegt?
Theoretisch ja, mit Handarbeit. Aber dann läufst Du wieder in des Teufels Küche, weil ja mit jedem keyup eine eigene Stoppuhr gestartet werden müsste, die ihrerseits schaut, ob innerhalb einer Sekunde nicht schon wieder eine neue Stoppuhr gestartet wurde...
@@Klawischnigg:
nuqneH
Theoretisch ja, mit Handarbeit. Aber dann läufst Du wieder in des Teufels Küche, weil ja mit jedem keyup eine eigene Stoppuhr gestartet werden müsste, die ihrerseits schaut, ob innerhalb einer Sekunde nicht schon wieder eine neue Stoppuhr gestartet wurde...
Man könnte doch einfach die evtl. noch laufende Stoppuhr http://de.selfhtml.org/javascript/objekte/window.htm#clear_timeout@title=löschen und eine neue starten.
Qapla'
Hi there,
Der Haken dabei ist, dass jetzt bei jeder Eingabe, egal wie schnell sie erfolgt, der request geschickt wird, vollkommen wurst ob der Nutzer fertig ist mit eingeben oder nicht.
Du hast (von der Verwendung von jquery einmal abgesehen) einen gewaltigen Designfehler in Deiner Anwendung. Wenn Du oder Dein Server mit wie Du schriebst einem "riesigen Berg Daten" operiert, dann macht ein keyup als Trigger nicht wirklich viel Sinn. Was spricht gegen einen Absende-Button?
Ist es möglich das absenden des requests davon abhängig zu machen ob das letzte keyup länger als z.B. 1 sekunden zurückliegt?
Theoretisch ja, mit Handarbeit. Aber dann läufst Du wieder in des Teufels Küche, weil ja mit jedem keyup eine eigene Stoppuhr gestartet werden müsste, die ihrerseits schaut, ob innerhalb einer Sekunde nicht schon wieder eine neue Stoppuhr gestartet wurde...
Gegen einen Absendebutton ist grundsätzlich nichts einzuwenden, allerdings lösen alle anspruchsvolleren Seiten diese Sache inzwischen ohne einen solchen. Ich habe einen solchen Button auch, aber nur für den Fall dass kein js läuft.
Zum Thema Vorschläge bringen (das hat der andere Antworter angemerkt): Natürlich kann ich auch Vorschläge bringen, aber das ist genau das selbe wie das was ich tue, nur das ich das ganze in's autocomplete einbinde.
Das will ich aber in diesem Fall nicht, die Ergebnisse sollen im Google-Stil unter der Suchmaske erscheinen.
Und machen google und youtube dann auch einen "gewaltigen Designfehler"? Die triggern ja allem Anschein nach auch per keyup, youtube nutzt ein autocomplete, google füttert ein div mit den suchergebnissen.
Zum Thema Vorschläge bringen (das hat der andere Antworter angemerkt): Natürlich kann ich auch Vorschläge bringen, aber das ist genau das selbe wie das was ich tue, nur das ich das ganze in's autocomplete einbinde.
Das will ich aber in diesem Fall nicht, die Ergebnisse sollen im Google-Stil unter der Suchmaske erscheinen.
Du solltest onkeyup und requests trennen.
Wenn das Feld den Focus hat, starte periodisch eine Funktion, welche die Zeichenfolge im Eingabefeld an den Server schickt.
Die Rückgabe muss zu einer bestehenden clientseitigen Liste addiert werden.
Am Besten sollte der Server statische Seiten zurückliefern.
zum Beispiel für den aktuellen Formularinhalt "beispiel"
get ( "/vorschlagliste/b/e/i/s/p/i/e/l" )
Die Sonderzeichenfrage habe ich hier nicht geklärt, sollte aber auch mit zusätzlichem percentencoding kein problem für das Filesystem darstellen.
onkeyup darfst du nun weiterhin dich aus dieser periodisch aktualisierten Liste ohne Verzögerung bedienen.
Nun brauchst du nur noch einen Cronjob-Prozess, der diese statischen Vorschlagslisten auf dem Server erstellt.
Das mal mein skalierbarer Ansatz für Leute, die mit google oder ähnlichem gleichziehen wollen.
mfg Beat
Hi there,
Gegen einen Absendebutton ist grundsätzlich nichts einzuwenden, allerdings lösen alle anspruchsvolleren Seiten diese Sache inzwischen ohne einen solchen.
Was verstehst Du unter anspruchsvoll? Inwieweit ist "anspruchsvoll" selbst im positiven Sinne verstanden für eine Webseite sinnvoll? Ich dachte eine Webseite soll Information zur Verfügung stellen?
Das will ich aber in diesem Fall nicht, die Ergebnisse sollen im Google-Stil unter der Suchmaske erscheinen.
Ja, ok, aber Du hast etwas von riesigen Datenmengen geschrieben, ich dachte, wir reden von Formularen, nicht von so etwas Trivialem wie Google-Suggest.
Und machen google und youtube dann auch einen "gewaltigen Designfehler"?
Ja, weil viele Anwender verwirrt werden von dieser Art von "Usability". Ich habe das bei vielen meiner Kunden (= unbedarfter ONU und das Gegenteil von Nerd oder Computerversteher;) gesehen; die klicken alles nervös weg, was irgendwie automatisch ausgefüllt wird oder nach nur ein paar Tastendrucken vorgeschlagen wird. Was oft unterschätzt wird, daß viele, vor allem ältere Anwender, total verunsichert werden, von allem, was "automatisch" passiert, weil sie dadurch das Gefühl haben, daß sich da irgendetwas ihrer Kontrolle (die sie glauben endlich erlangt zu haben) entzieht.
Aber, das hängt natürlich vom zu erwartenden Zielpublikum ab. Ich denke, eine allgemeine, nein, DIE Suchmaschine müsste da andere Maßstäbe anlegen als Youtube, für das sich ohnehin nur eher web- und technikaffine Menschen interessieren...
Ist es möglich das absenden des requests davon abhängig zu machen ob das letzte keyup länger als z.B. 1 sekunden zurückliegt?
Es macht Sinn, dass die Eingabe abgeschlossen ist, bevor du die Aktion ausführst.
Eine Eingabe in einem Feld darfst du frühestens dann als abgeschlossen betrachten, wenn onchange oder onblur eingetroffen sind.
mfg Beat
Hi,
Es macht Sinn, dass die Eingabe abgeschlossen ist, bevor du die Aktion ausführst.
Bei Vorschlaglisten macht es auch Sinn Vorschläge anzubieten wenn die Eingabe noch nicht abgeschlossen ist.
~dave
ich habe folgendes Problem: per jquery löse ich einen ajax-request aus, etwa so:
$('#textfeld').keyup(
function(){
$.get(
'datei.php',
{ frage: 'wert' },
function (antwort){
alert(antwort);
}
);
}
);
> Ist es möglich das absenden des requests davon abhängig zu machen ob das letzte keyup länger als z.B. 1 sekunden zurückliegt?
Klar, mit einem Timeout. In etwa so
~~~javascript
var timer;
$('#textfeld').keyup(function(){
if(timer)window.clearTimeout(timer);
timer = window.setTimeout( function() {
$.get(
'datei.php',
{ frage: 'wert' },
function (antwort){
alert(antwort);
}
);
}
}, 1000);
);
Struppi.
ich habe folgendes Problem: per jquery löse ich einen ajax-request aus, etwa so:
$('#textfeld').keyup(
function(){
$.get(
'datei.php',
{ frage: 'wert' },
function (antwort){
alert(antwort);
}
);
}
);
> > Ist es möglich das absenden des requests davon abhängig zu machen ob das letzte keyup länger als z.B. 1 sekunden zurückliegt?
>
> Klar, mit einem Timeout. In etwa so
> ~~~javascript
> var timer;
> $('#textfeld').keyup(function(){
> if(timer)window.clearTimeout(timer);
> timer = window.setTimeout( function() {
> $.get(
> 'datei.php',
> { frage: 'wert' },
> function (antwort){
> alert(antwort);
> }
> );
> }
> }, 1000);
> );
>
Struppi.
Bitte um Entschuldigung für die späte Antwort :)
Die Lösung trifft den Nagel mal voll auf den Kopf und nach etwas Feintuning ist das die Ideallösung! Leider bin ich kein registrierter Nutzer aber:
DIESE ANTWORT WAR FACHLICH HILFREICH ;)
Hi,
Der Haken dabei ist, dass jetzt bei jeder Eingabe, egal wie schnell sie erfolgt, der request geschickt wird, vollkommen wurst ob der Nutzer fertig ist mit eingeben oder nicht. Das findet der Server natürlich garnicht toll, besonders wenn er nen riesigen Berg Daten zum verschieben hat. Und ich als Nutzer finds auch doof, das ganze wird nämlich sehr sehr langsam obwohl es eigentlich wahnsinnig schnell ist.
Mal ein anderer Denkansatz. Da ich nicht genau weiß, inwiefern die Eingabe die Rückgabe-Daten des Servers beeinflusst, gehe ich mal vom Standard-Beispiel Suche aus.
Es gibt 2 Möglichkeiten, welche durch ein Keyup in einem Textfeld ausgelöst werden können.
Es kommt ein (oder mehrere) Zeichen hinzu, oder es werden Zeichen entfernt.
Kommen Zeichen hinzu, so reicht es in einigen Fällen aus, nur noch die bereits vorhandenen Daten nochmals weiter zu filtern.
So brauchst du nur noch den anderen Fall (Filterkriterien werden entfernt) zu betrachten.
Das ist natürlich nur relevant, wenn die zurückgegebenen Daten wirklich nur einer Filterung einer bestimmten Datenmenge entsprechen. Aber vielleicht hilft es dir, dein Problem etwas zu verkleinern. In den meisten Fällen, in denen ich sowas implementiert habe, ist der "Filter hinzufügen" (= "Daten eingeben")-Fall deutlich häufiger als der "Filter entfernen".
Bis die Tage,
Matti
Hallo,
ich habe folgendes Problem: per jquery löse ich einen ajax-request aus, etwa so: [...]
Wenn du ohnehin scho jQuery verwendest, könntest du auch gleich Autocomplete von jQuery UI verwenden - das kann genau das was du suchst.
Gruß,
Tobias