0

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

jQuery 事件监听器在 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');
4

1 回答 1

2

jQuery 绑定事件很复杂,基本上它将它与addEventListener(或类似的)绑定,并将附加信息附加到元素的数据容器。所以以后不能通过纯js​​使用。触发器以类似的方式工作 - 它不会触发由 dojo 绑定的事件。Dojo 也做了一些技巧。总而言之,两个框架都使用 dom 级别 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);
};

您修改后的演示

于 2013-04-19T12:39:13.017 回答