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

Trigger a jQuery custom event set by different instance

本文关键字:jQuery 自定义 事件 设置 实例      更新时间:2023-09-26

有没有办法触发由不同的jQuery实例设置的自定义事件? 例如:

加载版本 1.9.1...jQuery191(document).on('customEvent', function () {console.log('Callback fired.')});加载版本 1.6.2 并设置无冲突...jQuery162(document).trigger('customEvent');

虽然不建议加载多个版本的库,但一个简单的用例是一个插件,如果当前实例低于预期,它会拉入特定版本的 jQuery。 有什么建议吗?

如果页面上有不同的实例(即使版本相同),您应该非常小心,因为这可能会导致意外行为并可能导致内存泄漏,例如,如果您删除具有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
        }
    };
})();

(我希望代码以这种方式工作。我很确定它应该可以工作,但我现在无法测试它)