سؤال

كنت أتساءل عن كيفية إطلاق حدث تغيير برمجيًا باستخدام YUI3 - لقد أضفت مستمع تغيير إلى عقدة مربع تحديد واحدة:

Y.get('#mynode').on('change', function(e) {
 Alert(“changed me”);
});

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

// All below give this error: T[X] is not a function (referring to what's called in .invoke(), // in the minified javascript
Y.get('#mynode').invoke('onchange');
Y.get('#mynode').invoke('change');
Y.get('#mynode').invoke('on','change');
Y.get('#mynode').invoke("on('change')");


/* Tried using .fire() which I found here: 
* http://developer.yahoo.com/yui/3/api/EventTarget.html#method_fire
* Nothing happens
*/

Y.get('#mynode').fire('change'); 

/* Looking around the APIs some more, I found node-event-simulate.js: 
 * http://developer.yahoo.com/yui/3/api/node-event-simulate.js.html, 
 * which by its name would seem to have what I want. I tried:
 * Error: simulate(): Event 'change' can't be simulated. 
 * ( (function(){var I={},B=new Date().getTim...if(B.isObject(G)){if(B.isArray(G)){E=1;\n)
 */

Y.get('#mynode').simulate('change');

سيكون موضع تقدير أي مساعدة!

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

المحلول

YUI 3.0 لا يدعم محاكاة change الأحداث، كما اكتشفت.ومع ذلك سيتم دعمه في YUI 3.1.إنها في الشاحنة الآن.

محاولتك الثالثة:

Y.get('#mynode').simulate('change');

يجب أن تعمل في 3.1.

يحرر

يبدو أنه يمكنك فقط استبدال إصدار YUI 3.0 event-simulate.js مع إصدار صندوق السيارة، وسيعمل في تطبيق 3.0.لم أرى أي مشاكل حتى الآن.

نصائح أخرى

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

Y.get('#mynode').on('change', function(e) {
    AlertUserOfChange();
});

function AlertUserOfChange()
{
    Alert(“changed me”);
}

وماذا عن هذا

Y.Event.simulate('#mynode', 'change');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top