JQuery Ajaxerror () حرائق معالج إذا كان المستخدم يترك الصفحة قبل انتهاء الصفحة

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

  •  19-09-2019
  •  | 
  •  

سؤال

نحن نستخدم معالج JQuery's Global Ajaxerror () لتنبيه المستخدم لأي فشل AJAX:

$(document).ajaxError(function() {  
    $("There was a network or server error. Please try again later.").dialog({  
        title: "Error",  
        modal: true,  
        resizable: false,  
        buttons: { 'Ok': function() { (this).dialog("close"); } }  
    });  
});  

لسوء الحظ، ينطلق هذا المعالج الأخطاء العالمي أيضا إذا ترك المستخدم الصفحة قبل انتهاء التحميل. فيما يلي خطوات إعادة إنشاء الخطأ:

  1. يزور المستخدم صفحة A، والتي تتضمن عناصر تحميل عبر Ajax.
  2. عناصر Ajax في الصفحة A تبدأ التحميل.
  3. نقر المستخدم رابط لزيارة الصفحة ب قبل عناصر AJAX على الصفحة التي انتهت فيها التحميل.
  4. يظهر مربع حوار الخطأ لفترة وجيزة قبل إعادة توجيه المتصفح إلى الصفحة B.

أي فكرة كيف يمكننا الحصول على ajaxerror () لا تؤدي إلى التشغيل عند سبب الخطأ مباشرة من المستخدم الذي يزور صفحة جديدة؟

تحديث: إليك التعليمات البرمجية الخاصة بي الآن، بعد دمج الاقتراحات في التعليقات:

// I added a 3 second delay to our error dialog, enough time
// for the user to leave for a new page:
$(document).ajaxError(function() {
    setTimeout(my_error_handler, 3000);
});

// Warn user before leaving page if AJAX is still loading.
// Not sure I'll keep this:
$(document).ajaxStart(function() {
    ajaxing = true;
});

$(document).ajaxStop(function() {
    ajaxing = false;
});

window.onbeforeunload = function() {
    if (typeof(ajaxing) != 'undefined' && ajaxing) {
        return "Page elements are still loading!";
    }
};
هل كانت مفيدة؟

المحلول

حسنا، إذا كان المستخدم يتنقل إلى صفحة أخرى، فسيتم إحباط XHR، وهو، في الواقع، اتصالا غير ناجح. سيكون الحل لتسجيل المستمع ل onbeforeunload الحدث، ونشر ajaxError هناك، قائلا أساسا: المستخدم على وشك مغادرة الصفحة، لذلك لا أرغب في إطلاع أخطاء AJAX التي قد تتبع ذلك.

بعض المواقع، على الرغم من، مثل Gmail، افعل الطريقة الأخرى حولها: إذا حاولت التنقل بعيدا عن الصفحة أثناء وجود بعض طلبات AJAX معلقة، فهذا يمنحك موجه يقول إنك حصلت على بعض العمليات التي لا تزال تعمل، ويتيح يقرر المستخدم ما إذا كان سيتم البقاء على الموقع حتى ينتهي الطلب، أو للمضي قدما والانتقال بعيدا.

نصائح أخرى

بناء على استجابة ديفيد هيدلوند أعلاه هنا رمز يعمل بالنسبة لي:

//enable global ajax error handling
$(document).ajaxError(function (event, request, settings) {
    //your error handling code here
});

//user leaving page so ignore any unfinished ajax loads
$(window).bind('beforeunload', function () {
    $(document).unbind('ajaxError');
});

حصلت على 'ajaxError' المواصفات من قسم التعليقات مسج Ajaxerror الوثائق. وبعد اضطررت إلى الربط beforeunload ل $(window) من أجل دعم Chrome (أي يعمل بشكل جيد مع المستند). .ajaxError لم يطلق النار عندما كنت ملزما $(window) لذلك لهذا السبب لدي حل النافذة / المستند هذا.

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