2011-04-25 2 views
0

두 개의 프레임이 있습니다. 두 프레임의 페이지는 동일한 도메인 (로컬 호스트 또는 라이브 도메인 - 둘 다 동일한 프로토콜을 사용함)에서 가져옵니다.크롬에서 다른 프레임의 콘텐츠에 액세스 할 수 없습니다.

첫 번째 프레임은 완전히로드되고 모든 onload JS 함수가 완료되면 두 번째 프레임 (xsample)의 요소에 액세스해야합니다. 그러나 두 번째 프레임에는로드하는 데 시간이 걸립니다.

<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> 

아래 코드는 그 parent.xsample에서, 크롬이나 사파리에서 IE와 파이어 폭스에서 작동하지만 프레임에 액세스 할 수 항상 사용 parent.frames["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 싫어 프레임 : :) –

+4

자기 존경하는 웹 개발자가 여전히 프레임 세트를 사용하고 있습니까? – Halcyon

답변

1

false입니다.

global 개체의 명명 된 요소에 대한 암시 적 참조는 표준화되지 않았습니다.

다른 메모에서 setTimeout("doMoreWork(), 1000)"을 절대 사용하지 마십시오. VM이 eval을 사용하여 코드를 실행하도록합니다.
올바른 방법 인 setTimeout(doMoreWork, 1000)을 사용하십시오.
1. 대상 프레임의 이름 및 ID 대상 프레임 내 변수 (finishedLoading)가
true로 설정되었는지 모두
3. 테스트
2. 시험 모두주기 :

+0

이것도 여전히 성공하지 못합니다. if (! parent.frames [ "xsample"]) – derekcohen

+0

id의 then -'parent.document.getElementById'를 사용하십시오. 적어도 당신은 올바른 요소를 알고 있습니다. –

0

난하여 해결 (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

0

Chrome에서 window.frames [index]에 액세스하면 해당 프레임의 콘텐츠 내에있는 문서와 같은 좋은 정보에 액세스 할 수있는 Window 개체가 생성됩니다.

document.getElementById를 통해 액세스하면 iframe 요소 자체 만 반환되며 DOM에 추가로 파고 들어갈 유용한 특성은 거의 없습니다.

window.frames [name]을 사용하여 이름으로 Window 객체에 액세스 할 수없는이 버그는 다른 브라우저에서 수정해야합니다.

0

반 프레임 셋 주석 처리 방법 : 프레임을 사용하는 사람들을 비판하는 것은 질문에 답하지 않습니다. 두 번째로 프레임이 다른 대안보다 더 나은 점이 있습니다.

그래서 "자존심있는 웹 개발자는 프레임 셋을 사용합니까?"라는 질문을해서는 안됩니다. 그것은해야한다 : "자존심있는 완전한 기능을 갖춘 브라우저가 제대로 지원하지 않는 브라우저는 무엇입니까?" 대답 중 하나는 분명히 Chrome입니다.

그들은 서로 다른 프레임의 페이지간에 특정 정보를 쉽게 전달할 수있는 기능을 포함하여 인터프리터의 다양한 기능에 "보안 플래그"를 뿌렸다. 로컬로 실행하면 결과적으로이 같은 일들이 작동하지 않습니다

top.frames [2] .document.getElementById (ID) 서버에서 실행할 때

그러나 그것은 일반적으로 잘 작동합니다.

Chrome에서 로컬로 작업해야하는 경우 몇 가지 해결 방법을 사용해야합니다. 당신은 창조적이어야합니다. 어떤 경우에는 상황 변수를 알고있는 것처럼 배열을 만들어 다양한 가능성을 처리 할 수 ​​있습니다 (그렇지 않으면 복잡하지 않아도되는 드래그).

+0

내 해결했습니다 프레임 : parent.frames [ "F01"] [ "F01"은] 오히려 계층 구조에서의 수보다 부모 프레임에서 프레임의 이름입니다 문서 .. – IconMatrix

관련 문제