为什么dojo.connect不会在jQuery触发后被触发? [英] Why dojo.connect doesn't get fired after jQuery trigger?

查看:133
本文介绍了为什么dojo.connect不会在jQuery触发后被触发?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



jQuery eventlistener在jQuery触发器之后被触发。 Dojo事件侦听器不会被触发。为什么会发生这种情况?



我从目前的问题创建了一个最小的环境: http://jsfiddle.net/vEkt6/



HTML:

 < input type =textvalue =0name =aid =a/> 

JS:

 code> 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');


解决方案

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(fireEventin el){
el.fireEvent(onchange);
} else {
var evt = document.createEvent(HTMLEvents);
evt.initEvent(change,false,true);
el.dispatchEvent(evt);
};

您修改过的演示


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');

解决方案

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

这篇关于为什么dojo.connect不会在jQuery触发后被触发?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