Thay thế cho iFrames bằng HTML5


196

Tôi muốn biết nếu có một sự thay thế cho iFrames với HTML5. Ý tôi là, có thể tiêm HTML tên miền chéo vào bên trong trang web mà không cần sử dụng iFrame.

Câu trả lời:


96

Về cơ bản có 4 cách để nhúng HTML vào một trang web:

  • <iframe>Nội dung của iframe sống hoàn toàn trong một bối cảnh riêng biệt so với trang của bạn. Mặc dù đó hầu hết là một tính năng tuyệt vời và nó tương thích nhất trong số các phiên bản trình duyệt, nhưng nó tạo ra những thách thức bổ sung (thu nhỏ kích thước khung hình vào nội dung của nó là khó khăn, cực kỳ khó chịu với kịch bản vào / ra, gần như không thể tạo kiểu).
  • AJAX . Như các giải pháp hiển thị ở đây chứng minh, bạn có thể sử dụng XMLHttpRequestđối tượng để truy xuất dữ liệu và đưa dữ liệu vào trang của mình. Nó không lý tưởng bởi vì nó phụ thuộc vào các kỹ thuật kịch bản, do đó làm cho việc thực thi chậm hơn và phức tạp hơn, trong số các nhược điểm khác .
  • Hacks . Rất ít đề cập trong câu hỏi này và không đáng tin cậy lắm.
  • Các thành phần web HTML5 . Nhập khẩu HTML, một phần của Thành phần Web, cho phép đóng gói các tài liệu HTML trong các tài liệu HTML khác. Điều đó bao gồm HTML, CSS, JavaScripthoặc bất cứ điều gì khác một .htmltệp có thể chứa. Điều này làm cho nó trở thành một giải pháp tuyệt vời với nhiều trường hợp sử dụng thú vị: chia một ứng dụng thành các thành phần được đóng gói mà bạn có thể phân phối dưới dạng khối xây dựng, quản lý tốt hơn các phụ thuộc để tránh dư thừa, tổ chức mã, v.v ... Dưới đây là một ví dụ nhỏ:

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

Khả năng tương thích tự nhiên vẫn còn là một vấn đề, nhưng bạn có thể sử dụng một polyfill để làm cho nó hoạt động trong các trình duyệt thường xanh Ngày nay.

Bạn có thể tìm hiểu thêm ở đâyở đây .


3
Các thành phần web HTML5 rất thú vị.
Krishna Srihari

1
Tôi biết bài đăng này hơi cũ nhưng chỉ muốn bình luận: Liên quan đến AJAX, "Đó không phải là ý tưởng vì nó dựa vào các kỹ thuật viết kịch bản" ... Vậy, có gì sai khi sử dụng kịch bản? AJAX là ứng cử viên hàng đầu của những lựa chọn này và nó nhanh chóng trở thành tiêu chuẩn.
nmg49

11
Thật không may, Nhập khẩu HTML là một tính năng lỗi thời. developer.mozilla.org/en-US/docs/Web/Web_Components/ cường
Gman

Bất kỳ cách mới để đạt được điều này?
Walter

Một nhược điểm quan trọng khác với iFrames là có rất nhiều trang web trên mạng đã đặt 'Tùy chọn khung X' thành 'sameorigin' và sau đó chỉ cần từ chối kết nối. Trong trường hợp này, iFrame của bạn vẫn trống. Không có cách nào khắc phục điều đó.
Igor P.

61

Bạn có thể sử dụng đối tượng và nhúng, như vậy:

<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>

Điều này không mới, nhưng vẫn hoạt động. Tôi không chắc chắn nếu nó có chức năng tương tự mặc dù.


Cảm ơn rất nhiều, đã lưu tôi tải sdk cho facebook như hộp.
Techagesite

51

Không, không có tương đương. Phần <iframe>tử vẫn còn hiệu lực trong HTML5. Tùy thuộc vào tương tác chính xác mà bạn cần, có thể có các API khác nhau. Ví dụ: có postMessagephương pháp cho phép bạn đạt được tương tác javascript tên miền chéo. Nhưng nếu bạn muốn hiển thị nội dung HTML tên miền chéo (được tạo kiểu bằng CSS và tương tác với javascript) thì iframevẫn là một cách tốt để làm.


3
Tôi cần tải nội dung từ google. nhưng google không thể có khung, cái gì thay thế.
Mike

17
@Mike, giải pháp thay thế sẽ là sử dụng API cho dịch vụ bạn muốn sử dụng. Google cung cấp API RESTful cho hầu hết các dịch vụ của mình.
Darin Dimitrov

45

