Zakładając, że nie mam kontroli nad zawartością elementu iframe, czy jest jakiś sposób, żebym mógł wykryć w nim zmianę źródła za pośrednictwem strony nadrzędnej? Może jakiś rodzaj obciążenia?
Moją ostatnią deską ratunku jest wykonanie 1-sekundowego testu interwału, jeśli źródło iframe jest takie samo jak wcześniej, ale zrobienie tego hackerskiego rozwiązania byłoby do niczego.
Używam biblioteki jQuery, jeśli to pomaga.
javascript
jquery
iframe
onload
Matrym
źródło
źródło
src
właściwość zmieni się po kliknięciu linku w ramce iframe? Nie jestem tego pewien - gdybym miał zgadywać, czy powiedziałbym „nie”. Tam są sposoby Właściwości monitora (w Firefoksie przynajmniej AFAIK), ale nie jestem pewien, czy to będzie od każdego zastosowania w niniejszej sprawie.src
atrybut w DOM nie zmienia się w najnowszych wersjach FireFox ani Safari. @ Odpowiedź Michiela poniżej jest tak dobra, jak udało mi się dotrzeć do tej pory.Odpowiedzi:
Możesz użyć
onLoad
zdarzenia, jak w poniższym przykładzie:Alert wyskakuje za każdym razem, gdy zmieni się lokalizacja w ramce iframe. Działa we wszystkich nowoczesnych przeglądarkach, ale może nie działać w niektórych bardzo starszych przeglądarkach, takich jak IE5 i wczesna Opera. ( Źródło )
Jeśli element iframe wyświetla stronę w tej samej domenie podmiotu nadrzędnego , można uzyskać dostęp do lokalizacji za pomocą
contentWindow.location
, jak w poniższym przykładzie:źródło
this.contentWindow.location.href
dostanęPermission denied to access property 'href'
this.contentWindow.location
jest dostępna dla innych domen. Nawetthis.contentWindow.location.href
jest dostępny dla innych domen, ale tylko do pisania. Jednak czytaniethis.contentWindow.location.href
jest ograniczone do tej samej dziedziny.Odpowiedź oparta na JQuery <3
Jak wspomniano w subharb, od JQuery 3.0 należy to zmienić na:
https://jquery.com/upgrade-guide/3.0/#breaking-change-load-unload-and-error-removed
źródło
if (counter > 1) { // do something on iframe actual change }
(zakładając, że licznik był ustawiony na 0 na początku)Jeśli nie masz kontroli nad stroną i chcesz obserwować jakąś zmianę, użyj nowoczesnej metody
MutationObserver
Przykład jego użycia, obserwacja zmiany
src
atrybutuiframe
Wyjście po 3 sekundach
Na jsFiddle
Opublikowana odpowiedź tutaj, ponieważ oryginalne pytanie zostało zamknięte jako duplikat tego.
źródło
observe
. To tylko przykład.Uwaga: fragment działałby tylko wtedy, gdy element iframe ma to samo źródło.
Inne odpowiedzi proponowały
load
zdarzenie, ale jest ono uruchamiane po załadowaniu nowej strony w elemencie iframe. Może być konieczne powiadomienie natychmiast po zmianie adresu URL , a nie po załadowaniu nowej strony.Oto proste rozwiązanie JavaScript:
Spowoduje to pomyślne śledzenie
src
zmian atrybutów, a także wszelkich zmian adresu URL dokonanych z poziomu samego elementu iframe.Przetestowane we wszystkich nowoczesnych przeglądarkach.
Zrobiłem też sedno tego kodu. Możesz też sprawdzić moją drugą odpowiedź . Trochę dogłębnie wyjaśnia, jak to działa.
źródło
Element iframe zawsze zachowuje stronę nadrzędną, należy użyć tego, aby wykryć, na której stronie się znajdujesz:
Kod HTML:
Js:
źródło
Od wersji 3.0 Jquery możesz otrzymać błąd
Które można łatwo naprawić, wykonując
źródło
Oto metoda używana w Commerce SagePay i modułach Commerce Paypoint Drupal, która w zasadzie porównuje
document.location.href
ze starą wartością, najpierw ładując własną ramkę iframe, a następnie zewnętrzną.Zasadniczo chodzi więc o załadowanie pustej strony jako symbolu zastępczego z własnym kodem JS i ukrytym formularzem. Następnie nadrzędny kod JS prześle ten ukryty formularz w miejscu
#action
wskazującym na zewnętrzny element iframe. Gdy nastąpi przekierowanie / przesłanie, kod JS, który nadal działa na tej stronie, może śledzićdocument.location.href
zmiany wartości.Oto przykład JS użyty w iframe:
A oto JS użyty na stronie nadrzędnej:
Następnie w tymczasowo pustej stronie docelowej należy zamieścić formularz, który przekieruje na stronę zewnętrzną.
źródło