Альтернатива iFrames з HTML5


197

Мені хотілося б знати, чи існує альтернатива iFrames з HTML5. Я маю на увазі під тим, мати можливість вводити HTML між доменами всередині веб-сторінки, не використовуючи iFrame.

Відповіді:


96

В основному є 4 способи вбудовування HTML у веб-сторінку:

  • <iframe>Вміст iframe живе повністю в окремому контексті, ніж ваша сторінка. Хоча це здебільшого чудова функція, і вона є найбільш сумісною серед версій браузера, вона створює додаткові проблеми (зменшення розміру кадру на його вміст є жорстким, шалено засмучує сценарій в / з, майже неможливо стилізувати).
  • AJAX . Як показують наведені тут рішення, ви можете використовувати XMLHttpRequestоб’єкт для отримання даних та введення його на свою сторінку. Це не ідеально, оскільки це залежить від технічних сценаріїв, тим самим робить виконання повільнішим і складнішим, серед інших недоліків .
  • Хаки . Мало хто згадується в цьому питанні і не дуже надійний.
  • Веб-компоненти HTML5 . HTML Imports, що є частиною веб-компонентів, дозволяє поєднувати HTML-документи в інші документи HTML. Це включає в себе HTML, CSS, JavaScriptабо що - небудь ще .htmlфайл може містити. Це робить його чудовим рішенням із багатьма цікавими випадками використання: розділіть додаток на комплектуючі компоненти, які ви можете розповсюдити як будівельні блоки, краще керуйте залежностями, щоб уникнути надмірності, організації коду тощо. Ось тривіальний приклад:

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

Власна сумісність все ще залишається проблемою, але ви можете використовувати полі- заливку, щоб змусити її працювати у вічнозелених браузерах сьогодні.

Ви можете дізнатися більше тут і тут .


3
Веб-компоненти HTML5 цікаві.
Крішна Шріхарі

1
Я знаю, що цей пост трохи старий, але просто хочу прокоментувати: Посилаючись на AJAX, "Це не ідея, оскільки він покладається на методики сценаріїв" ... Отже, що не так у використанні сценаріїв? AJAX - безперечний переможець цих варіантів, і це швидко стає стандартом.
nmg49

11
На жаль, HTML Imports зараз є застарілою функцією. developer.mozilla.org/en-US/docs/Web/Web_Components/…
Gman

Якийсь новий спосіб досягти цього?
Вальтер

Ще одним важливим недоліком iFrames є той факт, що існує багато веб-сайтів, які встановили параметри "X-Frame" на "sameorigin", а потім просто відмовляються від з'єднання. У цьому випадку ваш iFrame залишається порожнім. Ніякого способу це не виправити.
Ігор П.

61

Ви можете використовувати об'єкт та вставляти, наприклад:

<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 для лицьових книг, як поле.
Техагесит

51

Ні, немає еквівалента. <iframe>Елемент залишається в силі в HTML5. Залежно від того, яка саме взаємодія потрібна, можуть існувати різні API. Наприклад, існує postMessageметод, який дозволяє досягти взаємодії між доменними JavaScript у міждоменній області. Але якщо ви хочете відображати вміст міждоменного HTML (стилізований за допомогою CSS та інтерактивної роботи з javascript), це iframeзалишається хорошим способом.


3
Мені потрібно завантажити вміст з google. але Google не може бути обрамлений, що є альтернативою.
Майк

17
@Mike, альтернативою може бути використання API для сервісу, який ви хочете використовувати. Google надає API RESTful для більшості своїх послуг.
Дарин Димитров

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
обидва не оминають проблем, які виникають у мене із iframes, такими як політика безпеки
SeanMC

3
Майте на увазі, що більшість сучасних веб-переглядачів припинили підтримку плагінів веб-переглядачів і видалили підтримку, тому покладатися на <embed> зазвичай не розумно, якщо ви хочете, щоб ваш сайт працював у веб-переглядачі середнього користувача.
Неєрай

20

Якщо ви хочете це зробити та керувати сервером, з якого подається базова сторінка або вміст, ви можете використовувати спільний ресурс спільного доступу ( http://www.w3.org/TR/access-control/ ), щоб дозволити клієнту- бічний JavaScript для завантаження даних <div>через 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

Іфрейм все ще є найкращим способом завантаження міждоменного візуального контенту. За допомогою AJAX ви, безумовно, можете завантажити HTML з веб-сторінки та вставити його у розділ (як уже згадували інші), проте більша проблема - безпека. За допомогою iframes ви зможете завантажити міждоменний вміст, але не зможете ним маніпулювати, оскільки вміст насправді не належить вам. З іншого боку, за допомогою AJAX ви, безумовно, можете маніпулювати будь-яким вмістом, який ви можете завантажити, але сервер іншого домену повинен бути налаштований таким чином, що дозволить вам завантажити його для початку. Багато разів у вас не буде доступу до конфігурації іншого домену, і навіть якщо ви це робите, якщо ви не робите таку конфігурацію весь час, це може бути головним болем. У такому випадку iframe може бути НАЙмно простішою альтернативою.

Як уже згадували інші, ви також можете використовувати тег вбудовування та тег об'єкта, але це не обов'язково більш досконало чи новіше, ніж рамка iframe.

HTML5 пішов більше в напрямку прийняття веб-API для отримання інформації з перехресних доменів. Зазвичай веб-API просто повертають дані, але не HTML.


1
Це насправді не відповідь, але, безумовно,nice-to-know
Стеф Гейзельс

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 блокується більшістю браузерів.
Ерік Тереній

4
Оп просить крос-домени, ця відповідь не вірна.
Теоман шипахі

4

Я створив модуль вузла, щоб вирішити цю проблему заміна вузла-iframe . Ви надаєте вихідну URL-адресу батьківського сайту та CSS-селектора для введення вашого вмісту, і він об'єднує два разом.

Зміни на батьківському сайті збираються кожні 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://en.wikipedia.org/wiki/JSONP

Ви в основному визначаєте файл javascript, який завантажує всі ваші дані, та інший файл javascript, який обробляє та відображає їх. Це позбавляється від потворної смуги прокрутки кадрів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.