object là một thay thế dễ dàng trong 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>

Bạn cũng có thể thử 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
cả hai đều không bỏ qua các vấn đề tôi gặp phải với iframe như chính sách bảo mật
SeanMC

3
Hãy nhớ rằng hầu hết các trình duyệt hiện đại đã không còn hỗ trợ và loại bỏ hỗ trợ cho trình cắm trình duyệt, do đó, việc dựa vào <embed> thường không khôn ngoan nếu bạn muốn trang web của mình có thể hoạt động trên trình duyệt trung bình của người dùng.
Neeraj

20

Nếu bạn muốn làm điều này và kiểm soát máy chủ mà trang cơ sở hoặc nội dung đang được phục vụ, bạn có thể sử dụng Chia sẻ tài nguyên nguồn gốc chéo ( http://www.w3.org/TR/access-control/ ) để cho phép khách hàng- JavaScript bên để tải dữ liệu vào <div>thông qua 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();

Bây giờ đối với lynchpin của toàn bộ hoạt động này, bạn cần viết mã cho máy chủ của mình để cung cấp cho khách hàng Access-Control-Allow-Origintiêu đề, chỉ định tên miền nào bạn muốn mã phía máy khách có thể truy cập qua XMLHttpRequest(). Sau đây là một ví dụ về mã PHP mà bạn có thể đưa vào đầu trang để gửi các tiêu đề này cho khách hàng:

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


8

Một iframe vẫn là cách tốt nhất để tải xuống nội dung trực quan giữa các miền. Với AJAX, bạn chắc chắn có thể tải xuống HTML từ một trang web và dán nó vào div (như những người khác đã đề cập) tuy nhiên vấn đề lớn hơn là bảo mật. Với iframe, bạn sẽ có thể tải nội dung tên miền chéo nhưng sẽ không thể thao tác với nội dung đó vì nội dung không thực sự thuộc về bạn. Mặt khác với AJAX, bạn chắc chắn có thể thao tác bất kỳ nội dung nào bạn có thể tải xuống nhưng máy chủ của tên miền khác cần được thiết lập theo cách cho phép bạn tải xuống để bắt đầu. Rất nhiều lần bạn sẽ không có quyền truy cập vào cấu hình của tên miền khác và ngay cả khi bạn làm như vậy, trừ khi bạn thực hiện loại cấu hình đó mọi lúc, điều đó có thể gây đau đầu. Trong trường hợp đó, iframe có thể là lựa chọn thay thế dễ dàng hơn.

Như những người khác đã đề cập, bạn cũng có thể sử dụng thẻ nhúng và thẻ đối tượng nhưng điều đó không nhất thiết phải nâng cao hơn hoặc mới hơn so với iframe.

HTML5 đã đi nhiều hơn theo hướng áp dụng API web để lấy thông tin từ các tên miền chéo. Thông thường API web chỉ trả về dữ liệu mặc dù và không phải HTML.


1
Nó không thực sự là một câu trả lời nhưng chắc chắn là mộtnice-to-know
Stef Geysels

4

Bạn có thể sử dụng XMLHttpRequest để tải một trang vào div (hoặc bất kỳ yếu tố nào khác trên trang của bạn thực sự). Một chức năng mẫu sẽ là:

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();
}

Nếu máy chủ của bạn có khả năng, bạn cũng có thể sử dụng PHP để làm điều này, nhưng vì bạn đang yêu cầu một phương thức HTML5, đây sẽ là tất cả những gì bạn cần.


4
Tải nội dung từ các tên miền khác bằng XMLHttpRequest bị chặn bởi hầu hết các trình duyệt.
Erik Terenius

4
Op đang yêu cầu tên miền chéo, câu trả lời này không hợp lệ.
Teoman shipahi

4

Tôi đã tạo một mô-đun nút để giải quyết vấn đề thay thế nút-iframe này . Bạn cung cấp URL nguồn của trang mẹ và bộ chọn CSS để đưa nội dung của bạn vào và nó hợp nhất hai nội dung lại với nhau.

Thay đổi trang web mẹ được chọn cứ sau 5 phút.

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
    });
});

Nguồn này chứa một ví dụ hoạt động về việc đưa nội dung vào trang chủ của BBC News .


0

Bạn nên xem JSON-P - đó là một giải pháp hoàn hảo cho tôi khi tôi gặp vấn đề đó:

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

Về cơ bản, bạn xác định một tệp javascript tải tất cả dữ liệu của bạn và một tệp javascript khác xử lý và hiển thị nó. Điều đó được thoát khỏi thanh cuộn xấu xí của iframe.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.