chrome.storage

الوصف

استخدِم واجهة برمجة التطبيقات chrome.storage لتخزين التغييرات في بيانات المستخدمين واستردادها وتتبُّعها.

الأذونات

storage

لاستخدام واجهة برمجة التطبيقات storage API، يجب تقديم بيان عن إذن "storage" في ملف بيان الإضافة. على سبيل المثال:

{
  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...
}

المفاهيم وطريقة الاستخدام

توفّر Storage API طريقة خاصة بالإضافة للحفاظ على بيانات المستخدم وحالته. وهي تشبه واجهات برمجة تطبيقات مساحة التخزين في منصة الويب (IndexedDB وStorage)، ولكن تم تصميمها لتلبية احتياجات مساحة التخزين في الإضافات. في ما يلي بعض الميزات الرئيسية:

  • يمكن لجميع سياقات الإضافات، بما في ذلك عامل الخدمة في خدمة الإضافة والنصوص البرمجية للمحتوى، الوصول إلى واجهة برمجة التطبيقات Storage API.
  • يتم تخزين القيم القابلة للتسلسل في JSON كخصائص للكائنات.
  • واجهة برمجة التطبيقات Storage API غير متزامنة مع عمليات القراءة والكتابة المجمّعة.
  • تظل البيانات محفوظة حتى إذا محو المستخدم ذاكرة التخزين المؤقت وسجلّ التصفّح.
  • تظل الإعدادات المخزّنة محفوظة حتى عند استخدام ميزة وضع التصفّح المتخفي المُقسَّم.
  • تتضمّن مساحة تخزين مُدارة حصرية للقراءة فقط لسياسات المؤسسات.

هل يمكن للإضافات استخدام واجهات برمجة تطبيقات مساحة التخزين على الويب؟

على الرغم من أنّ الإضافات يمكنها استخدام واجهة Storage (التي يمكن الوصول إليها من window.localStorage) في بعض السياقات (النوافذ المنبثقة وصفحات HTML الأخرى)، لا ننصح بذلك للأسباب التالية:

  • لا يمكن لمشغّلات خدمات الإضافات استخدام Web Storage API.
  • تشارك النصوص البرمجية للمحتوى مساحة التخزين مع الصفحة المستضيفة.
  • يتم فقدان البيانات المحفوظة باستخدام Web Storage API عندما يُمحو المستخدم سجلّ التصفّح.

لنقل البيانات من واجهات برمجة تطبيقات مساحة تخزين الويب إلى واجهات برمجة تطبيقات مساحة تخزين الإضافات من مشغّل خدمة:

  1. حضِّر صفحة html للمستند الذي يظهر خارج الشاشة وملف نص برمجي. يجب أن يحتوي ملف النص البرمجي على روتين تحويل ومعالج onMessage.
  2. في عامل خدمة الإضافة، تحقّق من chrome.storage لبياناتك.
  3. إذا لم يتم العثور على بياناتك، يُرجى الاتصال برقم createDocument().
  4. بعد حلّ الوعد الذي تم إرجاعه، اتصل بالرقم sendMessage() لبدء إجراء الإحالة الناجحة.
  5. داخل معالِج onMessage للمستند الذي لا يظهر على الشاشة، استخدِم سلسلة إجراءات التحويل.

هناك أيضًا بعض الاختلافات الدقيقة في آلية عمل واجهات برمجة التطبيقات لتخزين الويب في الإضافات. اطّلِع على مزيد من المعلومات في مقالة مساحة التخزين وملفات تعريف الارتباط.

مساحات التخزين

تنقسم Storage API إلى مساحات التخزين التالية:

