HTML5를 사용한 iFrames의 대안


197

HTML5를 사용하는 iFrame에 대한 대안이 있는지 알고 싶습니다. 즉, iFrame을 사용하지 않고 웹 페이지 내에 도메인 간 HTML을 삽입 할 수 있습니다.

답변:


96

기본적으로 HTML을 웹 페이지에 포함시키는 4 가지 방법이 있습니다.

  • <iframe>iframe의 콘텐츠는 전적으로 귀하의 페이지와 별도의 컨텍스트에 있습니다. 이 기능은 대부분 훌륭한 기능이며 브라우저 버전간에 가장 호환되지만 추가 과제가 발생합니다 (프레임 크기를 내용에 맞게 축소하는 것은 어렵고 스크립트를 작성하는 데 매우 실망스럽고 스타일 지정이 거의 불가능합니다).
  • AJAX . 여기에 제시된 솔루션이 증명했듯이 XMLHttpRequest객체를 사용하여 데이터를 검색하여 페이지에 삽입 할 수 있습니다. 스크립팅 기술에 의존하므로 다른 단점 중에서도 실행 속도가 느리고 복잡해지기 때문에 이상적이지 않습니다 .
  • 해킹 . 이 질문에 언급 된 사람은 거의 없으며 신뢰할 수 없습니다.
  • HTML5 웹 구성 요소 . 웹 구성 요소의 일부인 HTML 가져 오기를 사용하면 HTML 문서를 다른 HTML 문서에 묶을 수 있습니다. 즉 포함 HTML, CSS, JavaScript또는 다른 어떤 .html파일을 포함 할 수 있습니다. 따라서 여러 가지 재미있는 사용 사례가있는 훌륭한 솔루션입니다. 앱을 번들 구성 요소로 배포 할 수있는 번들 구성 요소로 분할하고, 중복성을 피하기 위해 종속성을보다 효과적으로 관리하고, 코드 구성 등을 수행 할 수 있습니다. 다음은 간단한 예입니다.

    <!-- Resources on other origins must be CORS-enabled. -->
    <link rel="import" href="http://example.com/elements.html">

기본 호환성 은 여전히 ​​문제이지만 polyfill 을 사용하여 오늘날에도 상쾌한 브라우저 에서 작동하도록 할 수 있습니다 .

여기여기에서 더 많은 것을 배울 수 있습니다 .


3
HTML5 웹 컴포넌트는 흥미 롭습니다.
Krishna Srihari

1
이 게시물이 약간 오래되었다는 것을 알고 있습니다. AJAX와 관련하여 "스크립팅 기술에 의존하기 때문에 아이디어가 아닙니다"... 스크립팅을 사용하는 데 무엇이 문제입니까? AJAX는 이러한 선택의 경쟁이없는 선두 주자이며 빠르게 표준이되고 있습니다.
nmg49

11
불행히도 HTML Imports는 이제 쓸모없는 기능입니다. developer.mozilla.org/en-US/docs/Web/Web_Components/…
Gman

이것을 달성하는 새로운 방법이 있습니까?
월터

iFrames의 또 다른 중요한 단점은 'X-Frame-Options'를 'sameorigin'으로 설정 한 다음 연결을 거부하는 많은 웹 사이트가 있다는 사실입니다. 이 경우 iFrame은 비어 있습니다. 그것을 고칠 방법이 없습니다.
Igor P.

61

다음과 같이 object 및 embed를 사용할 수 있습니다.

<object data="http://www.web-source.net" width="600" height="400">
    <embed src="http://www.web-source.net" width="600" height="400"> </embed>
    Error: Embedded data could not be displayed.
</object>

새로운 것이 아니지만 여전히 작동합니다. 그래도 동일한 기능을 가지고 있는지 확실하지 않습니다.


고마워 힙, 박스와 같은 페이스 북의 SDK를로드 저장했습니다.
Techagesite

51

아니요, 이에 상응하는 것은 없습니다. <iframe>요소는 여전히 HTML5에서 유효합니다. 필요한 정확한 상호 작용에 따라 다른 API가있을 수 있습니다. 예를 들어 postMessage교차 도메인 자바 스크립트 상호 작용을 달성 할 수 있는 방법이 있습니다. 그러나 CSS로 스타일을 지정하고 javascript와 대화식으로 만든 크로스 도메인 HTML 내용을 표시하려는 경우 iframe좋은 방법으로 유지됩니다.


3
Google에서 콘텐츠를로드해야합니다. 그러나 구글은 iframed 수 없습니다, 대안은 무엇입니까.
Mike

17
@Mike, 대안은 사용하려는 서비스에 API를 사용하는 것입니다. Google은 대부분의 서비스에 RESTful API를 제공합니다.
Darin Dimitrov

45

object HTML5의 쉬운 대안입니다.

<object data="https://blogs.claritycon.com/blog/2016/03/bower-packages-asp-net-core-1-0/" width="400" height="300" type="text/html">
    Alternative Content
</object>

당신은 또한 시도 할 수 있습니다 embed:

<embed src="https://blogs.claritycon.com/blog/2016/03/bower-packages-asp-net-core-1-0/" width=200 height=200 onerror="alert('URL invalid !!');" />


4
둘 다 보안 정책과 같은 iframe 관련 문제를 우회하지 않습니다
SeanMC

