이 iframe 내부의 콘텐츠는 js로 작성되었습니다. 다음 코드와 같습니다
var iframe = document.getElementById("iframe"), doc = iframe.contentWindow.document; doc.open(); doc.write("---------something------"); doc.close();
위 코드는 대부분의 경우 정확합니다. 그런데 상위 페이지에 document.domain = "xxx";
라고 명시적으로 쓰는 상황이 있습니다.IE 시리즈(IE10에서는 시도해보지 않았습니다)에서는 권한이 없다는 오류가 발생합니다. 파이어폭스, 크롬에서는 문제 없습니다.
이것은 IE의 버그입니다. 즉, 상위 페이지가 document.domain을 명시적으로 설정하지 않으면 iframe은 기본적으로 상위 페이지와 동일하게 document.domain을 설정합니다.
입니다location.host, 상위 및 하위 페이지는 통신할 수 있습니다. 즉, 기사 헤더의 예이지만 상위 페이지가 명시적으로 document.domain=""을 설정한 경우 iframe의 페이지도 명시적으로 document.domain을 설정해야 합니다. = "xxx", 그렇지 않으면
iframe.contentWindow.document를 가져올 수 있는 권한이 없으면 콘텐츠를 동적으로 작성할 수 없습니다. 실제로 이 페이지는 document.domain="을 명시적으로 설정합니다. xxx", 그리고 기사를 통해 시작 광장
그런데 문제는 저의 상위 페이지에 이런 iframe이 많이 있고, 그 개수를 알 수 없어서(모두 광고 공간) 특정 페이지를 통과할 수 없다는 점입니다.
이 경우 문제가 발생합니다.
1. 상위 페이지가 설정되어 있으며 document.domain을 명시적으로 설정해야 합니다
2. iframe 페이지의 콘텐츠는 js에 의해 동적으로 생성되어야 합니다.
3. iframe에 대한 src를 설정할 기회가 없습니다.
그러나 위의 세 가지 조건이 충족되면 의사 프로토콜을 통해 이런 문제를 해결할 수 있습니다.
이런 방식으로 iframe의 document.domain을 상위 페이지와 일치하도록 명시적으로 설정할 수 있습니다.
이 글을 작성하고 나면 iframe 콘텐츠를 동적으로 작성해야 한다는 필요성이 실제로 실현되지만 이 페이지는 window.open()처럼 별도로 팝업됩니다.
왜 이런가요? 이는 IE 시리즈의 버그이기도 합니다. 즉, 상위 페이지에
그러나 상위 페이지의
이렇게 하면 문제가 해결됩니다.
의사 프로토콜로 이 문제를 해결할 수 있지만, 꼭 필요한 경우가 아니면 이 방법을 함부로 사용하지 마세요.