Autor Zpráva
Medvídek
Profil
Zdravim, nevíte v čem by mohl být problém v tomto kódu v IE8? V ostatních prohlížečích funguje korektně.

//ZAMEZENI ODCHODU ZE STRANKY PRI OVLADANI
function zamezitOdchod(){
    if(typeof window.onbeforeunload != 'undefined'){
     $(window).unbind('beforeunload');
     $(window).bind('beforeunload', function(){
            return lang["ustredna_se_ovlada"];
     });
     //console.log('Zamezení odchodu');
    }
}
//POVOLENI ODCHODU ZE STRANKY 
function povolitOdchod(){
    if(typeof window.onbeforeunload != 'undefined'){
     $(window).unbind('beforeunload');
     //console.log('Povolení odchodu');
    }
}
_es
Profil
Medvídek:
Prečo nepoužiješ jednoduché, naprieč prehliadačmi fungujúce, window.onbeforeunload=funkcia a namiesto toho „čaruješ“ s nejakými jQuery metódami? Okrem toho môže byť chyba aj inde ako v uvedenom kóde.
Medvídek
Profil
_es:
Prečo nepoužiješ jednoduché, naprieč prehliadačmi fungujúce, window.onbeforeunload=funkcia a namiesto toho ‚čaruješ‘ s nejakými jQuery metódami? Okrem toho môže byť chyba aj inde ako v uvedenom kóde.
Jelikož s jQuery "čaruju" napříč celým projektem, tak jsem použil tuto funkci z jQuery, jelikož nevím, jak je podporován napříč prohlížeči normální volání funkce ;-)
Takže sem se chtěl zeptat, jestli IE8 nemá s beforeunload nějaký problém, který je třeba řešit jinak. Pokud tedy píšeš, že by daný zápis měl fungovat v IE8, tak jdu hledat problém jinam a nebudu ti znechucovat dále den zápisy v jQuery, jelikož ti je očividně proti srsti.
_es
Profil
Medvídek:
jestli IE8 nemá s beforeunload nějaký problém
Vraj nie: developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload#Browser_compatibility
Nepokúšaš sa v rámci tej udalosti o nejaké „vylomeniny“, ktoré môžu niektoré prehliadače blokovať?

Jelikož s jQuery "čaruju" napříč celým projektem
No ale to „čarovanie“ by snáď malo mať nejaký praktický zmysel a nie len z jednoduchého funkčného jednoriadkového kódu spraviť 15riadkový polofunkčný.
Medvídek
Profil
Funguje to tak, že když se začne ovládat zařízení (pošlu ajaxem požadavek na ovládání, zavolám funkci zamezitOdchod), dokud se mi nevrátí správný status, že ovládání proběhlo v pořádku. Až se mi tento status vrátí, zavolám povolitOdchod(). Ale v IE 8 hned po zavolání zamezitOdchod() se ukáže hláška, jestli chci opravdu odejít ze stránky. Zkusim vyseparovat ukázku kódu.
Chamurappi
Profil
Reaguji na Medvídka:
jelikož nevím, jak je podporován napříč prohlížeči normální volání funkce
… a neumíš si to během půl minuty najít. Jako u většiny událostí je normální volání funkce podporované všude stejně. Vyjma prohlížečů, které onbeforeunload vůbec neznají. V jQuery žádné speciální ošetření není (opravuje se tam jen problém, který způsobuje jiná část knihovny).

