Internet Explorer استدعاء نافذة.onbeforeunload على النافذة.فتح المكالمات اياكس

StackOverflow https://stackoverflow.com/questions/1658481

سؤال

حسنا, لقد قضيت بعض الوقت على هذه المشكلة و هذا هو ما كنت قد جمعت:

  1. إذا قمت بإجراء المكالمات اياكس في IE7 و لديك نافذة.onbeforeunload وظيفة محددة ، فإنه يدعو onbeforeunload وظيفة.

  2. إذا حاولت فتح نافذة جديدة مع نافذة.مفتوحة من دون إزعاج النافذة الحالية ، onbeforeunload يحصل تسمى.

لا أحد يعرف كيفية إيقاف هذا ؟ حتى أنني حاولت وضع متغير صحيح و التحقق من أن المتغير في onbeforeunload وظيفة ولا يزال dosent العمل!أنا فقط بحاجة إلى أن تكون قادرة على وقف تنفيذ هذه الطريقة من المكالمات اياكس و نافذة جديدة المكالمات.

هل كانت مفيدة؟

المحلول

خيار آخر وربما أبسط هو العودة خطأ عند فتح المنبثقة:

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

يبدو أن هذا يتوقف عن التفكير في أنك تغادر الصفحة وتشغيل الحدث. جميع الخيارات الأخرى لم تكن قابلة للحياة بشكل خاص بالنسبة لي.

نصائح أخرى

حسنا، لقد حصلت على هذه المشكلة. لدي (فوضوي إلى حد ما) يعمل حولها.

في حالتي، أريد منع التنقل بعيدا في بعض الأحيان، وليس غيرها.

لذلك، أنا أعطي علامة على النافذة لأخبرني إذا أردت حظرها. لذلك حيث تقوم به نافذتك. من قبل، قبل ذلك، قم بتنفيذ "Window.allowExit = TRUE 'ثم في تحميل OnebeforeUnly، تحقق من النافذة.

لدي برنامج نصي Java (Showhelp) يجري طرده من رابط:

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

يتم استدعاء Onebeforeunload قبل Showhelp، لذلك استخدمت OnClick لتعيين العلم

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

قبيح كما الخطيئة، ولكن يبدو أن العمل!

هذا ليس حلا ، ولكن تفسير أي شخص مهتم.جريت اختبار سريع في IE 7 ، حرائق onebeforeunload الحدث أي وقت النقر فوق الارتباط ما لم HREF يذهب في مكان ما في نفس الصفحة:أيإلا إذا كان يحتوي على #.لذا أعتقد أن أي مهندس كنت أفكر عندما يقوم شخص ما بالنقر فوق ارتباط هذا ليس إلى مكان آخر في الصفحة ، ثم يجب أن تكون مغادرة الصفحة ، في هذه الحالة الصفحة عن لتفريغ.وغني عن القول أن هناك مشاكل واضحة مع هذا التفكير.

احسب أنك بحاجة فقط إلى إلغاء تأمين الوظيفة في النافذة.

لقد انتهيت للتو تعطيل الميزة في IE.

واجهت نفس المشكلة، في حالتي تأتي جميع الطلبات من مكالمة ajax، وهذا يبسط الحل، لأنه عندما أصلحت المشكلة باستخدام الزر القياسي، قمت بوظيفة متكررة لإعادة توجيه كل النقرات إلى وظيفتي المركزية ثم إلغاء النقر الصحيح.أقوم بنسخ الحل الخاص بمشكلة Ajax call suporting href أيضًا.يتجنب هذا الحل العودة إلى الصفحة السابقة.ضع الرمز داخل ملف يسمى backbutton ، js أي تعليق اكتب إلى mparma@usa.net مع الموضوع:جافا سكريبت زر الرجوع

<!--  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 نقطة صحيحة، مع تصميم المتصفح هذا، يتعين علينا تصميم تطبيقنا وفقًا لذلك.

لماذا تختار علامة الربط & href للنوافذ المنبثقة، ما عليك سوى استخدام طريقة onclick في التسمية أو حتى علامة td واستدعاء window.open

مثال بسيط من أحد طلباتي

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

هل حاولت إزالة Handler من حدث "OnBeforeunload" قبل الاتصال به إلى Window.Open؟ هذا يمكن أن يساعد لكنني لم اختبرها أبدا.

هذا يمكن أن يحل محل مشكلتك!

لأنني كان لدي مشكلة مماثلة وهذا جعل الطريق!

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

وكلما كنت أقوم بإجراء مكالمة AJAX أو منبثق نافذة أخرى، فقد قمت فقط بتعيين حذر إلى False.

شيء آخر يجب أن يكون يدرك فقط عند إجراء مكالمة AJAX أنها متزامنة آخر قد لا يتم تعيين المتغير بعد! (جوتشا سيئة!)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top