2011-04-25 60 views
0

我有兩個框架。兩個幀中的頁面來自同一個域(本地主機或活動域 - 均使用相同的協議)。無法訪問Chrome中另一個框架的內容

第一幀需要訪問第二幀(xsample)的元素,當它完全加載和任何onload JS函數完成時。但第二幀需要一段時間才能加載。

<frameset cols="*,*" rows="*" border="0" framespacing="0"> 
    <frame src="picker.asp" name="xpicker" frameborder="no" marginwidth="15" marginheight="15"> 
    <frame src="doc.asp" name="xsample" frameborder="no" marginwidth="15" marginheight="15"> 
</frameset> 

下面的代碼在IE和Firefox,但不是在Chrome或Safari,在那些parent.xsample總是假

function startWork(){ 
if(isSurveyLoaded()==false){ 
    SL=setTimeout("startWork()",1000); 
    return; 
} 
else{ 
    setTimeout("doMoreWork()",2000); 
} 
} 

function isSurveyLoaded(){ 
    if(!parent.xsample){ 
     return false; 
    } 
    if(!parent.xsample.self.name){ 
     return false; 
    } 
    if(parent.xsample.document.readyState!='complete'){ 
     return false; 
    } 
    else{ 
     return true; 
    } 
} 
+4

+1 Google Chrome hating frames :) – 2011-04-25 10:09:15

+4

什麼自我尊重的web開發者仍然使用框架集呢? – Halcyon 2011-04-25 10:12:09

回答

1

使用parent.frames["xsample"]訪問框架。

global對象上的已命名元素的隱式引用未標準化。

在不同的筆記上,千萬不要做setTimeout("doMoreWork(), 1000)",因爲這會強制VM使用eval來執行代碼。
使用setTimeout(doMoreWork, 1000)這是正確方式來做到這一點。

+0

如果(!parent.frames [「xsample」])仍然無法通過 – derekcohen 2011-04-25 15:46:36

+0

只需使用id的 - parent.document.getElementById - 至少你知道你有正確的元素。 – 2011-04-25 17:18:38

0

我解決它由:
1.給予目標幀兩者的名稱和ID
2.將兩個
3.測試的測試目標幀內的變量(finishedLoading)設定爲真
(測試finishedLoading時的===代替==代碼改變使用)

function isSurveyLoaded(){ 
    if(!(parent.frames["xsample"] || parent.document.getElementById('xsample'))){ 
    return false; 
    } 
    else{ 
    if(parent.frames["xsample"]){ 
     target=parent.frames["xsample"]; 
    } 
    else{ 
     target=parent.document.getElementById('xsample'); 
    } 
    } 
    if ((target.finishedLoading==='undefined') || (target.finishedLoading===false)){ 
    return false; 
    } 
    else{ 
    return true; 
    } 
} 

現在通過使用

<frame src="doc.asp" onload="frameisloaded(this)" name="xsample" id="xsample" frameborder="no" marginwidth="15" marginheight="15"> 
簡化0
+0

但丟幀 – gd1 2011-04-28 20:54:10

0

在Chrome中,訪問window.frames [index]會爲您提供一個Window對象,您可以從中訪問諸如該框架內容中的文檔之類的好東西。

通過document.getElementById訪問它只返回iframe元素本身,幾乎沒有用於進一步挖掘DOM的有用屬性。

這個bug無法通過名稱使用window.frames [name]來訪問Window對象,其他瀏覽器的做法應該被修復!

0

爲了解決反框架評論:批評那些使用框架的人並沒有回答這個問題。其次,有些框架比其他選擇更好。

所以這個問題不應該是「什麼自我尊重的Web開發人員使用框架集?」它應該是:「什麼自尊的全功能瀏覽器不能正確支持它們?」其中一個答案顯然是Chrome。

他們在解釋器中的各種功能周圍灑了「安全標誌」,包括那些便於在不同框架中的頁面之間傳輸某些信息的功能。因此像這樣的事情在本地運行不起作用:

top.frames [2] .document.getElementById(ID)

然而,當在服務器上運行它通常會正常工作。

如果您需要它在Chrome本地工作,則需要使用某種解決方法。你必須有創意。在某些情況下,比如當你知道情況變量時,你可以創建一個數組來處理各種可能性(當不需要那麼複雜時,這是一種拖動)。

+0

我對上述解決方法是: parent.frames [「F01」]文件 其中[「F01」]是在父框架,而不是其在層次結構中的號碼的幀的名稱。 – IconMatrix 2017-04-06 23:00:35