Ale v IE 8 hned po zavolání zamezitOdchod() se ukáže hláška, jestli chci opravdu odejít ze stránky.
Předpokládám, že funkci voláš z odkazu, který má href="javascript:zamezitOdchod()". V takovém případě Explorer vyhodnotí, že můžeš opustit stránku (tedy že odejdeš na návratovou hodnotu té funkce) a vyvolá onbeforeunload. To, že ve skutečnosti nikam neodejdeš, protože zamezitOdchod vrací undefined, už nehraje roli.
_es
Profil
Medvídek:
No a jednoduché priradenie funkcie alebo hodnoty undefined do window.onbeforeunload, namiesto tých metód bind/unbind si skúšal?
Viď [#6] - mal by si tú funkciu volať inak - ak Chamurappi správne odhalil príčinu problému.
Medvídek
Profil
Zkusil jsem vysápnout volání. Je ve dvou skriptech, jeden který se stará o ovládání:

//tato funkce se vola kliknutim na elemet, tedy <a onclick="ovladat('CU01',1,'CU01_ARM');">
function ovladat(co,jak,uid){
   buffer["polozky"].push({"element" : co, "command" : jak, "uid" : uid});
   total["polozky"].push({"element" : co, "command" : jak});
   t = otextuj(co,jak);
   prekryjLayout(co,t);
   odbav();
   $("a.keyboardHover").remove();
   zamezitOdchod();
}

//OVLADANI
function ovladej(co,jak,klic,uid){
 odbavuju=1;
 $.ajax({
    url: "/app/.............",
    type: 'POST',
    dataType: "json",
    data: ".................",  
    cache: false,
    timeout: 60000,
    success: function(navrat) {
     
     if(navrat.status == 800){
            location.replace("/index.php");
     }   
        
     lastItem = navrat.currItem;
     if(navrat.vysledek == 1 || navrat.vysledek == 0 || navrat.vysledek == 2 || navrat.vysledek == 9){
       delete buffer["polozky"][klic];
       cekej(co,jak,uid);
       zpracovavam = 0;
       odbavuju=0;
       odbav();
     }
     if(navrat.vysledek == 8){
       alert('Nelze provést, blokováno!');
       delete buffer["polozky"][klic];
       delete total["polozky"][klic];
       zpracovavam = 0;
       odbavuju=0;
       $('#'+uid+' .loaderLayout').remove();
       $('#klavesnice li[rel='+co+'] .loaderLayout').remove();
       if(velikostObjektu(total["polozky"])>0){zamezitOdchod();}
       else{povolitOdchod();}
       odbav();
     }
     if(navrat.vysledek == 3){
      showAuthorize(3,co,jak,klic,uid);
     }
     if(navrat.vysledek == 4){
      showAuthorize(4,co,jak,klic,uid);
     }     
    },
    error: function(jqXHR, textStatus, errorThrown){
     delete buffer["polozky"][klic];
     zpracovavam = 0;
     odbavuju=0;
     odbav();
    }
 });
}

Toto jsou jediná místa, kde se daná funkce volá. Pak je ještě jeden skript, který výsledky ovládání kontroluje a pokud zjistí, že se už doovládalo, tak zavolá povolitOdchod()
_es
Profil
Medvídek:
Stále len vyťahuješ nejaké ďalšie časti kódu, kde môže byť problém a pritom môže byť problém ešte aj inde.
Možno by pomohla „živá“ ukážka, no či sa v hentom kóde bude chcieť niekto „hrabať“...
Možno máš nejaké základné chyby v samotnom fungovaní aplikácie.
Rátaš s tým, že načítanie odpovede servera nejaký čas trvá?
Nemôžu nastať problémy pri viacerých súčasných dotazoch na server - nebude sa to nejako „biť“?
Máš všetky premenné definované ( Časté potíže, zajímavosti a poučné debaty » Používejte var) a to tak, aby nenastali problémy súvisiace s predchádzajúcou otázkou?
Medvídek
Profil
_es:
Chápu, v tomhle problém není, jdu hledat jinam. Tento kus kódu sem sem dal, abyste viděli, jak se ta udáslot volá, takže ano, vytahuji kódy, který se toho problému týkají. Živá ukázka by byla na nic, je to prostě tento kus kódu. Nechápu, jakou souvislot má čekání na odpověď serveru, v tomto případně nepodstatné. Více dotazů na server současně nemůže nastat, jelikož se vždy posílá jeden příkaz a čeká se, dokud se nevykoná, poté se posílá další příkaz, dokud není buffer prázdný. A všechny proměnné jsou definované na začátku skriptu, sem sem nedával, nemá to spojitost.
EDIT

Tak dohledáno, netušil jsem, že IE8 si neporadí s href ve tvaru javascript:void(0); viz: http://filez.party-akce.cz/djpw/uld.html
Zítra ho odstraním.
_es
Profil
Medvídek:
Živá ukázka by byla na nic, je to prostě tento kus kódu.
Možno nie je, vraj to bol kus kódu v [#1], potom možno nejaký iný kus... A možno je chyba ešte v niečom inom.

Více dotazů na server současně nemůže nastat
A AJAXové volanie vo funkcii ovladej? Prečo by sa nedala tá funkcia zavolať ešte pred prijatím predchádzajúcej odpovede servera?

V kóde sú rôzne podivné globálne premenné - vyzerá to to na nepremyselný a chaotický návrh základnej funkčnosti aplikácie. Okrem toho by si na udalosť beforeunload veľmi spoliehať nemal.

V [#1] nemajú podmienky v 3. a 13. riadku zmysel, no to nebude príčina tvojho problému. Ale v niektorých prehliadačoch by to mohlo robiť problémy.


Medvídek:
Tak dohledáno, netušil jsem, že IE8 si neporadí s href ve tvaru javascript:void(0); viz: http://filez.party-akce.cz/djpw/uld.html
Tak bol teda Chamurappiho tip v [#6] správny a ak by si nedával nesprávne informácie o klikaní na kotvu: „tato funkce se vola kliknutim na elemet, tedy <a onclick="ovladat('CU01',1,'CU01_ARM');">“ tak by si mal radu skôr.
Medvídek
Profil
_es:
A AJAXové volanie vo funkcii ovladej? Prečo by sa nedala tá funkcia zavolať ešte pred prijatím predchádzajúcej odpovede servera?
Jelikož si aplikace hlídá, jestli dostala výsledek z posledního volání, pokud ne, tak tu funkci nezavolá. Musel by jí někdo zavolat ručně.

V kóde sú rôzne podivné globálne premenné - vyzerá to to na nepremyselný a chaotický návrh základnej funkčnosti aplikácie. Okrem toho by si na udalosť beforeunload veľmi spoliehať nemal.
To by si asi musel vidět celou aplikaci, aby to dávalo smysl. Celý JS kód má přes 1900 řádků. Na tu událost se nespoléhám, je to spíše takový komfort navíc. Pokud někdo stránku opustí, nic se nestane.

Tak bol teda Chamurappiho tip v [#6] správny
Ano, nenapadlo mě, že to může být "chyba" v IE8, jelikož v tom nevidím žádný přechod na jinou stránku, nebo její opuštění.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0