>웹 프론트엔드 >JS 튜토리얼 >pseudo-protocol_javascript 기술을 통해 상위 페이지와 iframe 페이지 간의 통신 문제를 해결합니다.

pseudo-protocol_javascript 기술을 통해 상위 페이지와 iframe 페이지 간의 통신 문제를 해결합니다.

WBOY
WBOY원래의
2016-05-16 16:05:461271검색

과 같은 상위 페이지 및 iframe 페이지에서 작업을 수행하는 경우가 많습니다.

939370b3c8787d52ac84eef51d6f9a93065276f04003e4622c4fe6b64f465b88

이 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.src="javascript:void((function(){var d=document;d.open();d.domain='xxx;d.write('---something');d.close()} )())";

이런 방식으로 iframe의 document.domain을 상위 페이지와 일치하도록 명시적으로 설정할 수 있습니다.

이 글을 작성하고 나면 iframe 콘텐츠를 동적으로 작성해야 한다는 필요성이 실제로 실현되지만 이 페이지는 window.open()처럼 별도로 팝업됩니다.
왜 이런가요? 이는 IE 시리즈의 버그이기도 합니다. 즉, 상위 페이지에 5d43740c2c81c12a30358e8bd80a5b616f6cb83b34cb7f2d6a4aed109317b73a가 있고 iframe의 의사 프로토콜을 통해 작성된 콘텐츠가 새 팝업으로 표시됩니다. window.open과 같은 페이지,
그러나 상위 페이지의 dde6fb694e6711ae5e6f381704c04ae4는 _self여야 하므로 iframe.src를 호출하기 전에는 base의 대상을 _self로 설정할 수 있습니다.

이렇게 하면 문제가 해결됩니다.

의사 프로토콜로 이 문제를 해결할 수 있지만, 꼭 필요한 경우가 아니면 이 방법을 함부로 사용하지 마세요.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.