storage.local
يتم تخزين البيانات محليًا ويتم محوها عند إزالة الإضافة. الحد الأقصى لمساحة التخزين هو 10 ميغابايت (5 ميغابايت في الإصدار 113 من Chrome والإصدارات الأقدم)، ولكن يمكن زيادته من خلال طلب إذن "unlimitedStorage". ننصحك باستخدام storage.local لتخزين كميات أكبر من البيانات.
storage.managed
مساحة التخزين المُدارة هي مساحة تخزين للقراءة فقط للإضافات المثبَّتة وفقًا للسياسة، ويديرها مشرفي النظام باستخدام مخطّط يحدّده المطوّر وسياسات المؤسسة. السياسات مشابهة للخيارات، ولكنّ مشرف النظام هو من يضبطها بدلاً من المستخدم، ما يتيح ضبط الإضافة مسبقًا لجميع مستخدمي المؤسسة. للحصول على معلومات عن السياسات، يُرجى الاطّلاع على المستندات المخصّصة للمشرفين. لمزيد من المعلومات عن منطقة التخزين managed، يُرجى الاطّلاع على بيان مساحات التخزين.
storage.session
تخزين البيانات في الذاكرة طوال مدة جلسة المتصفّح ولا يتمّ عرضه تلقائيًا لنصوص برمجة المحتوى، ولكن يمكن تغيير هذا السلوك من خلال ضبط chrome.storage.session.setAccessLevel(). الحد الأقصى لمساحة التخزين هو 10 ميغابايت (1 ميغابايت في الإصدار 111 من Chrome والإصدارات الأقدم). واجهة storage.session هي إحدى الواجهات المتعددة التي ننصح بها لعمال الخدمة.
storage.sync
في حال تفعيل المزامنة، تتم مزامنة البيانات مع أي متصفّح Chrome سجّل المستخدم الدخول إليه. وفي حال إيقافها، سيكون سلوكها مثل storage.local. يخزِّن Chrome البيانات محليًا عندما يكون المتصفّح غير متصل بالإنترنت ويستأنف المزامنة عند إعادة الاتصال بالإنترنت. الحد الأقصى للحصة هو 100 كيلوبايت تقريبًا، أي 8 كيلوبايت لكل عنصر. ننصحك باستخدام storage.sync للحفاظ على إعدادات المستخدمين في جميع المتصفّحات التي تمت مزامنتها. إذا كنت تعمل مع بيانات المستخدمين الحسّاسة، استخدِم storage.session بدلاً من ذلك.

حدود مساحة التخزين والحدّ الأقصى لمعدل نقل البيانات

تفرض واجهة برمجة التطبيقات Storage API حدود الاستخدام التالية:

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

للحصول على تفاصيل عن حدود مساحة التخزين وما يحدث عند تجاوزها، اطّلِع على معلومات الحصة في sync وlocal وsession.

حالات الاستخدام

توضِّح الأقسام التالية حالات الاستخدام الشائعة لواجهة برمجة التطبيقات Storage API.

الاستجابة المتزامنة لتعديلات مساحة التخزين

لتتبُّع التغييرات التي تم إجراؤها على مساحة التخزين، أضِف مستمعًا إلى الحدث onChanged. عند حدوث أي تغيير في مساحة التخزين، يتم تشغيل هذا الحدث. يستمع رمز النموذج إلى هذه التغييرات:

background.js:

chrome.storage.onChanged.addListener((changes, namespace) => {
  for (let [key, { oldValue, newValue }] of Object.entries(changes)) {
    console.log(
      `Storage key "${key}" in namespace "${namespace}" changed.`,
      `Old value was "${oldValue}", new value is "${newValue}".`
    );
  }
});

يمكننا تطوير هذه الفكرة أكثر. في هذا المثال، لدينا صفحة خيارات تسمح للمستخدم بالتحويل بين "وضع تصحيح الأخطاء" (لم يتم عرض التنفيذ هنا). تحفظ صفحة الخيارات الإعدادات الجديدة على الفور في storage.sync، ويستخدم عامل الخدمة storage.onChanged لتطبيق الإعداد في أقرب وقت ممكن.

options.html:

<!-- type="module" allows you to use top level await -->
<script defer src="options.js" type="module"></script>
<form id="optionsForm">
  <label for="debug">
    <input type="checkbox" name="debug" id="debug">
    Enable debug mode
  </label>
</form>

options.js:

// In-page cache of the user's options
const options = {};
const optionsForm = document.getElementById("optionsForm");

// Immediately persist options changes
optionsForm.debug.addEventListener("change", (event) => {
  options.debug = event.target.checked;
  chrome.storage.sync.set({ options });
});

// Initialize the form with the user's option settings
const data = await chrome.storage.sync.get("options");
Object.assign(options, data.options);
optionsForm.debug.checked = Boolean(options.debug);

background.js:

function setDebugMode() { /* ... */ }

// Watch for changes to the user's options & apply them
chrome.storage.onChanged.addListener((changes, area) => {
  if (area === 'sync' && changes.options?.newValue) {
    const debugMode = Boolean(changes.options.newValue.debug);
    console.log('enable debug mode?', debugMode);
    setDebugMode(debugMode);
  }
});

