Question

Ok, j'ai passé un certain temps sur ce problème et c'est ce que j'ai recueillis:

  1. Si vous faites un appel AJAX dans IE7 et vous avez une fenêtre.onbeforeunload fonction spécifiée, il appelle la onbeforeunload fonction.

  2. Si vous essayez d'ouvrir une nouvelle fenêtre avec fenêtre.ouvert SANS perturber la fenêtre, le onbeforeunload est appelée.

Personne ne sait comment arrêter cela?J'ai même essayé de la définition d'une variable à TRUE, et vérifiez que la variable dans mon onbeforeunload fonction et il a encore un travail dosent!J'ai juste besoin d'être en mesure d'arrêter l'exécution de cette méthode pour les appels AJAX et de la nouvelle fenêtre d'appels.

Était-ce utile?

La solution

Une autre possibilité et probablement plus simple est de revenir faux lorsque vous ouvrez le menu contextuel:

<a onclick="window.open(...); return false;" href="javascript:;" >my link</a>

Cela semble arrêter IE de penser que vous quittez la page et le déclenchement de l'événement. Toutes les autres options ne sont pas particulièrement viable pour moi.

Autres conseils

OK, je l'ai eu ce problème. J'ai un travail autour (plutôt désordre) pour elle.

Dans mon cas, je veux bloquer immédiatement la navigation parfois, et pas d'autres.

Alors, je suis en train un drapeau sur la fenêtre pour me dire si je veux bloqué. Alors, où vous faites votre window.open, juste avant que ne 'window.allowExit = true' alors dans le onbeforeunload, vérifiez window.allowExit = true.

Je le script java (ShowHelp) étant lancé à partir d'un lien:

<a href="javascript:ShowHelp('argument')" >HERE</a>

onbeforeunload est appelé avant le ShowHelp, si i a utilisé le onclick pour définir l'indicateur

<a onclick="window.allowExit = true;" href="javascript:ShowHelp('argument')" >HERE</a>

laid comme le péché, mais il semble fonctionner!

Ce n'est pas une solution, mais une explication pour toute personne qui est intéressé.J'ai juste couru un test rapide dans IE 7, et il déclenche l'onebeforeunload événement à tout moment un lien est cliqué, à moins que le HREF va quelque part sur la même page:c'est à diresauf s'il contient un #.Si ma supposition est que l'IE ingénieurs ont pensé que, lorsque quelqu'un clique sur un lien qui n'est pas à quelque part sur la page, alors ils doivent quitter la page, dans ce cas la page est sur le point de débarquer.Inutile de dire, il y a des problèmes évidents avec cette pensée.

Je me suis dit que vous avez juste besoin de désinitialiser la fonction window.onbeforeunload avant de faire quoi que ce soit, puis remettez-le lorsque vous avez terminé.

Je viens fini de désactiver la fonction dans IE.

J'avais le même problème, dans mon cas, toutes les demandes viennent de l'appel ajax, ce simplifier la solution, parce que quand je fixe le porblem avec bouton standard je l'ai fait une fonction récursive pour rediriger tous les onclick à ma fonction centralisée un dispath alors la rigth cliquez sur. Je copie la solution pour l'appel ajax suporting problème href aussi. Cela permet d'éviter de solution pour revenir à la page précédente. Placez le code dans un fichier nommé backbutton, js Toute écriture de commentaire à mparma@usa.net~~V~~singular~~3rd avec le sujet: backbutton javascript

<!--  backbutton developed by Manuel Parma 2011-06-10 -->
<!--  email: mparma@usa.net -->
<!--  Add the next line into the <body> section as a first line  -->
<!--  <script type="text/javascript" src="<path>/backbutton.js"></script> -->

<!-- Address used when backtoLogin is 1 or when there is not previous page from site -->
var returningAddress = "http://my returning address"

<!-- Message to display when an external action (back button, forward button, backspace) move without press the application buttons -->
var backButtonMessage = "Using the browser's Back button may cause a loss in data. Please use the Back and Continue buttons at the bottom of the form."

<!-- 0=no / 1=yes (assume per default that the back button will be pressed -->
<!--               and come into action if this was NOT the case)          -->
var backButtonPressed = 1;    

<!--This var when is setted to 1 avoid to captureEvent set backbuttonPressed to 1, otherwise unload event cannot detect the right state of backButtonPressed-->
var onbeforeunloadeventFired = 0;

<!--Indicate to logic back to first page (login) when its value is 1 otherwise the logic back to previous page out of the site-->
var backtoLogin = 0;
var DoPostBackWithOptionsHook = null;
var DoPostBackHook = null;


