Alternative aux iFrames avec HTML5

197

Je voudrais savoir s'il existe une alternative aux iFrames avec HTML5. Je veux dire par là, être capable d'injecter du HTML inter-domaines à l'intérieur d'une page Web sans utiliser d'iFrame.

Stemlaur
la source

Réponses:

96

Fondamentalement, il existe 4 façons d'intégrer du HTML dans une page Web:

  • <iframe>Le contenu d'une iframe vit entièrement dans un contexte distinct de votre page. Bien que ce soit principalement une fonctionnalité intéressante et la plus compatible parmi les versions de navigateur, cela crée des défis supplémentaires (réduire la taille du cadre à son contenu est difficile, incroyablement frustrant à écrire / sortir, presque impossible à styliser).
  • AJAX . Comme le prouvent les solutions présentées ici, vous pouvez utiliser l' XMLHttpRequestobjet pour récupérer des données et les injecter dans votre page. Ce n'est pas idéal car il dépend des techniques de script, rendant ainsi l'exécution plus lente et plus complexe, entre autres inconvénients .
  • Hacks . Rares sont mentionnés dans cette question et pas très fiables.
  • Composants Web HTML5 . Les importations HTML, qui font partie des composants Web, permettent de regrouper des documents HTML dans d'autres documents HTML. Cela inclut HTML, CSS, JavaScriptou quoi que ce soit d' autre d' un .htmlfichier peut contenir. Cela en fait une excellente solution avec de nombreux cas d'utilisation intéressants: diviser une application en composants groupés que vous pouvez distribuer en tant que blocs de construction, mieux gérer les dépendances pour éviter la redondance, l'organisation du code, etc. Voici un exemple trivial:

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

La compatibilité native est toujours un problème, mais vous pouvez utiliser un polyfill pour le faire fonctionner dans les navigateurs Evergreen aujourd'hui.

Vous pouvez en savoir plus ici et ici .

Oriol
la source
3
Les composants Web HTML5 sont intéressants.
Krishna Srihari le
1
Je sais que cet article est un peu vieux mais je veux juste faire un commentaire: En référence à AJAX, "Ce n'est pas une idée car il repose sur des techniques de script" ... Alors, qu'est-ce qui ne va pas avec l'utilisation de scripts? AJAX est le leader incontesté de ces choix et il devient rapidement la norme.
nmg49
11
Malheureusement, les importations HTML sont désormais une fonctionnalité obsolète. developer.mozilla.org/en-US/docs/Web/Web_Components/…
Gman
Une nouvelle façon d'y parvenir?
Walter
Un autre inconvénient crucial des iFrames est le fait qu'il existe de nombreux sites Web qui ont défini 'X-Frame-Options' sur 'sameorigin' et qui refusent simplement la connexion. Dans ce cas, votre iFrame reste vide. Pas moyen de réparer ça.
Igor P.
61

Vous pouvez utiliser un objet et l'intégrer, comme ceci:

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

Ce qui n'est pas nouveau, mais fonctionne toujours. Je ne suis pas sûr qu'il ait la même fonctionnalité.

nate
la source
Merci beaucoup, m'a sauvé le chargement du sdk pour facebook comme box.
Techagesite
51

Non, il n'y a pas d'équivalent. L' <iframe>élément est toujours valide en HTML5. En fonction de l'interaction exacte dont vous avez besoin, il peut y avoir différentes API. Par exemple, il existe la postMessageméthode qui vous permet de réaliser une interaction javascript entre domaines. Mais si vous souhaitez afficher des contenus HTML interdomaines (stylisés avec CSS et rendus interactifs avec javascript), cela iframereste un bon moyen de le faire.

Darin Dimitrov
la source
3
J'ai besoin de charger du contenu depuis Google. mais google ne peut pas être iframed, quelle est l'alternative.
Mike
17
@Mike, l'alternative serait d'utiliser l'API pour le service que vous souhaitez utiliser. Google fournit des API RESTful pour la plupart de ses services.
Darin Dimitrov
45

