Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax][jquery] Niezrozumiałe przerwanie - error
Forum PHP.pl > Forum > XML, AJAX > AJAX
my_key
Witam.

Mam funkcję do obsługi Ajax.
Wywołanie funkcji:
  1. var rsAjax = $.wAJAX({
  2. jqSelector : '#tableResultList .mainList',
  3. jqLoaderSelector : '#tableResultList > .loader',
  4. navigation : {
  5. '#alphabetSearch1Form' : {
  6. href : '<?php echo $ELEMENTS_LIST['href'].$PARAM.'/'; ?>',
  7. action : 'submit',
  8. type : 'refresh',
  9. addVal : '#alphabetSearch1Form-search'
  10. },
  11. '#alphabetSearch1Form-search' : {
  12. href : '<?php echo $ELEMENTS_LIST['href'].$PARAM.'/'; ?>',
  13. action : 'keyup',
  14. type : 'refresh',
  15. addVal : true
  16. },
  17. '#alphabetSearch1 .alphabet a' : {
  18. type : 'refresh'
  19. },
  20. '#criteriumName' : {
  21. href : '<?php echo $ELEMENTS_LIST['href'].$PARAM.'/'; ?>',
  22. type : 'refresh'
  23. }
  24. },
  25. cache : false
  26. });


W zmiennej "navigation" ustawiam selektory i odpowiednią dla nich akcje po jakiej ma zostać wykonane zapytanie ajax'a.
Podczas tworzenia obiektu tej funkcji wykonywana jest funkcja setNavigation(), która wygląda tak:

  1. setNavigation : function(){
  2. // Przepisanie obiektu
  3. var self = this;
  4. // Sprawdz czy jest zapisana jakas nawigacja
  5. if(self.genSets.navigation == null || typeof(self.genSets.navigation) != 'object') return false;
  6.  
  7. // Ustaw nawigacje
  8. for(var i in self.genSets.navigation){
  9. // Pobierz obiekt/y
  10. var obj = $(i);
  11. // Jezeli obiekt nie istnieje przejdz do kolejnego
  12. if(obj.length == 0) continue;
  13. // Pobierz opcje dla nawigacji
  14. var opt = self.genSets.navigation[i];
  15. // Selektory do wykonania
  16. var tmpSel = [];
  17. // Ustaw dla kazdego pasujacego elementu
  18. obj.each(function(){
  19. // Pobierz / ustaw unikalny id dla obiektu
  20. var objId = self.elementId($(this));
  21. // Zapisz opcje do pamieci
  22. self.nav[objId] = opt;
  23. });
  24. switch(opt['action']){
  25. case 'dbclick':
  26. obj.dbclick(function(){
  27. self.action($(this));
  28. });
  29. break;
  30. case 'keyup':
  31. obj.keyup(function(){
  32. self.action($(this));
  33. });
  34. break;
  35. case 'keydown':
  36. obj.keydown(function(){
  37. self.action($(this));
  38. });
  39. break;
  40. case 'submit':
  41. obj.submit(function(){
  42. self.action($(this));
  43. });
  44. break;
  45. case 'click':
  46. default:
  47. obj.click(function(){
  48. self.action($(this));
  49. });
  50. break;
  51. }
  52. }
  53. }


Zapisuje wszystkie obiekty w tablicy self.nav[objId] i po wykonaniu zdarzenia np. "click" pobieram id obiektu, pobieram jego opcje z tablicy self.nav i wykonuje zapytanie ajax'a które wygląda tak:

  1. // Wykonanie zapytania
  2. self.ax = $.ajax({
  3. type: sets.method,
  4. url: sets.href,
  5. dataType: sets.dataType,
  6. data: sets.queryData,
  7. beforeSend : function(){
  8. // Ustaw status - w trakcie wykonywania
  9. self.setStatus(1);
  10. },
  11. success: function(data){
  12. jqMatchedObj.html(data);
  13. // Funkcja uzytkownika
  14. if(typeof callback == 'function'){
  15. callback();
  16. }
  17. // Chowanie loadera
  18. if(self.genSets.jqLoaderSelector)
  19. self.hideLoader($(self.genSets.jqLoaderSelector));
  20. // Ustaw status - wykonane powodzeniem
  21. self.setStatus(3);
  22. },
  23. error: function(xhr, textStatus){
  24. // Chowanie loadera
  25. if(sets.loaderObj)
  26. self.hideLoader(sets.loaderObj);
  27. else if(self.genSets.jqLoaderSelector)
  28. self.hideLoader($(self.genSets.jqLoaderSelector));
  29. // Ustaw status - zakonczone porazka
  30. self.setStatus(4);
  31. // Zwroc blad
  32. alert(textStatus)
  33. },
  34. complete : function(xhr, textStatus){
  35. }
  36. });


I błąd polega na tym, że w niektórych przypadkach zapytanie jest przerywane po sekundzie, w firebug jest oznaczone na czerwono, że zostało przerwane i wykonywane jest zdazenie "error" dla ajax'a a status błędu to "error".
Nie mam pojęcia dlaczego się tak dzieje, wykonuje ten sam adres i w jednym przypadku dla "click" działa w drugim nie, dla "keyup" działa dla "submit" już nie.

Czy ma ktoś jakiś pomysł gdzie może być błąd?
Z góry wszystkim dziękuję za pomoc.


Problem po części rozwiązany!
Mimo iż funkcja self.action() zwracała "false" w niektórych przypadkach po kliknięciu w element nawigacyjny <a href="..."></a> przeglądarka przechodziła do linku. Dodałem przy każdym wywołaniu nawigacji "return false" i już działa.
Pytanie tylko dlaczego czasami poprawnie interpretował "false" z funkcji self.action() a czasami nie...
Fantazyn
Jedyne co mi przychodzi do głowy to brak warunku, że strona się załadowała i próbujesz przypisać czasem zdarzenia do elementów, które nie zostały jeszcze utworzone.

W skrócie - wydaje mi się, że mogłeś zapomnieć o umieszczeniu wszystkiego w:
Kod
$(document).ready(function(){
//code
}


To by tłumaczyło działanie "czasami".

Ps. Jak możesz to pokaż czy firegub wywala coś prócz magicznego error (jakiś numer jeszcze?).

Powodzenia...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.