في الوثائق الرسمية لـ jQuery ، يتم تذكير المستخدمين بأن هذه طريقة منخفضة المستوى ويجب استبدالها بالطريقة .data() . يمكن لـ $.data(element, key, value) إرفاق أي نوع من البيانات بعناصر DOM، ولكن يجب تجنب تسرب الذاكرة الناتج عن المراجع الدائرية. النص الأصلي كما يلي:
تتيح لنا طريقة jQuery.data() إرفاق بيانات من أي نوع بعناصر DOM بطريقة آمنة من المراجع الدائرية وبالتالي من تسرب الذاكرة. يمكننا تعيين عدة قيم مميزة لعنصر واحد واسترجاعها لاحقًا:
لكن مشاكل هذه الطريقة لا تتوقف عند هذا الحد. في منتدى JQUERY، تمت مناقشة هذه المشكلة بعمق، واقترح robert.katic حلاً لها. إذا تم تطبيق الأسلوب $.data() على الكائن المضيف، فسيتم تحسين العملية، ولكن إذا تم استخدام هذه الطريقة على الكائن المحلي، فقد لا تكون النتيجة مرضية. في الظروف العادية، يمكن حذف عنصر باستخدام الطريقة .remove() ومسح البيانات الخاصة به. لكن بالنسبة للكائنات المحلية، لا يمكن حذف هذه البيانات ذات الصلة بالكامل حتى يتم إغلاق كائن النافذة. توجد هذه المشكلات أيضًا في كائن الحدث، لأنه يتم أيضًا تخزين معالجات الأحداث (المعالجات) باستخدام هذه الطريقة.
لذا، فإن أسهل طريقة لحل هذه المشكلة هي تخزين البيانات في سمة جديدة للكائن المحلي. الآن:
// ...
إذا (elem.nodeType) {
ذاكرة التخزين المؤقت[id] = dataObject;
elem[expando] = id;
} آخر {
elem[expando] = dataObject;
}
// ...
ومع ذلك، هذه الطريقة غير مجدية عندما يتعلق الأمر بقضايا الميراث. جربه:
فار الأصل = {};
var ChildA = Object.create(parent);
var ChildB = Object.create(parent);
$.data(parent, "foo", "parent value");
// قد يكون هذا مقصودًا
$.data( ChildA, "foo")
// => "القيمة الأصلية"
$.data( ChildB, "foo")
// => "القيمة الأصلية"
// قد لا يكون هذا مقصودًا
$.data( ChildA, "foo", "childA value" );
$.data( الأصل، "foo")
// => "قيمة الطفل أ"
$.data( ChildB, "foo")
// => "قيمة الطفل أ"
في البداية، الكائن الذي يقوم بتخزين البيانات غير موجود، لذلك يتم إنشاء كائن لتخزين القيمة الجديدة، كما هو موضح في الشكل
الآن، نحاول تعديل نفس بيانات الكائن ChildA.
لا يحتوي الكائن ChildA على هذه البيانات، لذا فهو يبحث عن سلسلة النموذج الأولي. ويصادف أن الكائن الأصلي يحتوي على هذه البيانات، ويتم الكتابة فوق قيمته على الفور. لذلك، إذا حصلت على قيمة "foo" من الكائنينparent وchildB، فستحصل على "قيمة ChildA" بدلاً من "قيمة الأصل".