5

Chcę ostrzec użytkowników po odświeżeniu lub naciśnięciu przycisku Wstecz przeglądarki, jeśli wprowadzili coś w polach tekstowych. Więc użyłem funkcji window.onbeforeunload, aby to zrobić.window.onbeforeunload pożary w IE dla zdarzeń częściowego oddzwonienia

window.onbeforeunload = function() { 
    if (if user hasn't entered any thing) { 
     return; 
    } 
    return 'Entered data will be lost.'; 
}; 

ten kod javascript działa poprawnie w Firefoksie i chrome. Ale w IE ta funkcja odpala dla przycisków z częściowym odwróceniem postów. Jakieś rozwiązanie tego problemu w IE? Dzięki :)

  • To stało z powodu Bug w IE

Odpowiedz

5

funkcja window.onbeforeunload nie wykonać poprawnie w IE. Ponieważ niektóre częściowe informacje zwrotne są również uważane za "próbę opuszczenia strony". Jeśli łącze na stronie ma href = "javascript: ...." (ASP.Net LinkButton jest renderowany w ten sposób), IE niepoprawnie wywoła zdarzenie zwalniania okna po kliknięciu łącza. więc, na bieżąco zmienną dirtyflag i dodano

var __ignoreDirtyFlag = false; 

$(document).ready(function() { 
    if ($.browser.msie) { 
     $('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function() { 
      __ignoreDirtyFlag = true; 
     }); 
    } 
}); 

teraz po stronie załadowaniu odnośników rozpoczął href^= „JavaScript” będzie przypisany tej funkcji. po kliknięciu łącza tworzy on zmienną __ingoreDirtyFlag true; dodaje

window.onbeforeunload = function globalWindowUnload() { 
    if (!__ignoreDirtyFlag && isDataFilled == true) { 
     return "You have unsaved changes on this page. If you leave this page, those changes will be lost."; 
    } 
    __ignoreDirtyFlag = false; 
    return; 
}; 

jeśli istnieje jakieś panele aktualizacji asp zostały użyte na stronie, powyżej wiązania link funkcji zostanie usunięty. , więc musimy ponownie powiązać funkcję z łączami, gdy panel aktualizacji zostanie odświeżony.

tak

function foo() { 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 
} 

function endRequestHandler(sender, args) { 
    // Do your stuff 
    if ($.browser.msie) { 
     $('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function() { 
      __ignoreDirtyFlag = true; 
     }); 
    } 
} 

i

do ciała sposób znacznik onload, że assinged sposób foo(). <body onload="foo()">

ten siekać działa poprawnie z IE i wszystkich przeglądarek :) dzięki

+0

Ta odpowiedź jest technicznie interesujące. Szkoda, że ​​tak trudno jest czytać. –

+1

Nie widziałem znacznika * jquery * –

+0

Hej, wiem, że ta odpowiedź ma już prawie 3 lata, ale czy sądzisz, że mogłabyś dodać inną wersję odpowiedzi, ponieważ pytanie nie zostało oznaczone jako jquery? –

0

`var inFormOrLink = false; var url_auth = ''; var __ignoreDirtyFlag = false;

document).ready(function() { 

if ($.browser.msie) { 
    $('').bind('click.ignoreDirtyFlag', function() { __ignoreDirtyFlag = true; alert("teste luiz") }); 

    window.onbeforeunload = function() { 
     if (!__ignoreDirtyFlag) { 
      return "Tem certeza que deseja encerrar a sessão TESTE LUIZ?"; 
     } 
     __ignoreDirtyFlag = false; 
     return; 
    }; 
} 
else { 
    $('*').live('click', function() { inFormOrLink = true; alert("Passou aqui 1 LUIZ"); }); 
    $('*').bind('submit', function() { inFormOrLink = true; alert("Passou aqui 2"); }); 
    window.onbeforeunload = function() { 
     if (!inFormOrLink) { 

      if (window.location.href.indexOf("DEV2") != -1) { 
       $.post("/DEV2/SSQ/AUTH/LOGOUT", null); 
       return 'Tem certeza que deseja encerrar a sessão TESTE DEV2?'; 
      }` 
+1

W przypadku większości odpowiedzi warto dodać wyjaśnienie, aby pokazać, jak działa kod, co pomaga innym osobom o mniejszym doświadczeniu programistycznym zrozumieć, co robi kod. –

+0

Celem jest wylogowanie użytkownika za każdym razem, gdy zamknie przeglądarkę lub ręcznie zmieni docelowy adres URL. –

0

celem jest wylogowanie użytkownika, gdy on zamknie przeglądarkę lub ręcznie zmienić docelowy adres URL

var url_auth = '';var __ignoreDirtyFlag = false;$(document).ready(function() {if ($.browser.msie) {$('a').live('click', function() { __ignoreDirtyFlag = true;}); $('*').bind('submit', function() { __ignoreDirtyFlag = true; });window.onbeforeunload = function() {if (!__ignoreDirtyFlag) {if (window.location.href.indexOf("DEV2") != -1) {$.post("/DEV2/SSQ/AUTH/LOGOUT", null);return 'Tem certeza que deseja encerrar a sessão ?';}}};