Muszę wykonać wywołanie zwrotne, gdy ramka IFRAME zakończy ładowanie. Nie mam kontroli nad zawartością w IFRAME, więc nie mogę stamtąd odpalić wywołania zwrotnego.
Ta ramka IFRAME jest tworzona programowo i muszę przekazać jej dane jako zmienną w wywołaniu zwrotnym, a także zniszczyć ramkę iframe.
Jakieś pomysły?
EDYTOWAĆ:
Oto co mam teraz:
function xssRequest(url, callback)
{
var iFrameObj = document.createElement('IFRAME');
iFrameObj.src = url;
document.body.appendChild(iFrameObj);
$(iFrameObj).load(function()
{
document.body.removeChild(iFrameObj);
callback(iFrameObj.innerHTML);
});
}
To wywołanie zwrotne przed załadowaniem elementu iFrame, więc wywołanie zwrotne nie zwróciło żadnych danych.
javascript
events
dom
iframe
FlySwat
źródło
źródło
Odpowiedzi:
Po pierwsze, przechodząc przez nazwę funkcji xssRequest , brzmi to tak, jakbyś próbował wykonać żądanie między witrynami - co jeśli to prawda, nie będziesz w stanie odczytać zawartości elementu iframe.
Z drugiej strony, jeśli adres URL elementu iframe znajduje się w Twojej domenie, możesz uzyskać dostęp do treści, ale odkryłem, że jeśli użyję limitu czasu do usunięcia elementu iframe, wywołanie zwrotne działa dobrze:
źródło
$('body', this.contentWindow.document).html()
zthis.contentDocument.body.outerHTML
load
nie ma. Użyj.on('load', function() { ... })
zamiast tego.Używam jQuery i, co zaskakujące, wygląda na to, że ładuje się, ponieważ właśnie przetestowałem i załadowałem ciężką stronę i nie otrzymałem ostrzeżenia przez kilka sekund, dopóki nie zobaczyłem ładowania iframe:
Więc jeśli nie chcesz używać jQuery, spójrz na ich kod źródłowy i zobacz, czy ta funkcja zachowuje się inaczej z elementami iframe DOM, przyjrzę się temu później, ponieważ jestem zainteresowany i opublikuję tutaj. Testowałem też tylko w najnowszym chrome.
źródło
load
nie ma. Użyj.on('load', function() { ... })
zamiast tego.Wewnętrzny kod HTML elementu iframe jest pusty, ponieważ tag iframe nie otacza żadnej treści w dokumencie nadrzędnym. Aby pobrać treść ze strony, do której odwołuje się atrybut src elementu iframe, musisz uzyskać dostęp do właściwości contentDocument elementu iframe. Jednak wyjątek zostanie zgłoszony, jeśli źródło pochodzi z innej domeny. Jest to funkcja bezpieczeństwa, która uniemożliwia wykonanie dowolnego kodu JavaScript na czyjejś stronie, co spowodowałoby lukę w zabezpieczeniach skryptów między witrynami. Oto przykładowy kod ilustrujący to, o czym mówię:
Aby rozwinąć przykład, spróbuj użyć tego jako zawartości elementu iframe:
źródło
Musiałem to zrobić w przypadkach, gdy dokumenty takie jak Word docs i PDF były przesyłane strumieniowo do iframe i znalazłem rozwiązanie, które działa całkiem dobrze. Kluczem jest obsługa
onreadystatechanged
zdarzenia w elemencie iframe.Powiedzmy, że nazwa Twojej ramki to „myIframe”. Najpierw gdzieś podczas uruchamiania kodu (robię to w dowolnym miejscu po elemencie iframe) dodaj coś takiego, aby zarejestrować procedurę obsługi zdarzeń:
Nie mogłem użyć atrybutu onreadystatechage w iframe, nie pamiętam dlaczego, ale aplikacja musiała działać w IE 7 i Safari 3, więc może to być czynnik.
Oto przykład, jak uzyskać pełny stan:
źródło
Chciałem ukryć czekający spinner div, gdy zawartość i frame jest w pełni załadowana w IE, próbowałem dosłownie każdego rozwiązania wymienionego w Stackoverflow.Com, ale nic nie działało tak, jak chciałem.
Wtedy wpadłem na pomysł, że gdy zawartość i-frame zostanie w pełni załadowana, zdarzenie ładowania $ (Window) może zostać uruchomione. I tak właśnie się stało. Napisałem więc ten mały skrypt i działałem jak magia:
Mam nadzieję że to pomoże.
źródło
Miałem podobny problem jak ty. Zrobiłem, że używam czegoś, co nazywa się jQuery. To, co następnie robisz w kodzie javascript, jest następujące:
Wygląda na to, że usuwasz element iFrame, zanim pobierzesz z niego kod HTML. Teraz widzę z tym problem: s
Mam nadzieję że to pomoże :).
źródło
Mam podobny kod w swoich projektach, który działa dobrze. Dostosowując mój kod do Twojej funkcji, rozwiązaniem może być:
Być może masz pusty innerHTML, ponieważ (jedna lub obie przyczyny): 1. powinieneś użyć go na elemencie body 2. usunąłeś ramkę iframe z DOM strony
źródło
Myślę, że zdarzenie obciążenia jest właściwe. To, co jest niewłaściwe, to sposób pobierania treści z elementu iframe content dom.
Potrzebujesz kodu HTML strony załadowanej w elemencie iframe, a nie html obiektu iframe.
Musisz uzyskać dostęp do dokumentu treści za pomocą
iFrameObj.contentDocument
. Zwraca domenę strony załadowanej wewnątrz elementu iframe, jeśli znajduje się w tej samej domenie, co bieżąca strona.Odzyskałbym zawartość przed usunięciem elementu iframe.
Testowałem w Firefoksie i Operze.
Wtedy myślę, że możesz odzyskać swoje dane za pomocą
$(childDom).html()
lub$(childDom).find('some selector') ...
źródło
W przeszłości miałem dokładnie ten sam problem i jedynym sposobem, w jaki udało mi się go naprawić, było dodanie wywołania zwrotnego do strony iframe. Oczywiście działa to tylko wtedy, gdy masz kontrolę nad zawartością elementu iframe.
źródło
Korzystanie z
onload
attrbute rozwiąże Twój problem.Oto przykład.
Czy to jest to, czego chcesz?
Kliknij tutaj, aby uzyskać więcej informacji.
źródło