为什么在jQuery触发器后dojo.connect不会被触发?

时间:2013-04-19 12:11:06

标签: jquery dojo

我有两个系统,其中一个是使用Dojo,另一个是jQuery。我必须在它们之间建立一些联系,但我遇到了一个问题。

jQuery eventlistener在jQuery触发器之后被触发。 Dojo事件监听器不会被触发。为什么会这样?

我从当前的问题创建了一个最小的环境: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 个答案:

答案 0 :(得分:2)

jQuery绑定事件很复杂,基本上它与addEventListener(或类似的)绑定它,并将附加信息附加到元素的数据容器。因此以后不能通过纯js​​使用它。触发器以类似的方式工作 - 它不会触发由dojo绑定的事件。 Dojo也做了一些技巧。总而言之,两个框架都使用dom level 2来附加事件,所以你不能只调用el.onchange(),它将为null。然而,众所周知的一些纯代码可以解决这个问题:

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