Javascript 触发由不同实例设置的jQuery自定义事件

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实例设置的自定义事件?例如:

// 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');
虽然不需要加载多个版本的库,但一个简单的用例是一个插件,如果当前实例低于预期,它可以引入特定版本的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我正在研究一个答案(但这不是我推荐的,但如果你想使用它,由你决定),这似乎符合我最初的思路。我需要做一些测试来计算性能损失。这似乎符合我最初的思路。我需要做一些测试来计算性能损失。