Functionsaufrufe "überschreiben"

ConSoleM

Grünschnabel
Hi ho.

Hab ein Problem mit meinem Suchformular in Ajax... Es funktioniert so, dass jedesmal, wenn der User einen Buchstaben eingibt (keyup) eine Funktion aufgerufen wird, welche eine php-Datei ausführt, die wiederum auf eine Datenbank zugreift und Einträge ausliest.
Da diese Datenbank ca. 30.000 Einträge enthält, braucht das seine Zeit. Nun ist das Problem, dass die Datenbank jedesmal, wenn die Taste losgelassen wird, aufgerufen wird und somit das ganze etwas überlastet ist.
Meine Frage: Kann man einer Funktion sagen, dass sie erst was tun soll, wenn der User 3 Sekunden nix mehr eingegeben hat? Mit settimeout() hab ichs probiert, allerdings wird die Datenbank da trotzdem öfters aufgerufen...

Also ich brauche eine Funktion, die erst die Ajax.Updater() ausführt, wenn der User 3 Sekunden nix mehr tut. Hat jemand ne Idee?

hier mal das Codeschnipsel zum Javascript
Code:
<script type="text/javascript">
 function init() {
 	Event.observe("SearchInput", "keyup", search);
	}
 
 function search(){
 	var address = "SearchInput="+ $F("SearchInput"); //$F geliefert von Prototype
	new Ajax.Updater("Liste","tuewas.php", {method:"get", parameters: address});
	}
 
  Event.observe(window,"load", init);
 
</script>

Bin eben leider kein Crack in Javascript. Danke schonmal für eure Hilfe...
 
Danke für die Antwort. Nur ich vermute, dass mir das nicht weiterhilft.
Ich habs mal folgendermaßen eingebaut:
Code:
<script type="text/javascript">
 function init() {
 	Event.observe("SearchInput", "keyup", search);
	}
 
 function search(){
 	test = window.setTimeout("updatediv()",1000);
 	}
 function updatediv(){
 	window.clearTimeout(test);
 	alert("test");
 	var address = "SearchInput="+ $F("SearchInput"); //$F geliefert von Prototype
	new Ajax.Updater("Liste","fileadmin/template/scripts/muellabfuhr/suche3.php", {method:"get", parameters: address});
	}
Allerdings wird die Funtion upadtediv() dann trotzdem 4 mal aufgerufen, wenn ich beispielsweise "test" eingebe. Sie soll aber nur einmal aufgerufen werden und zwar dann, wenn der User 3 Sek. nix mehr dazuschreibt.
Ich kann die clearTimeout aber auch nicht in die seach()-Funktion mit hineinschreiben, weil ja dann keine Weiterleitung mehr erfolgen würde... Oder verstehe ich da was falsch?
 
setTimeout ist da glaub ich nicht das richtige. Du möchtest den AJAX Request ja nur alle 3 Sekunden ausführen oder?

Hole dir doch einfach die Zeit und speichere sie in eine Variable. Dann überprüfst du ob seit dem letzten Klick 3 Sekunden vergangen sind. Wenn ja, dann führe den Request aus und setzt wieder die aktuelle Zeit in deine Variable. Sonst lass es.

MFG
X
 
Drück ich mich so unklar aus? Wenn ja Sorry. Nochmal: Ich möchte den Ajax Request nur einmal ausführen und zwar 3 Sekunden, nachdem der User etwas in das Suchfeld eingegeben hat. Also nicht nach jedem Buchstaben, sondern dann, wenn der User fertig ist mit schreiben...
 
Hi,

schreib Dir eine Routine, die bei jedem onkeyup-Event prüft, ob bereits ein Timer läuft. Ist das der Fall,
stoppst Du ihn und startest ihn erneut.
Code:
var hTimer = null;

function search(){
  if(hTimer != null){
    window.clearTimeout(hTimer);
    hTimer = null;
  }

  hTimer = window.setTimeout("updatediv()", 3000);
}

function updatediv(){
 	alert("test");
 	var address = "SearchInput="+ $F("SearchInput"); //$F geliefert von Prototype
	new Ajax.Updater("Liste","fileadmin/template/scripts/muellabfuhr/suche3.php", {method:"get", parameters: address});
	}
Vielleicht hilft Dir das weiter.

Ciao
Quaese
 

Neue Beiträge

Zurück