لتنفيذ وظيفة التنظيف المرنة عندما يتم إغلاق المتصفح من قبل المستخدم

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

سؤال

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

أعراض

  • CustomEvent تم تشغيله، ولكن لم يتم تنفيذه.
    >> معالج الأحداث لـ CustomEvent.SEND_EVENTS يتم تعريفه بواسطة Mate EventMap.كل ما يفعله المعالج هو الاتصال بـ HTTPServiceInvoker.في وحدة التحكم في تصحيح الأخطاء، يمكنني رؤية تشغيل المعالج وHTTPServiceInvocer، ولكن لا resultHandlers ولا faultHandlers تم استدعاؤهم.أعلم أن معالج الحدث هذا ليس لديه مشكلة لأنه عندما أرسل نفس الشيء CustomEvent.SEND_EVENTS في معالج النقر فوق الزر، فإنه يتصرف تمامًا كما توقعت)
  • يبدو أن المتصفح ينتظر اكتمال وظيفة التنظيف قبل إغلاقه.(تمت طباعة جميع الآثار قبل إغلاق المتصفح)

شفرة

أضفت ما يلي إلى ملف Index.template.html

window.onbeforeunload = clean_up;

function clean_up()
{
 var flex = document.${application} || window.${application};
 flex.cleanUp();
}

واستخدم ما يلي في ملف التطبيق MXML

import flash.external.ExternalInterface;

public function init():void {
ExternalInterface.addCallback("cleanUp",cleanUp);
}

public function cleanUp():void {   

   var newEvent:CustomEvent = new CustomEvent(CustomEvent.SEND_EVENTS);
   newEvent.requestObj = myFormModel;

   dispatchEvent(newEvent);

   // for testing purposes
   // to see whether the browser waits for Flex cleanup to finish before closing down   
   var i:int;
   for (i=0; i<10000; i++){
        trace(i);
   }    

}

الإعداد الخاص بي

  • فليكس بيلدر 3
  • إطار عمل Mate MVC (Mate_08_9.swc)
  • فلاش بلاير 10
هل كانت مفيدة؟

المحلول

لسوء الحظ، لا توجد طريقة قوية للقيام بوظائف التنظيف هذه التي يتم تنفيذها بشكل غير متزامن.ال result/fault تحدث أحداث HTTPService بشكل غير متزامن بعد cleanUp يتم إرجاع الطريقة.المتصفح ينتظر فقط حتى onbeforeunload الدالة (js تنظيف وظيفة) يعود.إلا إذا اتصلت event.preventDefault() ومن هذه الوظيفة، سيتم إغلاق الصفحة.لاحظ أن الدعوة منع افتراضي() سيؤدي إلى ظهور نافذة منبثقة "موافق/إلغاء" تسأل:

هل أنت متأكد أنك تريد الابتعاد عن هذه الصفحة؟

اضغط على "موافق" للمتابعة، أو "إلغاء الأمر" للبقاء في الصفحة الحالية.

إذا اختار المستخدم "موافق"، فسيتم إغلاق المتصفح بالرغم من ذلك.يمكنك استخدام ال event.returnValue الخاصية لإضافة رسالة مخصصة إلى النافذة المنبثقة.

//tested only in Firefox
window.addEventListener("beforeunload", onUnload, false);
function onUnload(e)
{
   e.returnValue = "Some text that you want inserted between " +
     "'Are you sure' and 'Press OK' lines";
   e.preventDefault();
}

نصائح أخرى

لن تتمكن أبدًا من اكتشاف رمز المتصفح بشكل موثوق بنسبة 100% من الوقت.إذا كنت حقًا بحاجة إلى تنفيذ الإجراءات، فإن الإجراء الأكثر أمانًا هو جعل العملاء يرسلون رسائل "ما زلت على قيد الحياة" إلى الخادم.يحتاج الخادم إلى تتبع الوقت حسب العميل، وعندما لا يرسل العميل رسالة خلال الفترة الزمنية المحددة (مع بعض المساحة للمناورة)، فإنه يقوم بتشغيل أنشطة التنظيف.

كلما زاد الوقت كلما كان ذلك أفضل، يعتمد ذلك على مدى أهمية الوقت في عملية التنظيف.إذا تمكنت من الانتظار لمدة 5 دقائق فهذا أمر رائع، وإلا فانتظر دقيقة واحدة أو 30 ثانية أو أي شيء مطلوب لتطبيقك.

هناك طريقة بديلة لتنظيف الجلسة من جانب العميل وهي استخدام JavaScript و external.interface فئة في as3.هنا نموذج التعليمات البرمجية:

جافا سكريبت:

function cleanUp()
{

    var process;
    var swfID="customRightClick";
    if(navigator.appName.indexOf("Microsoft") != -1){
        process = window[swfID];
        }else
    {
        process = document[swfID];
    }
    process.cleanUp();
}

وفي فئة as3 حيث يتم تعريف وظيفة التنظيف، استخدم هذا:

import flash.external.ExternalInterface;

if (ExternalInterface.available)
{
    ExternalInterface.addCallback("cleanUp", cleanUp);
}

function cleanUp():void {// your code }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top