لتنفيذ وظيفة التنظيف المرنة عندما يتم إغلاق المتصفح من قبل المستخدم
-
22-07-2019 - |
سؤال
لدي تطبيق عميل 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 }