2012-12-20 47 views
4

背景:我可以爲jQuery提供默認的「上下文」嗎?

第二「上下文」參數jQuery選擇呼叫(例如:jQuery(selector, context))可以被提供給選擇器引擎從該下降的起點。

,如果你需要控制在IFRAME內容(在同一域中)這是通常很有用。您只需傳遞iframe.contentWindow.document作爲「上下文」參數。

如果任何JavaScript代碼被加載在其利用的jQuery的IFRAME,並且是CALLED從外WINDOW的範圍,然後在該代碼中的任何參考$jQuery實際上將的jQuery從實例外窗。

當IFRAME中的JavaScript代碼(比如Bootstrap.js)做了類似$(document)(或者沒有「上下文」參數的其他選擇器)時,問題就出現了。當從外部窗口調用該代碼(在iframe中定義)時,document引用外窗口中的HTMLDocument元素 - 通常不是所需的結果。

問:

這將是能夠創造的jQuery的詞法範圍的複製/包裝,有一個默認的「上下文」的說法,由誰創建它提供超級有用。

例子:

// jQuery already exists out here 
var iframe = document.createElement('IFRAME'); 
iframe.addEventListener('DOMContentLoaded', function(){ 

    // code in here can already refer to $ for 'outer' jQuery 

    // code in here can refer to $local for 'inner' jQuery by virtue of... 
    var $local = jQueryWithContext($, iframe.contentWindow.document); 

    // code loaded with IFRAME will use $local by virtue of ... 
    iframe.contentWindow.jQuery = iframe.contentWindow.$ = $local; 

}); 
iframe.src = '/path/to/iframe/content.html'; 

的問題是,是否有可能寫類似上面jQueryWithContext

爲什麼?

有時,您希望隔離從CSS/JavaScript污染角度出錯的第三方HTML組件(儘管您從安全角度信任它們)。

Bootstrap.js就是一個很好的例子。它調用$(document)一個公平的位,並做其他類似的無環境選擇器調用。如果jQuery可以按照我描述的方式進行重新定義,那麼這個「不是最優」的書寫庫可以很容易被隔離。

此外,它可以使用相同的$.data(el, ...)收集來自兩個框架非常有幫助的,這是相當棘手沒有一些上下文管理。

+0

爲什麼不是iframe加載jQuery本身並使用自己的jQuery對象? – Matchu

+0

它當然可以。但是,您需要在兩個窗口中創建雙向管道來回呼叫。比僅僅對現有HTML + JS內容進行子框架更加困難。另外,$ .data對於每個jQuery實例都是不同的,這可能不是所希望的。 –

+1

嗯。那麼內部框架是使用外部框架的jQuery,還是使用內部框架jQuery的外部框架?如果是這樣,爲什麼?一個顯式的交互API在這裏似乎更合適,因爲它不那麼脆弱(不假設其他頁面具有jQuery或者它的DOM正是我們所期望的),對於其他開發人員來說更易讀,並且完全避免了這些問題。 (當然,這與我有限的信息...) – Matchu

回答

6

其實,這將是很簡單的:

function jQueryWithContext(selector, context) { 
    // I added the possibility to overwrite the context here, but you could delete 
    return $(selector, context || iframe.contentWindow.document); 
} 
jQueryWithContext('#main').show(); 

但用它強制插件,你可能會需要這樣的:

jQuery.noConflict(); // keep the real jQuery for now 
$ = function(selector, context){ 
    return new jQuery.fn.init(selector, context || iframe.contentWindow.document); 
}; 
$.fn = $.prototype = jQuery.fn; 
jQuery.extend($, jQuery); // copy static method 
// Then override default jQuery 
jQuery = $; 

這有點兒工作,但它可能打破$()的一些用法(可能不是現在,但它可能在未來的jQuery版本中,或任何時候context參數的存在打破正常行爲)。

+2

jQuery有許多其他方法,您可以使用$ .something(而不是選擇器調用)進行調用。如果這些方法在沒有內容的情況下進行選擇器調用(內部),這可能是有限的方法。你認爲這可能是這樣嗎? –

+1

那麼,這就是爲什麼我將函數重命名爲'''以外的東西,所以實際的代碼不會中斷。但是你想強制這個默認的上下文是'$';所以插件會無縫地使用它? –

+0

是(適用於插件)。我想我真正的問題是,jQuery內部是否在非選擇器方法內進行選擇器調用?如果是這樣,那麼還需要修補。 –

相關問題