التحميل المُسبق غير المتزامن من مساحة التخزين

بما أنّ مهام الخدمة لا تعمل طوال الوقت، تحتاج إضافات Manifest V3 أحيانًا إلى تحميل البيانات من مساحة التخزين بشكل غير متزامن قبل تنفيذ معالجات الأحداث. لإجراء ذلك، يستخدم مقتطف الرمز البرمجي التالي معالِج أحداث action.onClicked غير متزامن ينتظر تعبئة المتغير العام storageCache قبل تنفيذ منطقه.

background.js:

// Where we will expose all the data we retrieve from storage.sync.
const storageCache = { count: 0 };
// Asynchronously retrieve data from storage.sync, then cache it.
const initStorageCache = chrome.storage.sync.get().then((items) => {
  // Copy the data retrieved from storage into storageCache.
  Object.assign(storageCache, items);
});

chrome.action.onClicked.addListener(async (tab) => {
  try {
    await initStorageCache;
  } catch (e) {
    // Handle error that occurred during storage initialization.
  }

  // Normal action handler logic.
  storageCache.count++;
  storageCache.lastTabId = tab.id;
  chrome.storage.sync.set(storageCache);
});

أمثلة

توضِّح النماذج التالية مساحات التخزين في local وsync و session:

بالتوقيت المحلي

chrome.storage.local.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.local.get(["key"]).then((result) => {
  console.log("Value is " + result.key);
});

مزامنة

chrome.storage.sync.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.sync.get(["key"]).then((result) => {
  console.log("Value is " + result.key);
});

الجلسة

chrome.storage.session.set({ key: value }).then(() => {
  console.log("Value was set");
});

chrome.storage.session.get(["key"]).then((result) => {
  console.log("Value is " + result.key);
});

للاطّلاع على نماذج أخرى لواجهة برمجة التطبيقات Storage API، يمكنك استكشاف أيّ من العيّنات التالية:

الأنواع

AccessLevel

الإصدار 102 من Chrome والإصدارات الأحدث

مستوى الوصول إلى مساحة التخزين

تعداد

"TRUSTED_CONTEXTS"
تُحدِّد السياقات التي تأتي من الإضافة نفسها.

"TRUSTED_AND_UNTRUSTED_CONTEXTS"
تُحدِّد السياقات التي تأتي من خارج الإضافة.

StorageArea