object est une alternative simple en 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>

Vous pouvez également essayer 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 !!');" />

Abrar Jahin
la source
4
les deux ne contournent pas les problèmes que j'ai avec les iframes tels que les politiques de sécurité
SeanMC
3
Gardez à l'esprit que la plupart des navigateurs modernes ont abandonné et supprimé la prise en charge des plug-ins de navigateur, il n'est donc généralement pas judicieux de s'appuyer sur <embed> si vous voulez que votre site soit opérationnel sur le navigateur de l'utilisateur moyen.
Neeraj
20

Si vous souhaitez faire cela et contrôler le serveur à partir duquel la page de base ou le contenu est servi, vous pouvez utiliser le partage de ressources Cross Origin ( http://www.w3.org/TR/access-control/ ) pour permettre au client- côté JavaScript pour charger des données dans un <div>via 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();

Maintenant, pour le pivot de toute cette opération, vous devez écrire du code pour votre serveur qui donnera aux clients l'en- Access-Control-Allow-Origintête, en spécifiant les domaines auxquels vous voulez que le code côté client puisse accéder via XMLHttpRequest(). Voici un exemple de code PHP que vous pouvez inclure en haut de votre page afin d'envoyer ces en-têtes aux clients:

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

Une iframe reste le meilleur moyen de télécharger du contenu visuel inter-domaines. Avec AJAX, vous pouvez certainement télécharger le HTML à partir d'une page Web et le coller dans un div (comme d'autres l'ont mentionné), mais le plus gros problème est la sécurité. Avec les iframes, vous pourrez charger le contenu de plusieurs domaines, mais ne pourrez pas le manipuler car le contenu ne vous appartient pas réellement. D'un autre côté, avec AJAX, vous pouvez certainement manipuler tout contenu que vous pouvez télécharger, mais le serveur de l'autre domaine doit être configuré de manière à vous permettre de le télécharger pour commencer. Souvent, vous n'aurez pas accès à la configuration de l'autre domaine et même si vous le faites, à moins de faire ce type de configuration tout le temps, cela peut être un casse-tête. Dans ce cas, l'iframe peut être une alternative BEAUCOUP plus simple.

Comme d'autres l'ont mentionné, vous pouvez également utiliser la balise embed et la balise d'objet, mais ce n'est pas nécessairement plus avancé ou plus récent que l'iframe.

HTML5 est allé davantage dans le sens de l'adoption d'API Web pour obtenir des informations à partir de plusieurs domaines. En général, les API Web ne renvoient que des données et non du HTML.

Adam
la source
1
Ce n'est pas vraiment une réponse mais certainement unenice-to-know
Stef Geysels
4

Vous pouvez utiliser une XMLHttpRequest pour charger une page dans un div (ou tout autre élément de votre page en fait). Un exemple de fonction serait:

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

Si votre serveur en est capable, vous pouvez également utiliser PHP pour le faire, mais puisque vous demandez une méthode HTML5, cela devrait être tout ce dont vous avez besoin.

CupOfTea696
la source
4
Le chargement du contenu d'autres domaines à l'aide de XMLHttpRequest est bloqué par la plupart des navigateurs.
Erik Terenius
4
Op demande des cross-domaines, cette réponse n'est pas valable.
Teoman shipahi
4

J'ai créé un module de nœud pour résoudre ce problème de remplacement de nœud-iframe . Vous fournissez l'URL source du site parent et le sélecteur CSS dans lequel injecter votre contenu et il fusionne les deux ensemble.

Les modifications apportées au site parent sont récupérées toutes les 5 minutes.

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

La source contient un exemple de travail d'injection de contenu dans la page d'accueil de BBC News .

John Doherty
la source
0

Vous devriez jeter un œil à JSON-P - c'était une solution parfaite pour moi quand j'ai eu ce problème:

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

Vous définissez essentiellement un fichier javascript qui charge toutes vos données et un autre fichier javascript qui les traite et les affiche. Cela élimine la vilaine barre de défilement des iframes.

Mathias Bader
la source