HTML5 definiuje kilka osadzonych elementów treści, które z lotu ptaka wydają się być bardzo podobne do tego, że są w dużej mierze identyczne.
Jaka jest różnica między rzeczywistą iframe
, embed
a object
?
Jeśli chcę osadzić plik HTML z witryny innej firmy, których z tych elementów mogę użyć i czym się one różnią?
Odpowiedzi:
<iframe>
Służy głównie do dołączania zasobów z innych domen lub subdomen, ale może być również używany do dołączania treści z tej samej domeny. Jego
<iframe>
zaletą jest to, że osadzony kod jest aktywny i może komunikować się z dokumentem nadrzędnym.<embed>
Znormalizowany w HTML 5, wcześniej był to niestandardowy tag, który wprawdzie został zaimplementowany przez wszystkie główne przeglądarki. Zachowanie przed HTML 5 może się różnić ...
Służy do osadzania treści dla wtyczek do przeglądarek. Wyjątkiem są pliki SVG i HTML, które są obsługiwane inaczej w zależności od standardu.
Szczegóły dotyczące tego, co można, a czego nie można zrobić z zawartością osadzoną, zależą od danej wtyczki przeglądarki. Ale w przypadku SVG możesz uzyskać dostęp do osadzonego dokumentu SVG od rodzica za pomocą czegoś takiego:
Z wnętrza osadzonego dokumentu SVG lub HTML możesz dotrzeć do rodzica za pomocą:
W przypadku osadzonego HTML nie ma możliwości uzyskania osadzonego dokumentu od rodzica (który znalazłem).
<object>
Wniosek
Chyba że osadzasz SVG lub coś statycznego, którego prawdopodobnie najlepiej użyjesz
<iframe>
. Aby uwzględnić użycie SVG<embed>
(jeśli dobrze pamiętam<object>
, nie pozwolę ci skryptu †). Szczerze mówiąc, nie wiem, dlaczego miałbyś używać,<object>
chyba że dla starszych przeglądarek lub flasha (z którymi nie pracuję).† Jak wskazano w komentarzach poniżej; skrypty w programie
<object>
będą działać, ale konteksty nadrzędny i podrzędny nie mogą komunikować się bezpośrednio. Dzięki temu<embed>
możesz uzyskać kontekst dziecka od rodzica i odwrotnie. Oznacza to, że możesz używać skryptów w rodzicu do manipulowania dzieckiem itp. Ta część nie jest możliwa z<object>
lub w<iframe>
przypadku której musiałbyś zamiast tego skonfigurować inny mechanizm, taki jak JavaScript postMessage API .źródło
embed
jest idealny, aby skłonić odwiedzającego do śledzenia łańcucha przekierowań pochodzącego ze strony internetowej, która blokuje ramkowanie. (Używamy go do rozpoczęcia logowania federacyjnego.)<object>
, ale nie jest możliwe (lub nie udało mi się) uzyskać kontekstu obiektu ze strony nadrzędnej. Zatem skrypty „wewnętrzne” będą działać, skrypty „zewnętrzne” z punktu widzenia obiektu nie mogą komunikować się z kontekstem obiektu.<iframe />
jest to najlepszy sposób. Cały post polega na tym, że wszystkie są różne.<embed>
jest nadal w specyfikacji: w3.org/TR/html5/embedded-content-0.html#the-embed-element , więc wspomnienie o tym jest uzasadnione. Ja również znaleźć więcej niż trochę śmieszne, że twierdzą, że<embed>
jest przestarzała i wspomnieć apletów Java w następnym zdaniu :)Jednym z powodów używania
object
overiframe
jest to, że obiekt zmienia rozmiar osadzonej zawartości, aby dopasować ją do wymiarów obiektu. najbardziej widoczne w Safari w iPhonie 4s, gdzie szerokość ekranu to,320px
a kod HTML z osadzonego adresu URL może ustawiać większe wymiary.źródło
Innym powodem używania
object
over iframe jest to, żeobject
zasoby podrzędne (gdy<object>
wykonujeHTTP
żądania) są traktowane jakopassive/display
w kategoriachMixed content
, co oznacza, że jest bezpieczniejsze, gdy trzebaMixed content
.Zawartość mieszana oznacza, że jeśli masz,
https
ale Twój zasób pochodzi zhttp
.Źródła: https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content
źródło