Ajax hol van - hol nincs
Sziasztok!
Adott egy oldal, ahol a bejelentkezett felhasználóknak timelimit is van a http kérések közt. Ha letelt -> logout. Viszont van olyan szerkesztői funkció (Hírfeltöltés), ahol nem biztos, hogy elég ez az idő a POST-ig, emiatt egy kis (jquery1.4-) ajax-frissítéssel ezen az oldalon áthidalom:(Bocs a hosszú kódért.)
Természetesen az
Ez így rendben is ment - localhoston. Viszont élesben (másik gépről nézve) IE8 nem mindig küldi el a kérést, csak az órát teszi ki egy pillanatra, de adatforgalom nincs egy byte se. Ilyenkor egy pillanatra megy ki az óra, majd a
Miért?
Ha ilyen kis rész-HTML-t küldök ki szerveroldalról, akkor használhatok rá headert? (no-cache) Bár nem hiszem, hogy megoldaná a dolgot, ha a kérés se megy el.
Van egy másik oldal is, ahol majdnem ugyanezt alkalmazom, csak ott az oldalon kattintásra megy (menne) a kérés, ha az előző kattintás óta már telt el egy perc.
(Nyilván lehetne szebb-jobb js-t írni rá, ilyen észrevételt is szívesen veszek, de elsősorban a hiba oka érdekelne.)
■ Adott egy oldal, ahol a bejelentkezett felhasználóknak timelimit is van a http kérések közt. Ha letelt -> logout. Viszont van olyan szerkesztői funkció (Hírfeltöltés), ahol nem biztos, hogy elég ez az idő a POST-ig, emiatt egy kis (jquery1.4-) ajax-frissítéssel ezen az oldalon áthidalom:
var BaseURL = window.location.protocol + '//' + window.location.hostname + '/';
var Ora = document.createElement('img');
Ora.setAttribute('src', BaseURL + 'elérési_út/ora_02.gif');
setTimeout('Usercheck()', 60000);
function Usercheck() {
var Height = $('#login_box').height();
var Width = $('#login_box').width();
$('#login_box').html('');
$('#login_box').append(Ora);
$('#login_box').height(Height);
$('#login_box').width(Width);
$('#login_box').load(BaseURL + 'ajax/user_refresh/', function() {
if ($('#login_box').children().is("form[name='login_form']")) {
$('#message').html('<h5 class="red">Figyelem!</h5>' +
'<p class="red">A rendszer Önt kiléptette, a tartalmat nem tudja menteni.</p>');
window.scrollTo(0, 0);
$('#admin_menu').hide(1000);
} else {
setTimeout('Usercheck()', 60000);
}
});
}
Természetesen az
'ajax/user_refresh/'
controller és fv. létezik, és vissza is adja a kívánt tartalmat. (Van mindenféle ellenőrzés is, nincs-e letiltva a Júzer, stb., de ez itt nem lényeg.)Ez így rendben is ment - localhoston. Viszont élesben (másik gépről nézve) IE8 nem mindig küldi el a kérést, csak az órát teszi ki egy pillanatra, de adatforgalom nincs egy byte se. Ilyenkor egy pillanatra megy ki az óra, majd a
#login_box
előző tartalma.Miért?
Ha ilyen kis rész-HTML-t küldök ki szerveroldalról, akkor használhatok rá headert? (no-cache) Bár nem hiszem, hogy megoldaná a dolgot, ha a kérés se megy el.
Van egy másik oldal is, ahol majdnem ugyanezt alkalmazom, csak ott az oldalon kattintásra megy (menne) a kérés, ha az előző kattintás óta már telt el egy perc.
(Nyilván lehetne szebb-jobb js-t írni rá, ilyen észrevételt is szívesen veszek, de elsősorban a hiba oka érdekelne.)
Ha jól emlékszem van ajax
jquery javítás - gyakorlatilag ugyanazt csinálja, mint amit fentebb is írtam, szóval kliens oldalról oldja meg a problémát...
Elméletileg csak GET request-nél jelentkezik a probléma, szóval hacsak nem REST elveket sértesz, akkor használhatsz POST-ot helyette, az megoldja. A nocache header-el is lehet próbálkozni, de nagy valószínűséggel annak nem lesz hatása.
Elvileg a response header is működik.
Nem csak IE-vel van gond, régi opera és safari is bugos többé-kevésbé.
Nem biztos, hogy teljesen érted a böngésző cache koncepcióját, ha megtalálja a cuccot, amit keresel a cache-ben, akkor onnan szolgálja ki, ezért nem megy kérés a szerver felé... Először javítani kell a kódon, hogy kiküldje a no-cache header-t, utána meg üríteni kell a cache-t, és csak utána újra próbálni, hogy megy e.
Köszönöm szépen!
Nagyon köszönöm a részletes választ, azt hiszem ebben az (két) esetben maradok a +timestamp-nél. Szerveroldalon meg eldobom... :)
Azt viszont nem értem, hogy tesztkörnyezetben miért működött szintén IE8-al is. Lehet, hogy tiltva volt akkor a cache? Mindenesetre örülök, hogy ilyen egyszerűen is gyógyítható.
Gyorstárazás
$('#login_box')
. Nem ismerem a jQuery-t, de biztos vagyok benne, hogy ilyen esetekre ő is eltárolja az elemeket egy belső tömbjében, viszont ekkor is elég sok kódnak le kell futnia, amíg ezt az elemet visszakapod. Ezért érdemes inkább így megcsinálni:login_box.append(Ora);
login_box.append(Height);
...
Köszi
optimailizáljunk még!
Még a végén megkedvelem :)
Szerintem teljesen átlátható
Vonatroncsok
item.getParent().getNextsibling().getFirstChild().get...
És ezzel tényleg probléma van, könnyen elveszti az ember a fonalat, hogy na akkor most pontosan mivel is foglalkozunk. Illetve a Demeter törvényének is ellentmond.
Ja igazad van, ez tényleg