2010-09-09 42 views
1

我是通過使用jquery構建一個非常複雜的應用程序的中途。Jquery Iframe繼承

簡言之,模塊被加載到iframe中(以保持沙箱和允許變化的東西)。

我在引用iframe中的jquery對象/庫(從它的父級)時遇到了一些問題。

我可以編寫包含在父項中的函數,並使用父項調用它們。$()。mymodule({...});模塊必須掃描iframe的文檔,然後檢索它的內容,然後查找應用該方法的元素(位長囉嗦,但它的工作原理!!)。

這天早上我決定一定有更好的方式來做到這一點,這就是將模塊的功能直接添加到Iframe,所以他們有一些上下文,麻煩的是,我不能從iframe中的父級引用jquery對象..我假設父母。$( 「」).show(「#some-element-in-the-if​​rame」)將有足夠的上下文來選擇Iframe中的元素,但它似乎試圖在父文檔中找到該元素。

我想知道的是:

有沒有一種方法,我可以使用加載到父的jQuery和它的方法或我將jQuery的一個單獨的實例加載到iframe中 - 如果我必須加載這個新的jquery實例,它會從客戶端緩存中加載,還是需要再次從服務器下載庫。

看來它應該是可能的,但「父母」似乎將選擇器的上下文切換回父文檔。我試圖將上下文參數添加到父$。(「#some-element」,「#iframe-id」),但這也不起作用。

回答

0

將jquery包含在iframed頁面中。只要他們使用相同的網址,那麼它將使用瀏覽器緩存版本。

0

您使用$('#some_iframe').contents()得到一個iframe的document對象上的包裝:

$('#some_iframe').contents().find('#some_element').show(); 

但這是有限的。對於show()這個簡單的例子,你可以避開它,但通常jQuery的單個實例並不是爲跨文檔腳本設計的;一些操作(尤其是內容創建)可能會失敗。如果您想要使用所有jQuery的功能,您通常需要將jQuery的副本加載到每個單獨的文檔中。

獲取子文檔的window對象(用於全局函數的容器,$等)很容易:parent。獲取子文檔的window對象並不那麼容易。理論上,它應該可以通過frames.some_iframe來實現,但在歷史上 - 並且在Firefox中,這是仍然是的情況 - 對id="some_iframe"不起作用,但僅適用於已棄用的name屬性。

可以改爲從iframe自身的DOM對象到窗口,但是如何做到這一點並不是瀏覽器的標準,jQuery也不能幫助您。

var iframe= document.getElementById('some_iframe'); // or $('#some_iframe')[0] 
var iwindow= 'contentWindow' in iframe? iframe.contentWindow : iframe.contentDocument.defaultView; 
iwindow.$('#some_element').show(); 

contentWindow是一個IE擴展不到處支持。contentDocument是標準,但在IE瀏覽器不支持。)

如果我要加載的jQuery的新實例將它從客戶端緩存

是加載。

+0

感謝鮑勃,不是我真正想要的。我更多地尋找一種方法來將jquery對象全部複製到iframe窗口中...我嘗試了var $ = window.parent.jQuery,但無濟於事......我想我只需要再次包含庫......看着源頭,它有各種各樣的東西來檢測上下文,以覆蓋任何已經完成的任何事情。 – Alex 2010-09-09 09:47:40