IFRAME로드가 완료되면 콜백을 실행해야합니다. IFRAME의 내용을 제어 할 수 없으므로 콜백을 실행할 수 없습니다.
이 IFRAME은 프로그래밍 방식으로 만들어지며 iframe을 파괴 할뿐만 아니라 콜백에서 변수로 데이터를 전달해야합니다.
어떤 아이디어?
편집하다:
여기 내가 지금 가진 것입니다 :
function xssRequest(url, callback)
{
var iFrameObj = document.createElement('IFRAME');
iFrameObj.src = url;
document.body.appendChild(iFrameObj);
$(iFrameObj).load(function()
{
document.body.removeChild(iFrameObj);
callback(iFrameObj.innerHTML);
});
}
iFrame이로드되기 전에 콜백되므로 콜백에 데이터가 반환되지 않습니다.
답변
먼저 xssRequest 함수 이름으로 크로스 사이트 요청을 시도하는 것처럼 들립니다. 맞으면 iframe의 내용을 읽을 수 없습니다.
반면에 iframe의 URL이 도메인에 있으면 본문에 액세스 할 수 있지만 시간 초과를 사용하여 iframe을 제거하면 콜백이 정상적으로 작동한다는 것을 알았습니다.
// possibly excessive use of jQuery - but I've got a live working example in production
$('#myUniqueID').load(function () {
if (typeof callback == 'function') {
callback($('body', this.contentWindow.document).html());
}
setTimeout(function () {$('#frameId').remove();}, 50);
});
답변
jQuery를 사용하고 있으며 방금 테스트하고 무거운 페이지를로드 할 때 놀랍게도로드되는 것처럼 보이고 iframe로드를 볼 때까지 몇 초 동안 경고가 표시되지 않았습니다.
$('#the_iframe').load(function(){
alert('loaded!');
});
따라서 jQuery를 사용하지 않으려면 소스 코드를 살펴 보고이 함수가 iframe DOM 요소와 다르게 작동하는지 확인하십시오. 나중에 관심을 가지고 여기에 게시 할 때 직접 살펴 보겠습니다. 또한 최신 크롬에서만 테스트했습니다.
답변
iframe 태그가 상위 문서의 내용을 둘러싸 지 않기 때문에 iframe의 innerHTML이 비어 있습니다. iframe의 src 속성이 참조하는 페이지에서 컨텐츠를 가져 오려면 iframe의 contentDocument 속성에 액세스해야합니다. src가 다른 도메인에서 온 경우 예외가 발생합니다. 이는 다른 사람의 페이지에서 임의의 JavaScript를 실행하지 못하게하는 사이트 간 스크립팅 취약점을 발생시키는 보안 기능입니다. 다음은 내가 말하는 것을 보여주는 예제 코드입니다.
<script src="http://prototypejs.org/assets/2009/8/31/prototype.js" type="text/javascript"></script>
<h1>Parent</h1>
<script type="text/javascript">
function on_load(iframe) {
try {
// Displays the first 50 chars in the innerHTML of the
// body of the page that the iframe is showing.
// EDIT 2012-04-17: for wider support, fallback to contentWindow.document
var doc = iframe.contentDocument || iframe.contentWindow.document;
alert(doc.body.innerHTML.substring(0, 50));
} catch (e) {
// This can happen if the src of the iframe is
// on another domain
alert('exception: ' + e);
}
}
</script>
<iframe id="child" src="iframe_content.html" onload="on_load(this)"></iframe>
추가 예제를 보려면 이것을 iframe의 컨텐츠로 사용하십시오.
<h1>Child</h1>
<a href="http://www.google.com/">Google</a>
<p>Use the preceeding link to change the src of the iframe
to see what happens when the src domain is different from
that of the parent page</p>
답변
워드 문서 및 PDF와 같은 문서가 iframe으로 스트리밍되고 꽤 잘 작동하는 솔루션을 찾은 경우이 작업을 수행해야했습니다. 핵심은 onreadystatechanged
iframe 에서 이벤트를 처리하는 것 입니다.
프레임 이름이 “myIframe”이라고 가정하겠습니다. 먼저 코드 시작에서 어딘가에 (iframe 이후에 인라인으로 수행) 이벤트 핸들러를 등록하기 위해 다음과 같은 것을 추가하십시오.
document.getElementById('myIframe').onreadystatechange = MyIframeReadyStateChanged;
iframe에서 onreadystatechage 속성을 사용할 수 없었습니다. 이유를 기억할 수는 없지만 응용 프로그램은 IE 7 및 Safari 3에서 작동해야했기 때문에 그 요인이 될 수 있습니다.
다음은 완전한 상태를 얻는 방법의 예입니다.
function MyIframeReadyStateChanged()
{
if(document.getElementById('myIframe').readyState == 'complete')
{
// Do your complete stuff here.
}
}
답변
i 프레임 내용이 IE에 완전히로드 될 때 대기 스피너 div를 숨기고 싶었습니다. 나는 문자 그대로 Stackoverflow.Com에 언급 된 모든 솔루션을 시도했지만 원하는대로 작동하지 않았습니다.
그런 다음 i 프레임 컨텐츠가 완전히로드되면 $ (Window)로드 이벤트가 시작될 수 있다는 아이디어가있었습니다. 그리고 그것은 정확히 일어난 일입니다. 그래서 나는이 작은 스크립트를 작성하고 마술처럼 일했습니다.
$(window).load(function () {
//alert("Done window ready ");
var lblWait = document.getElementById("lblWait");
if (lblWait != null ) {
lblWait.style.visibility = "false";
document.getElementById("divWait").style.display = "none";
}
});
도움이 되었기를 바랍니다.
답변
나는 너와 비슷한 문제가 있었다. 내가 한 것은 jQuery라는 것을 사용한다는 것입니다. 그런 다음 자바 스크립트 코드에서 수행하는 작업은 다음과 같습니다.
$(function(){ //this is regular jQuery code. It waits for the dom to load fully the first time you open the page.
$("#myIframeId").load(function(){
callback($("#myIframeId").html());
$("#myIframeId").remove();
});
});
HTML을 가져 오기 전에 iFrame을 삭제 한 것처럼 보입니다. 자, 나는 그 문제에 대해 보았습니다 : p
도움이 되었기를 바랍니다 :).
답변
내 프로젝트에는 비슷한 코드가있어 정상적으로 작동합니다. 내 코드를 함수에 적용하면 해결책은 다음과 같습니다.
function xssRequest(url, callback)
{
var iFrameObj = document.createElement('IFRAME');
iFrameObj.id = 'myUniqueID';
document.body.appendChild(iFrameObj);
iFrameObj.src = url;
$(iFrameObj).load(function()
{
callback(window['myUniqueID'].document.body.innerHTML);
document.body.removeChild(iFrameObj);
});
}
어쩌면 내부 HTML이 비어 있거나 (하나 또는 두 가지 원인이 있음) 1. 본문 요소에 사용해야합니다.