لماذا لا يتم إطلاق مربع الاختيار عند تغيير مربع الاختيار بشكل غير مباشر

StackOverflow https://stackoverflow.com/questions/2161213

سؤال

أنا أستخدم النموذج الأولي لمراقبة مربعات الاختيار ، حتى أتمكن من إضافة اختبارات JavaScript إليهم. عندما يتم النقر فوق TR أو TD الذي يوجد فيه مربع الاختيار ، يجب التحقق من مربع الاختيار.
عند النقر مباشرة على مربع الاختيار ، يتم إطلاق حدث OnChange ، لذلك ستحصل على تنبيه. عندما يتم تغيير قيمة مربع الاختيار بواسطة JavaScript (عند النقر فوق TR أو TD) ، لا يتم إطلاق onchange. لماذا لا يتم إطلاق onchange عندما يتم تغيير خانة الاختيار بشكل غير مباشر؟

هذا هو JavaScript الذي أستخدمه.

Element.observe(window, 'load', function() {
        /* If a tr or td is clicked, change the value of the checkbox. */
        $$('#results tr').each(function(el) { 
            el.observe('click', function(e) {
                if(!e.target) { e.target = e.srcElement; }
                if(e.target.nodeName == 'TD' || e.target.nodeName == 'TR') {
                    $('compare-product'+this.id).checked = ($('compare-product'+this.id).checked === false) ? true : false;
                }
            });
        });
        /* Monitor if the status of a checkbox has changed. */
        $$('#results tr td input').each(function(el) {
                el.observe('change', function(e) {
                        alert('!');
                    }
                );
            }
        );
    }
);

لقد اختبرته في Firefox و IE7 ، كلاهما لا يعمل. أنا لا أبحث عن حل بديل ، فأنا أشعر بالفضول لمعرفة سبب عدم عمل هذا.

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

المحلول

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

نصائح أخرى

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

ما قاله جيمسدلين لا معنى له.

Jamesdlin:

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

هذا صحيح بغض النظر عما إذا كنت تقوم بتعيينه بشكل برمجي تغيير قيمة أو ما إذا كنت تنقر على عنصر التحكم. في كلتا الحالتين ، قد يكون لديك عناصر تحكم أخرى.

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