Javascript 触发由不同实例设置的jQuery自定义事件
有没有办法触发由不同jQuery实例设置的自定义事件?例如: // Load version 1.9.1 ... jQuery191(document).on('customEvent', function () {console.log('Callback fired.')}); // Load version 1.6.2 and setup noConflict ... jQuery162(document).trigger('customEvent'); //加载版本1.9.1 ... jQuery191(document.on('customEvent',函数(){console.log('Callback fired')}); //加载版本1.6.2并设置noConflict ... jQuery162(document.trigger('customEvent');Javascript 触发由不同实例设置的jQuery自定义事件,javascript,jquery,Javascript,Jquery,有没有办法触发由不同jQuery实例设置的自定义事件?例如: // Load version 1.9.1 ... jQuery191(document).on('customEvent', function () {console.log('Callback fired.')}); // Load version 1.6.2 and setup noConflict ... jQuery162(document).trigger('customEvent'); //加载版本1.9.1 ...
虽然不需要加载多个版本的库,但一个简单的用例是一个插件,如果当前实例低于预期,它可以引入特定版本的jQuery。有什么建议吗?如果一个页面上有不同的实例(即使是相同的版本),您应该特别小心,因为这可能会导致意外行为,并可能导致内存泄漏,例如,如果您删除了一个带有数据(
.data(…)
或事件侦听器)的jQuery191
元素与jQuery162一起存储的,在重新加载页面之前,它将保留在内存中,反之亦然
回到你的问题上来。
我不推荐它,但您可以将事件加倍(使用两个版本触发它)。
这种方法的问题是它会减慢一切。
另一个问题是有两个冒泡阶段。因此,如果在jQuery191
中阻止事件,它仍将在jQuery162
中执行,反之亦然
所以这可能是一个对你有效的解决方案,但也可能让事情变得更糟。
因此,您需要检查自己是否可以使用此解决方案。
也许你也可以移除其中一个加倍部分
(function() {
//keep the original functions
var trigger191 = jQuery191.fn.trigger;
var trigger162 = jQuery162.fn.trigger;
jQuery191.fn.trigger = function( evt ) {
trigger191.apply(this,arguments); //call orginal function
//only double certain events
if( evt == "my-custom-event" ) {
var resultset162 = jQuery162(jQuery191.makeArray( this ));//create a ne result set of the 162 version
trigger162.apply(resultset162,arguments); //call the original function of 162 to avoid an endless loop
}
};
jQuery162.fn.trigger = function(evt) {
trigger162.apply(this,arguments); //call orginal function
//only double certain events
if( evt == "my-custom-event" ) {
var resultset191 = jQuery191(trigger162.makeArray( this ));
trigger191.apply(resultset191,arguments); //call the ofiginal function of 191 to avoid an endless loop
}
};
})();
(我希望代码是这样工作的。我非常确定它应该工作,但我现在不能测试它)如果页面上有不同的实例(即使是相同的版本),您应该非常小心,因为这可能会导致意外行为,并可能导致内存泄漏,例如,如果使用jQuery191
删除一个元素,该元素的数据(.data(…)
或事件侦听器)存储在jQuery162
中,则该元素将保留在内存中,直到您重新加载页面,反之亦然
回到你的问题上来。
我不推荐它,但您可以将事件加倍(使用两个版本触发它)。
这种方法的问题是它会减慢一切。
另一个问题是有两个冒泡阶段。因此,如果在jQuery191
中阻止事件,它仍将在jQuery162
中执行,反之亦然
所以这可能是一个对你有效的解决方案,但也可能让事情变得更糟。
因此,您需要检查自己是否可以使用此解决方案。
也许你也可以移除其中一个加倍部分
(function() {
//keep the original functions
var trigger191 = jQuery191.fn.trigger;
var trigger162 = jQuery162.fn.trigger;
jQuery191.fn.trigger = function( evt ) {
trigger191.apply(this,arguments); //call orginal function
//only double certain events
if( evt == "my-custom-event" ) {
var resultset162 = jQuery162(jQuery191.makeArray( this ));//create a ne result set of the 162 version
trigger162.apply(resultset162,arguments); //call the original function of 162 to avoid an endless loop
}
};
jQuery162.fn.trigger = function(evt) {
trigger162.apply(this,arguments); //call orginal function
//only double certain events
if( evt == "my-custom-event" ) {
var resultset191 = jQuery191(trigger162.makeArray( this ));
trigger191.apply(resultset191,arguments); //call the ofiginal function of 191 to avoid an endless loop
}
};
})();
(我希望代码是这样工作的。我很确定它应该能工作,但我现在不能测试它)你试过了吗?我不明白为什么它不起作用,尽管正如您所说,使用两个不同版本的jQuery并不理想。@Rorymcrossan自定义事件不是真实的事件,而是通过使用jQuery存储的内部数据来处理的。因为每个jQuery实例都有自己的jQuery.expando
用于内部数据。事件处理程序在不同实例之间完全隔离,即使它们的版本相同。@t.niese Good point。考虑我的学校。@ T.NIESE有另一种方式,我可以创建自定义事件,听/触发它们吗?我有一个解决方案(使用Event和CustomEvent)适用于webkit和firefox,但不适用于可怕的IE。@stavarotti我正在研究一个答案(但这不是我推荐的,但如果你想使用它,由你决定),你试过了吗?我不明白为什么它不起作用,尽管正如您所说,使用两个不同版本的jQuery并不理想。@Rorymcrossan自定义事件不是真实的事件,而是通过使用jQuery存储的内部数据来处理的。因为每个jQuery实例都有自己的jQuery.expando
用于内部数据。事件处理程序在不同实例之间完全隔离,即使它们的版本相同。@t.niese Good point。考虑我的学校。@ T.NIESE有另一种方式,我可以创建自定义事件,听/触发它们吗?我有一个解决方案(使用Event和CustomEvent)适用于webkit和firefox,但不是可怕的IE。@stavarotti我正在研究一个答案(但这不是我推荐的,但如果你想使用它,由你决定),这似乎符合我最初的思路。我需要做一些测试来计算性能损失。这似乎符合我最初的思路。我需要做一些测试来计算性能损失。