<!-- Check the previous status -->
if (window.name == ""){
    <!-- When window.name is empty, this is indicating the first call of site -->
    window.name = "L0001";
}
else { 
    if (window.name == "L0000_back"){
        <!-- In this condition the page is returning after a foward button press  -->
        setBackButton(0);
        window.name = "";

        <!-- the system reload the page to clean the data -->
        window.location.href = returningAddress;
    }
    else {
        if (window.name.indexOf("_back") > 4){
            <!-- when the word back is present, the previous call is sending a message that the back button was pressed and the site is going out -->

            <!-- get the internal counter -->
            var sLastValue = modifynamevalue(0);    

            <!-- set the count to go back -->
            var iCountBack = -(sLastValue * 1);
            if (backtoLogin == 1) {iCountBack++;};

            if (window.history.length - 2 < -iCountBack) {
                iCountBack = -(window.history.length - 2);
            }

            <!-- the site is flag that first page needs to reload -->
            window.name = "L0000_back";             
            setBackButton(0);

            <!-- the site is returning to the first page or previous -->
            window.history.go(iCountBack);
        }
        else {
            <!-- increase the internal counter -->
            var sLastValue = modifynamevalue(+1);
            window.name = "L" + sLastValue;
        }
    }
}

<!-- Set the events needed to manage the back and forwar button situations -->

$(document).ready(function(){
    if (typeof(Sys) == "object") {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);

        window.onbeforeunload = onbeforeunloadEvent;
        window.onunload = unloadEvent;
        DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions;
        WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook;

        doPostBackHook = __doPostBack;
        __doPostBack =  __doPostBackHook;

    }

    });

function WebForm_DoPostBackWithOptionsHook(options) {
    setBackButton(0);
    return DoPostBackWithOptionsHook(options)
}

function __doPostBackHook(eventTarget, eventArgument) {
    if (backButtonPressed == 1) {
        setBackButton(0);
    }
    return doPostBackHook(eventTarget, eventArgument)
} 

function beginRequest(sender, args) {
    setBackButton(0);
    <!-- setting onbeforeunloadeventFired = 1 I take care to avoid anyone changed the Backbutton until endrequest -->
    onbeforeunloadeventFired = 1;
}


function endRequest(sender, args) {
    onbeforeunloadeventFired = 0;
    setBackButton(1);
}

<!-- unload event handler -->
function unloadEvent(evt) {
    <!-- double coundition using onbeforeunloadeventFired == 1 garantee avoid problemas with redirect operations -->
    if ((backButtonPressed == 1) && (onbeforeunloadeventFired == 1)) {
        <!-- decrement the internal counter -->
        var sLastValue = modifynamevalue(-1);
        window.name = "L" + sLastValue + "_back";
    }

    if (DoPostBackWithOptionsHook !== null) {
        WebForm_DoPostBackWithOptions = DoPostBackWithOptionsHook;
    };

    if (doPostBackHook !== null) {
        __doPostBack = doPostBackHook;
    };
}

<!-- on before unload -->
function onbeforeunloadEvent(evt) {
    onbeforeunloadeventFired = 1;
    if (backButtonPressed == 1) {
        return backButtonMessage;
    };
}


<!-- used to set right backButtonPressed-->
function setBackButton(value){
    if (value == 0) {
        backButtonPressed = 0;
    }
    else {
        if (onbeforeunloadeventFired == 0) {
            backButtonPressed = 1;
        }
    }
}


<!-- increment and decrment the internal counter stored into windows.name -->
function modifynamevalue(iIncrement){
    var iCount = (window.name.substring(1, 5) * 1) + iIncrement;

    if (iCount < 0) {
        iCount = 0;
    }

    var sNewValue = iCount.toString();

    sNewValue = "0000".substring(0, 4 - sNewValue.length) + sNewValue;
    return sNewValue;
}

Sid_M dit un argument valable, avec cette conception du navigateur, nous devons concevoir notre application en conséquence.

Pourquoi aller pour la balise d'ancrage et href pour les fenêtres pop-up, il suffit d'utiliser la méthode onclick dans l'étiquette ou même étiquette td et appeler window.open

Exemple simple d'un de ma demande

<td class="popuplink" onMouseOver="this.style.cursor='hand'" onclick="javascript:openMe('img/howitworks.png', 'pndpopup', 600,650)"><u> How it works</u></td>

Avez-vous essayé de retirer gestionnaire de l'événement « onbeforeunload » avant d'appeler à window.open? Cela peut aider, mais je ne ai jamais testé.

Cela pourrait très possible de résoudre votre problème!

Parce que j'ai eu un problème similaire et ce fait de manière go!

window.onbeforeunload = warnFunction;
var warnRequired = true;
function warnFunction () {
    if (warnRequired) return ("Please Stay! Don't go!");
    return ;
}

Et chaque fois que je fais un appel Ajax ou PopUp une autre fenêtre, je viens de mettre en warnRequired false.

Une autre chose il faut savoir quand faire un appel Ajax qui est synchronisé autre variable peut-être pas encore été fixée! (A Gotcha méchant!)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top