Ich muss einen Rückruf ausführen, wenn ein IFRAME vollständig geladen wurde. Ich habe keine Kontrolle über den Inhalt im IFRAME, daher kann ich den Rückruf von dort nicht auslösen.
Dieser IFRAME wird programmgesteuert erstellt, und ich muss seine Daten als Variable im Rückruf übergeben und den Iframe zerstören.
Irgendwelche Ideen?
BEARBEITEN:
Folgendes habe ich jetzt:
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);
});
}
Dieser Rückruf erfolgt vor dem Laden des iFrame, sodass für den Rückruf keine Daten zurückgegeben werden.
javascript
events
dom
iframe
FlySwat
quelle
quelle
Antworten:
Zunächst wird der Funktionsname xssRequest verwendet Sie zunächst , klingt es so, als würden Sie eine standortübergreifende Anforderung versuchen. Wenn dies richtig ist, können Sie den Inhalt des nicht lesen.
Wenn sich die URL des Iframes in Ihrer Domain befindet, können Sie auf den Text zugreifen. Ich habe jedoch festgestellt, dass der Rückruf einwandfrei funktioniert, wenn ich zum Entfernen des Iframes eine Zeitüberschreitung verwende:
quelle
$('body', this.contentWindow.document).html()
durchthis.contentDocument.body.outerHTML
load
ist weg. Bitte verwenden Sie.on('load', function() { ... })
stattdessen.Ich verwende jQuery und überraschenderweise scheint dies geladen zu werden, da ich gerade eine schwere Seite getestet und geladen habe und die Warnung einige Sekunden lang nicht erhalten habe, bis ich das Laden des Iframes sah:
Wenn Sie jQuery nicht verwenden möchten, schauen Sie sich den Quellcode an und prüfen Sie, ob sich diese Funktion bei iframe-DOM-Elementen anders verhält. Ich werde sie später selbst betrachten, da ich interessiert bin, und hier posten. Auch habe ich nur im neuesten Chrom getestet.
quelle
load
ist weg. Bitte verwenden Sie.on('load', function() { ... })
stattdessen.Das innerHTML Ihres Iframes ist leer, da Ihr Iframe-Tag keinen Inhalt im übergeordneten Dokument umgibt. Um den Inhalt von der Seite abzurufen, auf die das src-Attribut des iframes verweist, müssen Sie auf die contentDocument-Eigenschaft des iframes zugreifen. Eine Ausnahme wird ausgelöst, wenn der Quellcode aus einer anderen Domäne stammt. Dies ist eine Sicherheitsfunktion, die verhindert, dass Sie beliebiges JavaScript auf der Seite einer anderen Person ausführen, wodurch eine Sicherheitsanfälligkeit bezüglich Cross-Site-Scripting entsteht. Hier ist ein Beispielcode, der veranschaulicht, wovon ich spreche:
Verwenden Sie dies als Inhalt des Iframes, um das Beispiel weiterzuentwickeln:
quelle
Ich musste dies in Fällen tun, in denen Dokumente wie Word-Dokumente und PDFs zum Iframe gestreamt wurden und eine Lösung gefunden wurden, die ziemlich gut funktioniert. Der Schlüssel ist die Handhabung der
onreadystatechanged
Ereignis im Iframe.Nehmen wir an, der Name Ihres Frames lautet "myIframe". Fügen Sie zuerst irgendwo in Ihrem Code-Start (ich mache es inline irgendwo nach dem Iframe) so etwas hinzu, um den Event-Handler zu registrieren:
Ich konnte kein onreadystatechage-Attribut für den Iframe verwenden. Ich kann mich nicht erinnern, warum, aber die App musste in IE 7 und Safari 3 funktionieren, sodass dies möglicherweise ein Faktor war.
Hier ist ein Beispiel, wie Sie den vollständigen Status erhalten:
quelle
Ich wollte das wartende Spinner-Div ausblenden, wenn der i-Frame-Inhalt vollständig im IE geladen ist. Ich habe buchstäblich jede in Stackoverflow.Com erwähnte Lösung ausprobiert, aber nichts hat so funktioniert, wie ich es wollte.
Dann hatte ich die Idee, dass das Ladeereignis $ (Window) ausgelöst werden könnte, wenn der Inhalt des i-Frames vollständig geladen ist. Und genau das ist passiert. Also schrieb ich dieses kleine Skript und arbeitete wie Magie:
Hoffe das hilft.
quelle
Ich hatte ein ähnliches Problem wie Sie. Was ich getan habe ist, dass ich etwas benutze, das jQuery heißt. Was Sie dann im Javascript-Code tun, ist Folgendes:
Es scheint, als würden Sie Ihren iFrame löschen, bevor Sie den HTML-Code daraus abrufen. Jetzt sehe ich ein Problem damit: p
Hoffe das hilft :).
quelle
Ich habe einen ähnlichen Code in meinen Projekten, der gut funktioniert. Wenn Sie meinen Code an Ihre Funktion anpassen, könnte dies eine Lösung sein:
Möglicherweise haben Sie eine leere innerHTML, weil (eine oder beide Ursachen): 1. Sie sollten sie gegen das body-Element verwenden. 2. Sie haben den iframe aus dem DOM Ihrer Seite entfernt
quelle
Ich denke, das Ladeereignis ist richtig. Was nicht richtig ist, ist die Art und Weise, wie Sie den Inhalt von iframe content dom abrufen.
Was Sie brauchen, ist das HTML der Seite, die in den Iframe geladen wird, nicht das HTML des Iframe-Objekts.
Sie müssen lediglich mit auf das Inhaltsdokument zugreifen
iFrameObj.contentDocument
. Dies gibt den Dom der Seite zurück, die in den Iframe geladen wurde, wenn er sich in derselben Domain der aktuellen Seite befindet.Ich würde den Inhalt abrufen, bevor ich den Iframe entferne.
Ich habe in Firefox und Oper getestet.
Dann denke ich, dass Sie Ihre Daten mit
$(childDom).html()
oder abrufen können$(childDom).find('some selector') ...
quelle
Ich hatte in der Vergangenheit genau das gleiche Problem und konnte es nur beheben, indem ich den Rückruf zur iframe-Seite hinzufügte. Das funktioniert natürlich nur, wenn Sie die Kontrolle über den Iframe-Inhalt haben.
quelle
Verwenden von
onload
attrbute löst Ihr Problem.Hier ist ein Beispiel.
Ist das was du willst?
Klicken Sie hier für weitere Informationen.
quelle