الخصائص

  • onChanged

    الحدث<functionvoidvoid>

    Chrome 73 والإصدارات الأحدث

    يتم تشغيله عند تغيير عنصر واحد أو أكثر.

    تبدو الدالة onChanged.addListener على النحو التالي:

    (callback: function) => {...}

    • ردّ الاتصال

      دالة

      تظهر المَعلمة callback على النحو التالي:

      (changes: object) => void

      • التغييرات

        عنصر

  • محو

    غير صالح

    الوعد

    إزالة جميع العناصر من مساحة التخزين

    تبدو الدالة clear على النحو التالي:

    (callback?: function) => {...}

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      Promise<void>

      الإصدار 88 من Chrome والإصدارات الأحدث

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

  • الحصول على

    غير صالح

    الوعد

    الحصول على عنصر واحد أو أكثر من مساحة التخزين

    تبدو الدالة get على النحو التالي:

    (keys?: string | string[] | object, callback?: function) => {...}

    • مفاتيح

      سلسلة | سلسلة | عنصر اختياري

      مفتاح واحد للحصول عليه أو قائمة بالمفاتيح التي تريد الحصول عليها أو قاموس يحدّد القيم التلقائية (اطّلِع على وصف العنصر). ستؤدي القائمة أو العنصر الفارغ إلى عرض عنصر نتيجة فارغ. أدخِل null للحصول على محتوى مساحة التخزين بالكامل.

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      (items: object) => void

      • items

        عنصر

        عنصر يتضمّن عناصر في عمليات الربط بين المفاتيح والقيم

    • returns

      Promise<object>

      الإصدار 88 من Chrome والإصدارات الأحدث

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

  • getBytesInUse

    غير صالح

    الوعد

    تحصل على مقدار المساحة (بوحدات البايت) التي يستخدمها عنصر واحد أو أكثر.

    تبدو الدالة getBytesInUse على النحو التالي:

    (keys?: string | string[], callback?: function) => {...}

    • مفاتيح

      سلسلة | سلسلة[] اختيارية

      مفتاح واحد أو قائمة مفاتيح للحصول على إجمالي الاستخدام ستعرض القائمة الفارغة القيمة 0. أدخِل null للحصول على إجمالي استخدام كل مساحة التخزين.

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      (bytesInUse: number) => void

      • bytesInUse

        الرقم

        مقدار المساحة المستخدَمة في مساحة التخزين، بايت

    • returns

      Promise<number>

      الإصدار 88 من Chrome والإصدارات الأحدث

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

  • getKeys

    غير صالح

    الوعد الإصدار 130 من Chrome والإصدارات الأحدث

    الحصول على جميع المفاتيح من مساحة التخزين

    تبدو الدالة getKeys على النحو التالي:

    (callback?: function) => {...}

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      (keys: string[]) => void

      • مفاتيح

        string[]

        صفيف يحتوي على مفاتيح تم قراءتها من مساحة التخزين

    • returns

      Promise<string[]>

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

  • إزالة

    غير صالح

    الوعد

    إزالة عنصر واحد أو أكثر من مساحة التخزين

    تبدو الدالة remove على النحو التالي:

    (keys: string | string[], callback?: function) => {...}

    • مفاتيح

      سلسلة | سلسلة[]

      مفتاح واحد أو قائمة بالمفاتيح للعناصر التي يجب إزالتها

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      Promise<void>

      الإصدار 88 من Chrome والإصدارات الأحدث

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

  • محدّدة

    غير صالح

    الوعد

    تعيين عناصر متعددة

    تبدو الدالة set على النحو التالي:

    (items: object, callback?: function) => {...}

    • items

      عنصر

      عنصر يمنح كل زوج مفتاح/قيمة لتعديل مساحة التخزين ولن تتأثّر أي أزواج أخرى من المفاتيح/القيم في مساحة التخزين.

      سيتم تسلسل القيم الأساسية، مثل الأرقام، على النحو المتوقّع. يتم عادةً تسلسل القيم التي تحتوي على typeof "object" و"function" إلى {}، باستثناء Array (يتم تسلسلها على النحو المتوقّع) وDate وRegex (يتم تسلسلها باستخدام تمثيل String).

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      Promise<void>

      الإصدار 88 من Chrome والإصدارات الأحدث

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

  • setAccessLevel

    غير صالح

    الوعد Chrome 102 والإصدارات الأحدث

    تُحدِّد مستوى الوصول المطلوب لمساحة التخزين. وستكون الإعدادات التلقائية هي السياقات الموثوق بها فقط.

    تبدو الدالة setAccessLevel على النحو التالي:

    (accessOptions: object, callback?: function) => {...}

    • accessOptions

      عنصر

      • accessLevel

        مستوى الوصول إلى مساحة التخزين

    • ردّ الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      Promise<void>

      تتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير طلبات الاستدعاء لأجل التوافق مع الإصدارات القديمة. ولا يمكنك استخدام كليهما في طلب الدالة نفسه. يتم حلّ الوعد بالنوع نفسه الذي يتم تمريره إلى دالة الاستدعاء.

StorageChange

الخصائص

  • newValue

    أيّ اختياري

    القيمة الجديدة للعنصر، في حال توفّر قيمة جديدة

  • oldValue

    أيّ اختيارية

    القيمة القديمة للعنصر، في حال توفّر قيمة قديمة

الخصائص

local

تكون العناصر في مساحة التخزين local محلية لكل جهاز.

النوع

StorageArea و object

الخصائص

  • QUOTA_BYTES

    10485760

    الحد الأقصى للبيانات (بوحدة البايت) التي يمكن تخزينها في مساحة التخزين المحلية، ويتم قياسها من خلال تحويل كل قيمة إلى سلسلة JSON بالإضافة إلى طول كل مفتاح. سيتم تجاهل هذه القيمة إذا كانت الإضافة تملك الإذن unlimitedStorage. وتؤدي التعديلات التي تؤدي إلى تجاوز هذا الحد إلى تعذُّر إكمالها على الفور وضبط القيمة runtime.lastError عند استخدام دالة استدعاء أو وعد مرفوض في حال استخدام async/await.

managed

يتم ضبط العناصر في مساحة التخزين managed من خلال سياسة مؤسسة ضبطها مشرف النطاق، وهي للقراءة فقط في الإضافة، ويؤدي محاولة تعديل مساحة الاسم هذه إلى ظهور خطأ. للحصول على معلومات عن ضبط سياسة، يُرجى الاطّلاع على بيان مساحات التخزين.