3
대부분의 최신 브라우저는 브라우저 플러그인에 대한 지원이 더 이상 사용되지 않으며 제거되었으므로 사이트를 일반 사용자의 브라우저에서 작동하려면 <embed>를 사용하는 것이 일반적으로 현명하지 않습니다.
Neeraj

20

이를 수행하고 기본 페이지 또는 컨텐츠가 제공되는 서버를 제어하려는 경우 Cross Origin Resource Sharing ( http://www.w3.org/TR/access-control/ )을 사용하여 클라이언트- <div>via 로 데이터를로드하는 side JavaScript XMLHttpRequest():

// I safely ignore IE 6 and 5 (!) users
// because I do not wish to proliferate
// broken software that will hurt other
// users of the internet, which is what
// you're doing when you write anything
// for old version of IE (5/6)
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
  if(xhr.readyState == 4 && xhr.status == 200) {
    document.getElementById('displayDiv').innerHTML = xhr.responseText;
  }
};
xhr.open('GET', 'http://api.google.com/thing?request=data', true);
xhr.send();

이제이 전체 작업을 시작 Access-Control-Allow-Origin하려면 클라이언트 측 코드를 통해 액세스 할 수있는 도메인을 지정하여 클라이언트에 헤더 를 제공하는 서버용 코드를 작성해야합니다 XMLHttpRequest(). 다음은 이러한 헤더를 클라이언트에게 보내기 위해 페이지 상단에 포함 할 수있는 PHP 코드의 예입니다.

<?php
  header('Access-Control-Allow-Origin: http://api.google.com');
  header('Access-Control-Allow-Origin: http://some.example.com');
?>


8

도메인 간 시각적 콘텐츠를 다운로드하는 가장 좋은 방법은 iframe입니다. AJAX를 사용하면 웹 페이지에서 HTML을 다운로드하여 div에 넣을 수 있지만 (다른 사람들이 언급했듯이) 더 큰 문제는 보안입니다. iframe을 사용하면 교차 도메인 컨텐츠를로드 할 수 있지만 컨텐츠가 실제로 귀하의 소유가 아니기 때문에 조작 할 수 없습니다. 반면에 AJAX를 사용하면 다운로드 할 수있는 모든 컨텐츠를 조작 할 수 있지만 다른 도메인의 서버는 다운로드 할 수있는 방식으로 설정해야합니다. 많은 경우 다른 도메인의 구성에 액세스 할 수 없으며, 그렇게해도 항상 이러한 종류의 구성을 수행하지 않으면 두통이 될 수 있습니다. 이 경우 iframe이 훨씬 쉬운 대안이 될 수 있습니다.

다른 사람들이 언급했듯이 embed 태그와 object 태그를 사용할 수도 있지만 반드시 iframe보다 고급이거나 새로운 것은 아닙니다.

HTML5는 교차 도메인으로부터 정보를 얻기 위해 웹 API를 채택하는 방향으로 향했습니다. 일반적으로 웹 API는 HTML이 아닌 데이터를 반환합니다.


1
그것은 실제로 대답은 아니지만 확실히nice-to-know
Stef Geysels

4

XMLHttpRequest를 사용하여 페이지를 div (또는 실제로 페이지의 다른 요소)에로드 할 수 있습니다. 예를 들어 함수는 다음과 같습니다.

function loadPage(){
if (window.XMLHttpRequest){
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
}else{
    // code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
        document.getElementById("ID OF ELEMENT YOU WANT TO LOAD PAGE IN").innerHTML=xmlhttp.responseText;
    }
}

xmlhttp.open("POST","WEBPAGE YOU WANT TO LOAD",true);
xmlhttp.send();
}

서버가 가능하다면 PHP를 사용하여이를 수행 할 수도 있지만 HTML5 메소드를 요청하기 때문에 필요한 모든 것입니다.


4
XMLHttpRequest를 사용하여 다른 도메인에서 콘텐츠를로드하는 것은 대부분의 브라우저에 의해 차단됩니다.
Erik Terenius

4
Op이 교차 도메인을 요청하고 있습니다.이 답변은 유효하지 않습니다.
Teoman shipahi

4

이 문제를 해결하기 위해 node-iframe-replacement 노드 모듈을 만들었습니다 . 부모 사이트와 CSS 선택기의 소스 URL을 제공하여 컨텐츠를 주입하면 두 사이트가 병합됩니다.

상위 사이트에 대한 변경 사항은 5 분마다 수집됩니다.

var iframeReplacement = require('node-iframe-replacement');

// add iframe replacement to express as middleware (adds res.merge method) 
app.use(iframeReplacement);

// create a regular express route 
app.get('/', function(req, res){

    // respond to this request with our fake-news content embedded within the BBC News home page 
    res.merge('fake-news', {
        // external url to fetch 
       sourceUrl: 'http://www.bbc.co.uk/news',
       // css selector to inject our content into 
       sourcePlaceholder: 'div[data-entityid="container-top-stories#1"]',
       // pass a function here to intercept the source html prior to merging 
       transform: null
    });
});

이 소스에는 BBC News 홈페이지에 콘텐츠를 주입 하는 실제 사례 가 포함되어 있습니다 .


0

JSON-P를 살펴 봐야합니다.이 문제가 발생했을 때 완벽한 솔루션이었습니다.

https://ko.wikipedia.org/wiki/JSONP

기본적으로 모든 데이터를로드하는 자바 스크립트 파일과이를 처리하고 표시하는 다른 자바 스크립트 파일을 정의합니다. 그것은 iframe의 추악한 스크롤 막대를 제거합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.