الأحداث في كوردوفا

من موسوعة حسوب

توفر كوردوفا العديد من الأحداث التي يمكن استخدامها من قبل التطبيقات. فيمكن لشيفرة التطبيقات إضافة مُنصِتات (listeners) لتلك الأحداث.

إليك مثالًا عن ذلك.، المثال مكون من ملفين.

ملف HTML:

<!DOCTYPE html>
<html>
    <head>
    <title>Device Ready Example</title>
    <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
    <script type="text/javascript" charset="utf-8" src="example.js"></script>
    </head>
    <body onload="onLoad()">
    </body>
</html>‎

ملف جافاسركيبت:

// example.js الملف
// انتظار تحميل الواجهة البرمجية للجهاز
//
function onLoad() {
    document.addEventListener("deviceready", onDeviceReady, false);
}
// الواجهات البرمجية للجهاز جاهزة
//
function onDeviceReady() {
    document.addEventListener("pause", onPause, false);
    document.addEventListener("resume", onResume, false);
    document.addEventListener("menubutton", onMenuKeyDown, false);
    // Add similar listeners for other events
}
function onPause() {
    //  pause معالجة الحدث
}
function onResume() {
    // resume معالجة الحدث
}
function onMenuKeyDown() {
    // menubutton معالجة الحدث
}
// إضافة معالجات لأحداث أخرى

ملاحظة: في العادة، يجب أن تستخدم التطبيقات التابع document.addEventListener لإرفاق مُنصِت (listener) بحدثٍ ما بمجرد وقوع الحدث deviceready.

يسرد الجدول التالي أحداث كوردوفا والمنصات المدعومة:

المنصات المدعومة

/الأحداث

أندرويد iOS ويندوز
deviceready نعم نعم نعم
pause نعم نعم نعم
resume نعم نعم نعم
backbutton نعم لا نعم
menubutton نعم لا لا
searchbutton نعم لا لا
startcallbutton لا لا لا
endcallbutton لا لا لا
volumedownbutton نعم لا لا
volumeupbutton نعم لا لا
activated لا لا نعم

deviceready

يُطلق الحدث deviceready عند تحميل كوردوفا بالكامل. هذا الحدث ضروري لأي تطبيق. إذ يُخطِر بأنّ واجهات كوردوفا البرمجية الخاصة بالجهاز قد تم تحميلها، وأنه بالإمكان الوصول إليها.

تتألف كوردوفا من شيفرتين أساسيتين: الشيفرة الأصلية (native) وشيفرة جافاسكريبت. أثناء تحميل الشيفرة الأصلية، يتم عرض صورة تحميل مُخصصة. من جهة أخرى، لا تُحمّل جافاسكريبت إلا بعد تحميل الدوم (DOM). هذا يعني أن تطبيق الويب قد يستدعي دوال جافاسكريبت قبل أن تصبح الشيفرة الأصلية المقابلة متاحة.

يُطلق الحدث deviceready بمجرد تحميل كوردوفا بالكامل. وبمجرد إطلاقه، يمكنك إجراء الاستدعاءات بأمان من الواجهات البرمجية لكوردوفا. عادةً ما ترُفق التطبيقات مُنصِتًا (listener) للحدث document.addEventListener بمجرد تحميل الدوم (DOM) الخاص بملف HTML.

يختلف سلوك الحدث deviceready عن الأحداث الأخرى. فأيُّ معالج أحداث (event handler) يتم تسجيله بعد إطلاق الحدث deviceready ستُسدعى دالة الرد (callback function) خاصته على الفور.

مثال:

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    // يمكنك الآن استخدام الواجهة البرمجية للجهاز بأمان
}

pause

يُطلق الحدث pause عندما ترسل المنصة الأصلية التطبيقَ إلى الخلفية، يحدث هذا عادةً عندما ينتقل المستخدم إلى تطبيق آخر.

مثال:

document.addEventListener("pause", onPause, false);
function onPause() {
    // Handle the pause event
}

ملاحظات خاصة بمنصة iOS

