سؤال

لذلك، أنا أستخدم هذا المقتطف <tr onclick="this.toggleClassName('selected')"> على صفحة ويب. (وظيفة prototype.js) يعمل بشكل رائع. كل ما أقوم به هو النقر على صف جدول، ويبدو أنه يحدد. إنه يعمل في كل مكان، باستثناء IE والأوبرا. هذه مجرد راحة، لذلك لا أهتم حقا إذا كانت تعمل، ولكن في أي أنه يلقي خطأ، ويسأل المستخدم إذا كان هو / هي ترغب في تصحيح الأخطاء.

رسالة الخطأ أحصل عليها هي "كائن لا يدعم هذه الخاصية أو الطريقة." أي كائن أو طريقة قد تشير إلى؟ أي أفكار بطريقة سهلة لتنفيذ هذه الوظيفة في IE؟ ماذا عن عدم إلقاء رسائل الخطأ إلى المستخدم؟

شكرا، ديف

(http://math.davehampson.net.)

هل كانت مفيدة؟

المحلول

نعم، هذه هي أساسا المشكلة الرئيسية مع النموذج الأولي.

النموذج الأولي يعمل بشكل مختلف على المتصفحات المختلفة. على المتصفحات التي تتيح لك اللعب مع النماذج النماذج الأولية للأشياء المضيفة (مثل HTMLTableRowelement)، فإنه يضيف وظائفها الخاصة مثل toggleClassName لتلك النماذج النماذج، بحيث في كل مرة تحصل عليها <tr> يمكنك استدعاء هذه الطريقة مباشرة. Woohoo، كم هو مريحة!

لسوء الحظ، فإن القدرة على تغيير النماذج النماذج الأولية لعقد دوم هي شيء لا يوجد فيه Ecmascript أو DOM معيار بالفعل. يحدث ذلك للعمل في فايرفوكس لأن موزيلا لطيفة من هذا القبيل، لكن لا يمكنك أن تتوقع أن تعمل في جميع المتصفحات؛ بالتأكيد لن تعمل في IE.

لذلك بالنسبة للمتصفحات الأخرى، عليك أن تخبر النموذج الأولي لإضافة ("زيادة") أساليبها الخاصة على كل كائن واحد تريد التعامل معه مع:

Element.extend(this);

الآن يمكنك الاتصال this.toggleClassName بأمان على جميع المتصفحات.

بمجرد زيادة ذلك بشكل خاص <tr>, في كل مرة تقوم فيها بالوصول إليها في المستقبل، ستظل تؤدي إلى زيادة، حتى لا تزال تتصل toggleClassName عليه. ما هو أكثر من ذلك، إذا حدث ذلك للوصول إلى عنصر من خلال طرق النموذج الأولي - مثل $('mytrid')- سوف يزيد ذلك تلقائيا لك.

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

هذه كارثة تصحيح الأخطاء، وهذا هو السبب في أنني لا أستخدم النموذج الأولي.

(الأسبوع المقبل، للحصول على متعة Flamebait إضافية، لماذا لا أستخدم JQUERY أيضا.)

نصائح أخرى

حاول استخدام هذا بدلا من ذلك:

$(this).toggleClassName('selected')

سبب مفصل لماذا هنا: http://prototypejs.org/learn/extensions/

"هذه الكلمة الأساسية" هي جافا سكريبت أساسية وفي مثالك سيعود عقدة TR DOM. أظن أن prototypejs هو إرفاق الأساليب إلى عقد DOM، وسبب ما لم يتم ذلك / العمل مقابل IE والأوبرا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top