2013-11-01 68 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