问题
I have two system, one of them is using Dojo and the other one jQuery. I have to make some connection between them, but I'm experiencing a problem.
jQuery eventlistener get fired after the jQuery trigger. Dojo event listener doesn't get fired. Why is that happen?
I have created a minimal environment from my current problem: http://jsfiddle.net/vEkt6/
HTML:
<input type="text" value="0" name="a" id="a" />
JS:
var el = dojo.byId('a');
dojo.connect(el, 'change', function(){
console.log('dojo');
});
jQuery(el).on('change', function(){
console.log('jquery');
});
jQuery(el).val(1).trigger('change');
回答1:
The jQuery bind events is complicated, basically it bind it with addEventListener
(or similiar) and attaches additional info to data container of element. So it can't be used via pure js later. trigger works in similiar way - it will not trigger event binded by dojo. Dojo also do some tricks. To summarize, both frameworks uses dom level 2 to attach events, so you can't just call el.onchange(), it will be null. However, there is widely known piece of pure code which will do the trick:
var el = dojo.byId('a');
dojo.connect(el, 'change', function(){
console.log('dojo');
});
jQuery(el).on('change', function(){
console.log('jquery');
});
jQuery(el).val(1);
if ("fireEvent" in el) {
el.fireEvent("onchange");
} else {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
el.dispatchEvent(evt);
};
Your modified demo
来源:https://stackoverflow.com/questions/16104337/why-dojo-connect-doesnt-get-fired-after-jquery-trigger