Mam funkcję do obsługi Ajax.
Wywołanie funkcji:
var rsAjax = $.wAJAX({ jqSelector : '#tableResultList .mainList', jqLoaderSelector : '#tableResultList > .loader', navigation : { '#alphabetSearch1Form' : { action : 'submit', type : 'refresh', addVal : '#alphabetSearch1Form-search' }, '#alphabetSearch1Form-search' : { action : 'keyup', type : 'refresh', addVal : true }, '#alphabetSearch1 .alphabet a' : { type : 'refresh' }, '#criteriumName' : { type : 'refresh' } }, cache : false });
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:
setNavigation : function(){ // Przepisanie obiektu var self = this; // Sprawdz czy jest zapisana jakas nawigacja if(self.genSets.navigation == null || typeof(self.genSets.navigation) != 'object') return false; // Ustaw nawigacje for(var i in self.genSets.navigation){ // Pobierz obiekt/y var obj = $(i); // Jezeli obiekt nie istnieje przejdz do kolejnego if(obj.length == 0) continue; // Pobierz opcje dla nawigacji var opt = self.genSets.navigation[i]; // Selektory do wykonania var tmpSel = []; // Ustaw dla kazdego pasujacego elementu // Pobierz / ustaw unikalny id dla obiektu var objId = self.elementId($(this)); // Zapisz opcje do pamieci self.nav[objId] = opt; }); switch(opt['action']){ case 'dbclick': obj.dbclick(function(){ self.action($(this)); }); break; case 'keyup': obj.keyup(function(){ self.action($(this)); }); break; case 'keydown': obj.keydown(function(){ self.action($(this)); }); break; case 'submit': obj.submit(function(){ self.action($(this)); }); break; case 'click': default: obj.click(function(){ self.action($(this)); }); break; } } }
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:
// Wykonanie zapytania self.ax = $.ajax({ type: sets.method, url: sets.href, dataType: sets.dataType, data: sets.queryData, beforeSend : function(){ // Ustaw status - w trakcie wykonywania self.setStatus(1); }, success: function(data){ jqMatchedObj.html(data); // Funkcja uzytkownika if(typeof callback == 'function'){ callback(); } // Chowanie loadera if(self.genSets.jqLoaderSelector) self.hideLoader($(self.genSets.jqLoaderSelector)); // Ustaw status - wykonane powodzeniem self.setStatus(3); }, error: function(xhr, textStatus){ // Chowanie loadera if(sets.loaderObj) self.hideLoader(sets.loaderObj); else if(self.genSets.jqLoaderSelector) self.hideLoader($(self.genSets.jqLoaderSelector)); // Ustaw status - zakonczone porazka self.setStatus(4); // Zwroc blad alert(textStatus) }, complete : function(xhr, textStatus){ } });
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...