في مُعالج الحدث pause، لا تعمل أي استدعاءات للواجهة البرمجية لكوردوفا أو الإضافات المحلية التي تمر عبر لغة Objective-C، إلى جانب أي استدعاءات تفاعلية (interactive calls)، مثل التنبيهات أو الدالة console.log()‎. إذ لنْ تُعالج إلا عند استئناف التطبيق عند التشغيل الموالي.

الحدث resign المخصوص بنظام iOS هو بديل للحدث pause، ويرصد قيام المستخدمين بتمكين زر القفل Lock لأجل قفل الجهاز مع تشغيل التطبيق في المقدمة (foreground). إذا تم تمكين التطبيق (والجهاز) من اسخدام المهام المتعددة (multi-tasking)، فسيُقرن هذا الحدث مع حدث pause لاحق، ولكن فقط على منصة iOS 5. إذ تُدفع جميع التطبيقات متعددة المهام المقفلة في منصة iOS 5 إلى الخلفية. لكي تبقى التطبيقات قيد التشغيل عند قفلها في منصة iOS 5، قم بتعطيل تعدد المهام في التطبيق عن طريق ضبط الخاصية UIApplicationExitsOnSuspend عند القيمة YES. وإن أردت تشغيله أثناء قفله على منصة iOS 4، فهذا الإعداد لا يهم.

resume

يُطلق الحدث resume عندما تسحب المنصة الأصلية التطبيق من الخلفية.

مثال سريع

document.addEventListener("resume", onResume, false);
function onResume() {
    // Handle the resume event
}

ملاحظات خاصة بمنصة IOS

تُنفذ الدوال التفاعلية المُستدعاة من أحد معالجات الحدث pause في وقت لاحق عند استئناف التطبيق، والذي يُشار إليه من الحدث resume. ويشمل ذلك التنبيهات، والدالة console.log()‎، وكل الاستدعاءات القادمة من الإضافات أو الواجهة البرمجية لكوردوفا، والتي تمر عبر لغة Objective-C.

  • الحدث active: الحدث active المخصوص بنظام iOS هو بديل للحدث resume، حيث يرصد قيام المستخدمين بتعطيل الزر Lock لأجل فتح (unlock) الجهاز مع تشغيل التطبيق في المقدمة. إذا تم تمكين التطبيق (والجهاز) من استخدم المهام المتعددة، فسيُقرن هذا مع حدث resume لاحق، ولكن فقط في المنصة iOS 5. إذ ستُدفع جميع التطبيقات متعددة المهام المقفولة (locked) في منصة iOS 5 إلى الخلفية. إن أردت أن تبقى التطبيقات قيد التشغيل عند قفلها في المنصة iOS 5، قم بتعطيل تعدد المهام في التطبيق عن طريق ضبط الخاصية UIApplicationExitsOnSuspend عند القيمة YES. وإن أردت تشغيل التطبيق أثناء القفل على منصة iOS 4، فهذا الإعداد لا يهم.
  • الحدث resume: عندما يُستدعى من أحد معالجات الحدث resume، فالدوال التفاعلية مثل alert()‎ يجب أن تُغلّف داخل استدعاءٍ للدالة setTimeout()‎، مع ضبط قيمة المهلة (timeout) عند القيمة 0، وإلا فسيختنق التطبيق. مثلا:
document.addEventListener("resume", onResume, false);
function onResume() {
    setTimeout(function() {
            // ضع ما تريد أن يحدث هنا
        }, 0);
}

ملاحظات خاصة بمنصة أندرويد

ارجع إلى دليل دورة خياة أندرويد لمزيد من التفاصيل حول بعض الملاحظات الخاصة بالحدث resume في أندرويد.

backbutton

يُطلق هذا الحدث عندما يضغط المستخدم على زر الرجوع.

لتجاوز السلوك الافتراضي لزر الرجوع، عليك تسجيل مُنصتٍ (listener) للحدث backbutton. فلم يعد ضروريًا استدعاء أي تابع آخر لتجاوز سلوك الزر الخلفي.

مثال:

document.addEventListener("backbutton", onBackKeyDown, false);
function onBackKeyDown() {
    // معالجة الزر الخلفي
}

ملاحظات خاصة بمنصة ويندوز

