Witam.
Mam funkcję do obsługi Ajax.
Wywołanie funkcji:
var rsAjax = $.wAJAX({
jqSelector : '#tableResultList .mainList',
jqLoaderSelector : '#tableResultList > .loader',
navigation : {
'#alphabetSearch1Form' : {
href : '
<?php echo $ELEMENTS_LIST['href'].$PARAM.'/'; ?>',
action : 'submit',
type : 'refresh',
addVal : '#alphabetSearch1Form-search'
},
'#alphabetSearch1Form-search' : {
href : '
<?php echo $ELEMENTS_LIST['href'].$PARAM.'/'; ?>',
action : 'keyup',
type : 'refresh',
addVal : true
},
'#alphabetSearch1 .alphabet a' : {
type : 'refresh'
},
'#criteriumName' : {
href : '
<?php echo $ELEMENTS_LIST['href'].$PARAM.'/'; ?>',
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...
Ten post edytował my_key 12.11.2009, 13:06:51
Nowoczesne rozwiązania dla biznesu wtsoft.pl - kreujemy twoją przyszłość.