Temat: OnBlur vs IE
Witam.
Przepraszam, że się nie odzywam ale... praca :)
Niestety nadal jestem w kropce ale nie wydaje mi się już, że to kwestia onblura. Bardziej chyba coś z przekazywaniem zmiennych. Poniżej opisuję cały proces może to rzuci nieco światła i pomoże rozwiązać problem.
1. W pliku
func.php mam zdefiniowaną funkcję rysującą zawartość koszyka
draw_table($db). Funkcja jak funkcja - normalna - koszyk oparty na sesji z uwzględnieniem kilku zmiennych.
Jest tam też moje nieszczęsne
<input type='text' name='ilosc[]' value='21' onblur='mod_basket(this.value, 3)'>
Gdzie
21 to ilość danego towaru w koszyku a
3 to miejsce w tablicy z ilościami przypisane do danego towaru. Czyli mamy dwie tablice jedna z id towaru druga z ilościami. Funkcja ta (draw_table($db)) jest wywoływana 'po raz pierwszy' na stronie głównej koszyka.
2.
mod_basket wywołuje (teoretycznie) funkcje ajaxową mająca na celu odświeżenie ilości towarów ich wartości (cena towaru*ilosc) oraz sumy końcowej wartości całego koszyka. Funkcja
mod_basket znajduje się w pliku ajax_basket.js i poniżej prezentuje ją w całości.
function mod_basket(ilosc, i)
{
// kodujemy wartości, żeby zabezpieczyć je na czas transmisji HTTP
ilosc = encodeURIComponent(ilosc);
i = encodeURIComponent(i);
// dodajemy wartości do kolejki
cache.push("ilosc=" + ilosc +"&i=" + i + "&type=mod");
// kontynuuje jesli obiekt XMLHttpRequest jest wolny a pamięć podręczna nie jest pusta
if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0) && cache.length > 0)
{
// pobiera parametry z pamięci
var cacheEntry = cache.shift();
// wysyła żądanie dodania na serwer
xmlHttp.open("POST","data/ajax_basket.php",true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.onreadystatechange=f_basket_table_refresh;
xmlHttp.send(cacheEntry); }
}
function f_basket_table_refresh()
{
if (xmlHttp.readyState==4)
{
document.getElementById("koszyk_table").innerHTML=xmlHttp.responseText;
}
}
3. Jak widzicie
mod_basket odwołuje się do pliku ajax_basket.php gdzie przekazuje POSTem nową ilość dla danego towaru.
4. Plik ajax_basket.php robi niewiele bo jedynie aktualizuje zmienną sesji z ilością na odpowiednim rekordzie
$ilosc = (!ereg('[0-9]', $_POST['ilosc']) || empty($_POST['ilosc']) ? '1' : $_POST['ilosc']);
$i = (!ereg('[0-9]', $_POST['i']) ? '0' : $_POST['i']);
$_SESSION['ilosc'][$i] = $ilosc;
i następnie ponownie wywołuje funkcję php odświeżającą koszyk
draw_table($db) z pliku
func.php. Już na nowych zmiennych sesji koszyk jest (powinien być) poprawnie odświeżany z nowymi wartościami.
5. Kolejny krok to wywołanie funkcji
f_basket_table_refresh, która jak widzicie w pkt 2. po otrzymaniu nowego koszyka
if (xmlHttp.readyState==4)
przesyła go i odświeża w id='koszyk_table'
document.getElementById("koszyk_table").innerHTML=xmlHttp.responseText;
.
Zaktualizowany koszyk jest odświeżany i wyświetlany klientowi. Przynajmniej pod FF, Operą, Safari ale nie pod IE.
W Internet Explorerze po zmianie ilości towaru i wyjściu z pola koszyk pozostaje ten sam. Dopiero odświeżenie strony (F5) powoduje wyświetlenie nowej zawartości koszyka, ale wtedy już działa mechanizm wywołania funkcji 'po raz pierwszy' opisany w pkt 1.
Ponieważ po odświeżeniu są już prezentowane nowe wartości ilościowe w koszyku wnioskuję, że dochodzi do prawidłowej modyfikacji zmiennej sesji, czyli teoretycznie wywolanie funkcji onblur działa prawidłowo. Pytanie tylko dlaczego pod IE nie działa mechanizm odświeżenia nowej zawartości koszyka.
Dodam tylko, że podobny mechanizm, ale nie na input tekście tylko na przycisku z akcją onclick działa poprawnie w innej części serwisu.