2013-11-01 63 views
1

是否有任何方式触发由不同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'); 

虽然它不是recommended加载库的多个版本,一个简单的用例是,在jQuery的特定版本的拉动,如果目前的情况是低于预期的插件。有什么建议么?

+0

你试过了吗?我不明白为什么它不起作用,但正如你所说,使用两个不同版本的jQuery并不理想。 –

+1

@RoryMcCrossan自定义事件不是真实事件,并且使用jQuery存储的内部数据进行处理。因为每个jQuery实例都有自己的用于内部数据的'jQuery.expando'。事件处理程序在不同的实例之间完全隔离,即使它们具有相同的版本。 –

+0

@ t.niese好点。考虑我接受教育。 –

回答

1

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

})(); 

(我希望代码工作的方式。我敢肯定它应该工作,但现在我不能测试它)

+0

这似乎符合我原来的思路。我需要做一些测试来确定性能处罚。 – stavarotti