النوع

session

‏Chrome 102 والإصدارات الأحدث MV3 والإصدارات الأحدث

يتم تخزين العناصر في مساحة التخزين session في الذاكرة ولن يتم الاحتفاظ بها على القرص.

النوع

StorageArea وobject

الخصائص

  • QUOTA_BYTES

    10485760

    الحد الأقصى للبيانات (بالبايت) التي يمكن تخزينها في الذاكرة، كما يتم قياسه من خلال تقدير استخدام الذاكرة المخصّصة ديناميكيًا لكل قيمة ومفتاح وتؤدي التعديلات التي قد تؤدي إلى تجاوز هذا الحد إلى تعذُّر إكمالها على الفور وضبط القيمة runtime.lastError عند استخدام دالة استدعاء أو عند رفض وعد.

sync

تتم مزامنة العناصر في مساحة التخزين sync باستخدام ميزة "مزامنة Chrome".

النوع

StorageArea وobject

الخصائص

  • MAX_ITEMS

    512

    الحد الأقصى لعدد العناصر التي يمكن تخزينها في مساحة التخزين المخصّصة للمزامنة إنّ التعديلات التي تؤدي إلى تجاوز هذا الحدّ ستتعذّر على الفور وستضبط runtime.lastError عند استخدام دالة استدعاء أو عند رفض وعد.

  • MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE

    1000000

    تمّ إيقافه نهائيًا

    لم تعُد واجهة برمجة التطبيقات storage.sync API تتضمّن حصة مستمرة لعملية الكتابة.

  • MAX_WRITE_OPERATIONS_PER_HOUR

    1800

    الحد الأقصى لعدد عمليات set أو remove أو clear التي يمكن إجراؤها كل ساعة. وهذا يعني إجراء عملية واحدة كل ثانيتَين، وهو حدّ أقصى أقل من الحدّ الأقصى لعدد عمليات الكتابة في الدقيقة على المدى القصير.

    وتؤدي التعديلات التي تؤدي إلى تجاوز هذا الحد إلى تعذُّر إكمالها على الفور وضبط القيمة runtime.lastError عند استخدام دالة استدعاء أو عند رفض وعد.

  • MAX_WRITE_OPERATIONS_PER_MINUTE

    120

    الحد الأقصى لعدد عمليات set أو remove أو clear التي يمكن إجراؤها كل دقيقة وهذا يعني إجراء عمليتين في الثانية، ما يوفر معدل نقل بيانات أعلى من عمليات الكتابة في الساعة خلال فترة زمنية أقصر.

    وتؤدي التعديلات التي قد تؤدي إلى تجاوز هذا الحد إلى تعذُّر إكمالها على الفور وضبط القيمة runtime.lastError عند استخدام دالة استدعاء أو عند رفض وعد.

  • QUOTA_BYTES

    102400

    الحد الأقصى للمبلغ الإجمالي (بالبايت) للبيانات التي يمكن تخزينها في مساحة التخزين المخصّصة للمزامنة، كما يتم قياسه من خلال تحويل كل قيمة إلى سلسلة JSON بالإضافة إلى طول كل مفتاح وتؤدي التعديلات التي قد تؤدي إلى تجاوز هذا الحد إلى تعذُّر إكمالها على الفور وضبط القيمة runtime.lastError عند استخدام دالة استدعاء أو عند رفض وعد.

  • QUOTA_BYTES_PER_ITEM

    8192

    الحد الأقصى للحجم (بوحدة البايت) لكل عنصر فردي في مساحة التخزين المتزامنة، كما يتم قياسه من خلال تحويل قيمة العنصر إلى سلسلة JSON بالإضافة إلى طول مفتاحه ستتعذّر على الفور تحديثات العناصر التي تتجاوز هذا الحدّ، وسيتم ضبطها على runtime.lastError عند استخدام دالة استدعاء أو عند رفض وعد.

الفعاليات

onChanged

chrome.storage.onChanged.addListener(
  callback: function,
)

يتم تشغيله عند تغيير عنصر واحد أو أكثر.

المعلمات

  • ردّ الاتصال

    دالة

    تظهر المَعلمة callback على النحو التالي:

    (changes: object, areaName: string) => void

    • التغييرات

      عنصر

    • areaName

      سلسلة