주어진 HTML을 사용하여 동적으로 iframe 만들기
JavaScript에서 iframe을 만들고 다음과 같이 임의의 HTML로 채우려고 합니다.
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
는 ㅠㅠ을 합니다.iframe
유효한 창 및 문서를 포함합니다.그러나 이 경우는 그렇지 않습니다.
> console.log(iframe.contentWindow);
무효의
직접 사용해 보십시오: http://jsfiddle.net/TrevorBurnham/9k9Pe/
제가 간과하고 있는 것은 무엇입니까?
의 비록당신에도 .src = encodeURI
만약 효과가 있었다면, 저는 다른 길을 갔을 것입니다.
var iframe = document.createElement('iframe');
var html = '<body>Foo</body>';
document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();
에 x-도메인 제한을 됩니다.iframe
핸들, 당신은 나중에 프레임의 내용에 접근하고 조작할 수 있습니다..write 명령이 실행되는 동안 또는 실행된 후에 (브라우저 유형에 따라) 시작되는 내용이 렌더링되었는지 확인하기만 하면 됩니다. 그러나 반드시 실행되는 것은 아닙니다.close()
이 호출됩니다.
100% 호환되는 콜백 방법은 다음과 같습니다.
<html><body onload="parent.myCallbackFunc(this.window)"></body></html>
그러나 프레임에 onload 이벤트가 있는 경우.내부 html을 DOM(js)으로 액세스하는 방법은 다음과 같습니다.
iframe.onload = function() {
var div=iframe.contentWindow.document.getElementById('mydiv');
};
src
만들어진 설의의iframe
javascript에 .그런 다음 HTML이 업데이트되고 HTML 파서가 호출되어 예상대로 속성을 처리합니다.
var iframe = document.createElement('iframe');
var html = '<body>Foo</body>';
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
document.body.appendChild(iframe);
console.log('iframe.contentWindow =', iframe.contentWindow);
또한 이 질문에 대한 답변은 이 접근 방식이 일부 브라우저와 호환성 문제가 있다는 점에 유의하는 것이 중요합니다. 크로스 브라우저 솔루션은 @mschr의 답변을 참조하십시오.
이라는 것을 , 저는 예를 했습니다.srcdoc
속성은 현재 널리 지원되고 있으며 이 질문은 자주 볼 수 있습니다.
속성을 사용하여 포함할 인라인 HTML을 제공할 수 있습니다.이는 다음을 오버라이드합니다.src
속성(지원되는 경우).브라우저가 다시 아래로 이동합니다.src
속성(지원되지 않는 경우).
또한 속성을 사용하여 프레임의 내용에 추가 제한을 적용하는 것이 좋습니다.HTML이 사용자 자신의 것이 아닌 경우 특히 중요합니다.
const iframe = document.createElement('iframe');
const html = '<body>Foo</body>';
iframe.srcdoc = html;
iframe.sandbox = '';
document.body.appendChild(iframe);
브라우저를 ▁for▁if다를 확인할 수 있습니다.srcdoc
다른 답변의 다른 메소드 중 하나를 지원하고 폴백합니다.
function setIframeHTML(iframe, html) {
if (typeof iframe.srcdoc !== 'undefined') {
iframe.srcdoc = html;
} else {
iframe.sandbox = 'allow-same-origin';
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();
}
}
var iframe = document.createElement('iframe');
iframe.sandbox = '';
var html = '<body>Foo</body>';
document.body.appendChild(iframe);
setIframeHTML(iframe, html);
당신의 훌륭한 질문에 감사드립니다, 이것은 저를 몇 번이나 놀라게 했습니다.데이터 사용 시URI HTML 소스, 저는 완전한 HTML 문서를 정의해야 한다는 것을 알게 되었습니다.
아래의 수정된 예를 참조하십시오.
var html = '<html><head></head><body>Foo</body></html>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
html 내용을 기록합니다.<html>
태그 및iframe.src
현을 매다
구문 분석할 DOM 트리에 iframe 요소를 추가해야 합니다.
document.body.appendChild(iframe);
다음을 검사할 수 없습니다.iframe.contentDocument
당신이 아니면disable-web-security
사용자의 브라우저에서.메시지가 표시됩니다.
DOM 예외:'HTMLIFrameElement'에서 'contentDocument' 속성을 읽지 못했습니다. 원본이 "http://localhost:7357"인 프레임이 원본 간 프레임에 액세스하지 못하도록 차단했습니다.
HTML 문자열을 사용하는 iframe을 만들 수 있는 대안이 있습니다. srcdoc 속성입니다.이전 브라우저(주요 브라우저:Internet Explorer(인터넷 익스플로러), 그리고 아마도 Safari(사파리?))이지만 IE에 대한 조건부 주석을 넣거나 조건부 게으른 로드를 위해 has.js와 같은 것을 사용할 수 있는 이 동작에 대한 폴리필이 있습니다.
URL 접근 방식은 작은 HTML 조각에만 사용할 수 있습니다.보다 확실한 접근 방식은 블롭에서 객체 URL을 생성하여 동적 iframe의 소스로 사용하는 것입니다.
const html = '<html>...</html>';
const iframe = document.createElement('iframe');
const blob = new Blob([html], {type: 'text/html'});
iframe.src = window.URL.createObjectURL(blob);
document.body.appendChild(iframe);
수행
...
var el = document.getElementById('targetFrame');
var frame_win = getIframeWindow(el);
console.log(frame_win);
...
getIframeWindow가 여기에 정의되어 있습니다.
function getIframeWindow(iframe_object) {
var doc;
if (iframe_object.contentWindow) {
return iframe_object.contentWindow;
}
if (iframe_object.window) {
return iframe_object.window;
}
if (!doc && iframe_object.contentDocument) {
doc = iframe_object.contentDocument;
}
if (!doc && iframe_object.document) {
doc = iframe_object.document;
}
if (doc && doc.defaultView) {
return doc.defaultView;
}
if (doc && doc.parentWindow) {
return doc.parentWindow;
}
return undefined;
}
(함수는 {})
var frame = document.createElement('iframe');
frame.src = 'https://1zr2h9xgfxqt.statuspage.io/embed/frame';
frame.style.position = 'fixed';
frame.style.border = 'none';
frame.style.boxShadow = '0 20px 32px -8px rgba(9,20,66,0.25)';
frame.style.zIndex = '9999';
frame.style.transition = 'left 1s ease, bottom 1s ease, right 1s ease';
var mobile;
if (mobile = screen.width < 450) {
frame.src += '?mobile=true';
frame.style.height = '20vh';
frame.style.width = '100vw';
frame.style.left = '-9999px';
frame.style.bottom = '-9999px';
frame.style.transition = 'bottom 1s ease';
} else {
frame.style.height = '115px';
frame.style.width = '320px';
frame.style.left = 'auto';
frame.style.right = '-9999px';
frame.style.bottom = '60px';
}
document.body.appendChild(frame);
var actions = {
showFrame: function() {
if (mobile) {
frame.style.left = '0';
frame.style.bottom = '0';
}
else {
frame.style.left = 'auto';
frame.style.right = '60px'
}
},
dismissFrame: function(){
frame.style.left = '-9999px';
}
}
window.addEventListener('message', function(event){
if (event.data.action && actions.hasOwnProperty(event.data.action)) {
actions[event.data.action](event.data);
}
}, false);
window.statusEmbedTest = actions.showFrame;
})();
언급URL : https://stackoverflow.com/questions/10418644/creating-an-iframe-with-given-html-dynamically
'programing' 카테고리의 다른 글
web.config의 단일 폴더에 대해 익명 인증을 허용하시겠습니까? (0) | 2023.08.04 |
---|---|
Oracle FIRST/LAST에서 KEEP에 대한 설명 (0) | 2023.08.04 |
asp.net c# http에서 https로 리디렉션 (0) | 2023.08.04 |
Android 모양 색상을 프로그래밍 방식으로 설정 (0) | 2023.08.04 |
Android에서 토스트의 위치를 변경하는 방법은 무엇입니까? (0) | 2023.08.04 |