第二「上下文」參數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, ...)
收集來自兩個框架非常有幫助的,這是相當棘手沒有一些上下文管理。
爲什麼不是iframe加載jQuery本身並使用自己的jQuery對象? – Matchu
它當然可以。但是,您需要在兩個窗口中創建雙向管道來回呼叫。比僅僅對現有HTML + JS內容進行子框架更加困難。另外,$ .data對於每個jQuery實例都是不同的,這可能不是所希望的。 –
嗯。那麼內部框架是使用外部框架的jQuery,還是使用內部框架jQuery的外部框架?如果是這樣,爲什麼?一個顯式的交互API在這裏似乎更合適,因爲它不那麼脆弱(不假設其他頁面具有jQuery或者它的DOM正是我們所期望的),對於其他開發人員來說更易讀,並且完全避免了這些問題。 (當然,這與我有限的信息...) – Matchu