HTML5 define varios elementos de contenido incrustados, que, a vista de pájaro, parecen ser muy similares hasta el punto de ser en gran medida idénticos.
¿Qué es la diferencia real entre iframe
, embed
y object
?
Si deseo incrustar un archivo HTML desde un sitio de terceros, ¿cuál de estos elementos podría usar y en qué se diferenciarían?
Respuestas:
<iframe>
Se usa principalmente para incluir recursos de otros dominios o subdominios, pero también se puede usar para incluir contenido del mismo dominio. La
<iframe>
fortaleza de esto es que el código incrustado está "en vivo" y puede comunicarse con el documento padre.<embed>
Estandarizado en HTML 5, antes era una etiqueta no estándar, que ciertamente fue implementada por todos los principales navegadores. El comportamiento anterior a HTML 5 puede variar ...
Se utiliza para incrustar contenido para complementos del navegador. Las excepciones a esto son SVG y HTML que se manejan de manera diferente de acuerdo con el estándar.
Los detalles de lo que se puede y no se puede hacer con el contenido incrustado depende del complemento del navegador en cuestión. Pero para SVG puede acceder al documento SVG incrustado desde el padre con algo como:
Desde el interior de un documento SVG o HTML incorporado, puede comunicarse con el padre con:
Para HTML incrustado no hay forma de obtener el documento incrustado del padre (que he encontrado).
<object>
Conclusión
A menos que esté incrustando SVG o algo estático, probablemente sea mejor usarlo
<iframe>
. Para incluir el uso de SVG<embed>
(si no recuerdo mal<object>
, no te dejaré script †). Honestamente, no sé por qué usarías<object>
menos que para navegadores antiguos o flash (con los que no trabajo).† Como se señala en los comentarios a continuación; los scripts
<object>
se ejecutarán pero los contextos padre e hijo no pueden comunicarse directamente. Con<embed>
usted puede obtener el contexto del niño del padre y viceversa. Esto significa que puede usar scripts en el padre para manipular al niño, etc. Esa parte no es posible con<object>
o<iframe>
donde tendría que configurar algún otro mecanismo, como la API de JavaScript postMessage .fuente
embed
es ideal para que el visitante siga una cadena de redireccionamiento que se origina en un sitio web que bloquea el encuadre. (Lo usamos para iniciar el inicio de sesión federado).<object>
se ejecutarán, pero no es posible (o no lo logré) llegar al contexto del objeto desde la página principal. Por lo tanto, los scripts "internos" se ejecutarán, los scripts "externos", desde el punto de vista del objeto, no pueden comunicarse con el contexto de los objetos.<iframe />
es el camino a seguir. El punto completo de la publicación es que todos son diferentes.<embed>
todavía está en la especificación: w3.org/TR/html5/embedded-content-0.html#the-embed-element , por lo que mencionarlo está justificado. También me parece más que un poco divertido que argumentas que<embed>
está desactualizado y mencionas los applets de Java en la siguiente oración :)Una razón para usar
object
másiframe
es que el objeto cambia el tamaño del contenido incrustado para adaptarse a las dimensiones del objeto. más notable en safari en iPhone 4s donde el ancho de pantalla es320px
y el html de la URL incrustada puede establecer dimensiones mayores.fuente
Otra razón para usar
object
sobre iframe es que losobject
sub recursos (cuando un<object>
realizaHTTP
solicitudes) se consideranpassive/display
en términos deMixed content
, lo que significa que es más seguro cuando debe tenerMixed content
.Contenido mixto significa que cuando tienes
https
pero tu recurso es dehttp
.Referencia: https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content
fuente