[JS] te snelle $.ajax call - Blank page

Pagina: 1
Acties:

Onderwerpen


  • josjos
  • Registratie: November 2003
  • Laatst online: 19-12-2023
Doel:
Gebruiker typt een deel van een productnaam in en het product met specs komen via een ajax-call terug.
Probleem:
Het script werkt bij langzaam type prima. Zodra je te snel typt verandert de content in de div-box niet meer (en blijft de content van een vorige call staan of word soms een blankpage).

Iemand enig idee hoe ik dit probleem kan omzeilen?

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function showHint(str)
{     
    $.ajax({
      url: "ajax/product.php",
      global: false,
      type: "GET",
      data: ({q : str}),
      dataType: "html",
      async:true,
      success: function(msg){
        document.getElementById("products").innerHTML = msg;
      }
   }).responseText;
}

HTML:
1
2
Zoek product: <input type="text" id="txt"  name="zoekproduct" onkeyup="showHint(this.value)" />
<div id="products"></div>

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Timeout inbouwen, want nu bombardeer je de server met requests.

Kijk als voorbeeld ook eens hiernaar: http://jqueryui.com/demos/autocomplete/

[ Voor 39% gewijzigd door Bosmonster op 10-02-2011 17:34 ]


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:31

MueR

Admin Tweakers Discord

is niet lief

Je zal met een delayed request moeten werken. (Google)

Anyone who gets in between me and my morning coffee should be insecure.


  • josjos
  • Registratie: November 2003
  • Laatst online: 19-12-2023
Bosmonster schreef op donderdag 10 februari 2011 @ 17:33:
Timeout inbouwen, want nu bombardeer je de server met requests.

Kijk als voorbeeld ook eens hiernaar: http://jqueryui.com/demos/autocomplete/
Dat moet hij toch wel aankunnen?

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:31

MueR

Admin Tweakers Discord

is niet lief

Daar moet je toch gewoon niet op rekenen?

Anyone who gets in between me and my morning coffee should be insecure.


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

josjos schreef op donderdag 10 februari 2011 @ 17:34:
[...]

Dat moet hij toch wel aankunnen?
Blijkbaar kan je server dat toch niet aan ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En ondertussen komt dit haast wel wekelijks voorbij. Is je zoekfunctie misschien stuk?
josjos schreef op donderdag 10 februari 2011 @ 17:34:
[...]

Dat moet hij toch wel aankunnen?
De enige die dat kan beantwoorden (los van 't feit dat je niet bij elke keystroke een request moet willen doen) ben jij hoor ;) Hoe moeten wij weten wat je server allemaal moet uitspoken aan queries en verschillende lagen aan logica om tot een response voor je AJAX request te komen. For all we know duurt elke request 5 seconden om te beantwoorden. En voor 'tzelfde geld kan je server 500.000 requests per seconde afhandelen...

[ Voor 51% gewijzigd door RobIII op 10-02-2011 18:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

josjos schreef op donderdag 10 februari 2011 @ 17:34:
[...]

Dat moet hij toch wel aankunnen?
Of je server het aankan is eigenlijk niet eens een issue (al bij jou blijkbaar wel). Het is gewoon onnodig. Als je snel typt is 90% van je requests namelijk gewoon zinloos.

  • BARO
  • Registratie: Mei 2003
  • Laatst online: 05-08 19:47
Je zou het bijvoorbeeld als volgt kunnen maken:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function showHint(str)
{
  clearTimeout(ajaxCallTimeout);
  ajaxCallTimeout = setTimeout(function(){
    $.ajax({ 
      url: "ajax/product.php", 
      global: false, 
      type: "GET", 
      data: ({q : str}), 
      dataType: "html", 
      async: true, 
      success: function(msg){ 
        document.getElementById("products").innerHTML = msg; 
      } 
    }).responseText;
  }, 500);
}

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:38

orf

Je kunt ook eerdere requests cancellen. Moet je wel zeker weten dat je server ze niet alsnog helemaal afhandelt door een ignore_user_abort() (PHP) of iets dergelijks.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:53

crisp

Devver

Pixelated

orf schreef op donderdag 10 februari 2011 @ 21:35:
Je kunt ook eerdere requests cancellen. Moet je wel zeker weten dat je server ze niet alsnog helemaal afhandelt door een ignore_user_abort() (PHP) of iets dergelijks.
Beter is gewoon om zoveel mogelijk te voorkomen dat zinloze requests naar de server worden gestuurd...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
BARO schreef op donderdag 10 februari 2011 @ 21:29:
Je zou het bijvoorbeeld als volgt kunnen maken:

[...]
Of zet het throttle-gedrag op met deze plugin: http://benalman.com/proje...throttle-debounce-plugin/
Is het gelijk netjes modulair.
Pagina: 1