إن أردت العودة للسلوك الافتراضي، فاطلق خطأً في دالة الرد (callback) الخاصة بالحدث backbutton، و الذي هو خروج التطبيق:

document.addEventListener('backbutton', function (evt) {
    if (cordova.platformId !== 'windows') {
        return;
    }
    if (window.location.href !== firstPageUrl) {
        window.history.back();
    } else {
        throw new Error('Exit'); // هذا سيوقف التطبيق
    }
}, false);

menubutton

يُطلق هذا الحدث عندما يضغط المستخدم على زر القائمة (menu button). انشاء معالجٍ أحداث (event handler) سيتجاوز السلوك الافتراضي لزر القائمة.

مثال:

document.addEventListener("menubutton", onMenuKeyDown, false);
function onMenuKeyDown() {
    // معالجة زر العودة
}

searchbutton

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

مثال:

document.addEventListener("searchbutton", onSearchKeyDown, false);
function onSearchKeyDown() {
    // معالجة زر البحث
}

startcallbutton

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

مثال:

document.addEventListener("startcallbutton", onStartCallKeyDown, false);
function onStartCallKeyDown() {
    // Handle the start call button
}

endcallbutton

يُطلق هذا الحدث عندما يضغط المستخدم على زر إنهاء المكالمة. يتجاوز هذا الحدث السلوك الافتراضي لنهاية المكالمة.

مثال:

document.addEventListener("endcallbutton", onEndCallKeyDown, false);
function onEndCallKeyDown() {
    // معالجة زر نهاية المكالمة
}

volumedownbutton

يُطلق هذا الحدث عند قيام المستخدم بالضغط على زر خفض الصوت. إذا احتجت إلى تجاوز السلوك الافتراضي لخفض الصوت، فيمكنك تسجيل منصتٍ للحدث volumedownbutton.

مثال:

document.addEventListener("volumedownbutton", onVolumeDownKeyDown, false);
function onVolumeDownKeyDown() {
    // Handle the volume down button
}

volumeupbutton

يُطلق هذا الحدث عند قيام المستخدم بالضغط على زر رفع الصوت. إن كنت بحاجة إلى تجاوز السلوك الافتراضي لرفع الصوت، فيمكنك تسجيل منصتٍ للحدث volumeupbutton.

مثال:

document.addEventListener("volumeupbutton", onVolumeUpKeyDown, false);
function onVolumeUpKeyDown() {
    // معالجة زر رفع الصوت
}

activated

يُطلق هذا الحدث عند تنشيط Windows Runtime. انظر توثيق MSDN لمزيد من التفاصيل وأنواع التنشيط.

مثال:

document.addEventListener("activated", activated, false);
function activated(args) {
    if (args && args.kind === Windows.ApplicationModel.Activation.ActivationKind.file) {
       // Using args.raw to get the native StorageFile object
       // StorageFile للخصول على الكائن الأصلي args.raw  استخدم
        Windows.Storage.FileIO.readTextAsync(args.raw.detail[0].files[0]).done(function (text) {
            console.log(text);
        }, function (err) {
            console.error(err);
        });
    }
}

ملاحظات خاصة بمنصة ويندوز

  • يمكنك الوصول إلى وسائط الحدث activated من الخاصية args.raw.detail[0]‎، إذ يمكنك استخدامها للحصول على مزيد من المعلومات حول الأنواع، أو لاستدعاء أحد توابع وسائط التنشيط.
  • تُنسخ أيضًا الوسائط الأصلية للحدث activated في args.detail[0]‎، ويمكن استخدامها كاحتياط في حالة فقدان إحدى خاصيات args الداخلية. انظر هذا الرابط لمزيد من التفاصيل.
  • يمكن أن يُطلق الحدث activated قبل الحدث deviceready، لذا يجب عليك حفظ راية التنشيط (activation flag) وحفظ args داخل سياق التطبيق في حال احتجت إليها - كما في حالة الهدف المشترك. ينبغي أن يحدث الاشتراك في الحدث activated قبل معالج الحدث deviceready (أو app.bindEvents بلغة قوالب كوردوفا).

انظر أيضا

مصادر