Warum nicht diese JavaScript (mit Dokument.öffnen und Dokument.schreib -) Arbeit im Internet Explorer oder Opera?
Ich brauche dringend etwas Hilfe dabei.
Habe ich einen <script>, das eng mit den parallelen, und reproduziert das problem, eine andere, komplexere <script> das habe ich an anderer Stelle geschrieben.
Hier ist, was es tut:
- schafft eine <iframe> und fügt in in ein <div> auf der Seite
- erstellt und fügt ein Dokument zu, dass <iframe> mit einer <script> definiert ein paar Funktionen (einschließlich einer callback-Funktion und eine Funktion, lädt eine externe <script> mit AJAX)
- letztere externen Skript ist nur ein Aufruf an die callback-Funktion, die eine Funktion aufruft, die ein Dokument erstellt und fügt es an die <iframe> es ist in; dies sollte effektiv überschreiben Sie die <script>
Den drei Dateien beteiligt sind:
- http://troy.onespot.com/static/document_write/index.html (die Haupt Seite)
- http://troy.onespot.com/static/document_write/main.js (das erste <script> das ist geladen)
- http://troy.onespot.com/static/document_write/jsonp.js (die <script> geladen jQuery $.ajax () - Methode)
Das ganze funktioniert im Firefox, Safari und Chrome. Wo bricht es im Internet Explorer und Opera. Was passiert, ist, dass die render () - Funktion in main.js wird ausgeführt, und alle drei Alarme ausgelöst werden, aber das Dokument, in dem <iframe> wird nicht überschrieben. Ich kann nicht sagen, was für ein Dokument erstellt wird, oder schriftlich, oder, wenn man überhaupt ist.
Wenn ich mit debug-code (wie Konsole.log(Dokument)) am Anfang der render () - Funktion, die das arbeiten Browser scheinen, um einen Griff auf den vorhandenen <iframe> Dokument und die Liste der Eigenschaften unten aufgeführt. Internet Explorer erscheint auch ein Dokument finden, irgendwie. Ich kann einfach nicht sagen, warum es nicht lassen mich zu überschreiben.
Könnte es ein Problem sein, der Umfang? Vielleicht bin ich mit dem Dokument.write(), document.open() oder document.close () - Methoden falsch, und Firefox und einigen anderen Browsern sind nur lässt mich Weg mit ihm?
Einen möglichen Anhaltspunkt: wenn ich den Mut der render () - Funktion aus (D. H., nur setzen Sie Sie nach Last() in main.js), dies funktioniert gut. Das lässt mich vermuten, dass es nicht, wie ich mit Dokument.open(), etc., aber irgendwie durch die Zeit, die der callback() Funktion ausgeführt wird, wird das document-Objekt ist nicht vorhanden, oder mehr Umfang, oder so ähnlich.
Das hat mir Total überfragt, und es ist für ein sehr wichtiges Projekt mit einer drohenden Frist. Ich bin nicht über einen hack oder workaround, wenn es bekommt, mich aus diesem Stau. Jede Hilfe oder Einsicht wäre SEHR dankbar!
Konsole.log()'s Liste der Dokument-Eigenschaften:
ATTRIBUTE_NODE: 2 CDATA_SECTION_NODE: 4 COMMENT_NODE: 8 DOCUMENT_FRAGMENT_NODE: 11 DOCUMENT_NODE: 9 DOCUMENT_POSITION_CONTAINED_BY: 16 DOCUMENT_POSITION_CONTAINS: 8 DOCUMENT_POSITION_DISCONNECTED: 1 DOCUMENT_POSITION_FOLLOWING: 4 DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 32 DOCUMENT_POSITION_PRECEDING: 2 DOCUMENT_TYPE_NODE: 10 ELEMENT_NODE: 1 ENTITY_NODE: 6 ENTITY_REFERENCE_NODE: 5 NOTATION_NODE: 12 PROCESSING_INSTRUCTION_NODE: 7 TEXT_NODE: 3 URL: "http://localhost/projects/test/ajax_loader/document_write/index.html" activeElement: HTMLBodyElement Sie addEventListener (): function addEventListener() { adoptNode: Funktion adoptNode() { alinkColor: "" alle: HTMLCollection Anker: HTMLCollection appendChild: Funktion appendChild() { applets: HTMLCollection Attribute: null baseURI: "http://localhost/projects/test/ajax_loader/document_write/index.html" bgColor: "" Körper: HTMLBodyElement captureEvents: Funktion captureEvents() { characterSet: "UTF-8" charset: "UTF-8" childNodes: NodeList klar: function clear() { cloneNode: Funktion cloneNode() { in der Nähe: function close() { compareDocumentPosition: Funktion compareDocumentPosition() { compatMode: "BackCompat" cookie: "__gads=ID=62bb88ab20ac9451:T=1256683145:S=ALNI_Mbso-nFjAvRzYhCSwhiuaDh84G8CA" createAttribute: Funktion createAttribute() { createAttributeNS: Funktion createAttributeNS() { createCDATASection: Funktion createCDATASection() { createComment: Funktion createComment() { createDocumentFragment: Funktion createDocumentFragment() { createElement: Funktion createElement() { createElementNS: Funktion createElementNS() { createEntityReference: Funktion createEntityReference() { createEvent: function createEvent() { createExpression: Funktion createExpression() { createNSResolver: Funktion createNSResolver() { createNodeIterator: Funktion createNodeIterator() { createProcessingInstruction: Funktion createProcessingInstruction() { createRange: Funktion createRange() { createTextNode: Funktion createTextNode() { createTreeWalker: Funktion createTreeWalker() { defaultCharset: iso-8859-1" Standardansicht: DOMWindow designMode: "off" re: "" dispatchEvent: function dispatchEvent() { doctype: null documentElement: HTMLHtmlElement documentURI: "http://localhost/projects/test/ajax_loader/document_write/index.html" domain: "localhost" elementFromPoint: Funktion elementFromPoint() { bettet: HTMLCollection bewerten: function auswerten() { execCommand: Funktion execCommand() { fgColor: "" firstChild: HTMLHtmlElement Formen: HTMLCollection getCSSCanvasContext: Funktion getCSSCanvasContext() { getElementById: function getElementById() { getElementsByClassName: Funktion getElementsByClassName() { getElementsByName: Funktion getElementsByName() { getElementsByTagName: function getElementsByTagName() { getElementsByTagNameNS: Funktion getElementsByTagNameNS() { getOverrideStyle: Funktion getOverrideStyle() { getSelection: Funktion getSelection() { hasAttributes: Funktion hasAttributes() { hasChildNodes: Funktion hasChildNodes() { hat_fokus: Funktion hat_fokus() { Höhe: 150 Bilder: HTMLCollection Umsetzung: DOMImplementation importNode: Funktion importNode() { inputEncoding: "UTF-8" insertBefore: function insertBefore() { isDefaultNamespace: Funktion isDefaultNamespace() { isEqualNode: Funktion isEqualNode() { isSameNode: Funktion isSameNode() { isSupported: Funktion isSupported() { jQuery1258269389622: 2 lastChild: HTMLHtmlElement lastModified: "" linkColor: "" links: HTMLCollection localName: null Ort: Lage lookupNamespaceURI: Funktion lookupNamespaceURI() { lookupPrefix: Funktion lookupPrefix() { namespaceURI: null nextSibling: null nodeName: "#document" nodeType: 9 nodeValue: null normalisieren: Funktion normalize() { öffnen: function open() { ownerDocument: null parentElement: null parentNode: null plugins: HTMLCollection preferredStylesheetSet: null Präfix: null previousSibling: null queryCommandEnabled: Funktion queryCommandEnabled() { queryCommandIndeterm: Funktion queryCommandIndeterm() { queryCommandState: Funktion queryCommandState() { queryCommandSupported: Funktion queryCommandSupported() { queryCommandValue: Funktion queryCommandValue() { querySelector: Funktion querySelector() { querySelectorAll: Funktion querySelectorAll() { readyState: "complete" referrer: "http://localhost/projects/test/ajax_loader/document_write/index.html" releaseEvents: Funktion releaseEvents() { removeChild: Funktion removeChild() { removeEventListener: function removeEventListener() { replaceChild: function replaceChild() { Skripte: HTMLCollection selectedStylesheetSet: null styleSheets: StyleSheetList textContent: null Titel: "Seite" vlinkColor: "" Breite: 300 schreiben: function schreiben() { writeln: function writeln() { xmlEncoding: null xmlStandalone: false xmlVersion: null
- Sind Euch irgendwelche Fehler?
- Hi meder - ich bin nicht zu sehen, eventuelle Fehler im Internet Explorer oder Opera. Beide zeigen einfach nur die alert()s in der render () - Funktion, aber nicht alles mit dem Dokument in der <iframe>.
- werfen Sie einen Blick auf: stackoverflow.com/questions/12467151/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht bei mir im IE8. Wenn ich verlieren, der AJAX-Aufruf vollständig und rufen
render()
im main.js bekomme ich das gleiche Ergebnis. In der Tat, auch wenn ich ersetzen Sie die gesamte main.js mit nur:mit oder ohne das Dokument zu öffnen, das Hallo nicht angezeigt wird!
Wenn ich alle timeout (einmal 0), auf den Anruf zu
render
im main.js,, es funktioniert. Der timeout des übergeordneten Dokuments, auf der anderen Seite, scheint es nicht zu sein, etwas zu tun.Diese extreme Verrücktheit ist verursacht durch jQuery mit einem temporär eingefügten
<script>
- tag um den code auszuführen zurückgegeben, indem Sie in jsonp.js. Wenn Sie rufen Sie einfacheval
auf den Rückgabewert, anstatt mit jQuery ausführen, funktioniert es einwandfrei.Einem verwandten problem, das ich gefunden Einengung der hello-Beispiel demonstriert index.html:
mit main.js mit:
Gibt es keine foo geschrieben. (Ein inline-Skript, auf der anderen Seite, war in Ordnung.)
Wenn die
idoc.close
war ausgelassen, es funktionierte. Wenn eine zusätzlicheidoc.write('bar')
wurde Hinzugefügt, derbar
geschrieben wurde, bevorfoo
im IE nur. Wenn ich habe sowohlbar
und dieclose
rufen, IE ist abgestürzt.Also, um zusammenzufassen, es gibt tiefen Probleme, die der mit
document.write
von innen ein Dokument, das wurde selbst geschrieben vondocument.write
! Versuchen Sie zu vermeiden, wenn überhaupt möglich.document.open
können hilfreich sein, um zu füllen ein iframe von einem übergeordneten Dokument, aber Sie sollten nicht wirklich brauchen, es im inneren des Kind-Dokuments, in denen Sie mit DOM-Methoden auf sich selbst.Als die meisten Menschen haben bereits abgedeckt, DH hat ernsthafte Probleme, wenn Sie versuchen, etwas einfaches zu machen wie:
Nach intensiven suchen fand ich diese diese write-up, die nahelegt, die das javascript: - URI-Schema zum einfügen von Inhalt in dem iframe-Dokument. Ich habe persönlich getestet, diese Lösung in den aktuellen Versionen von FF, Chrome & Safari sowie IE 7/8/9/10.
Kreditaufnahme von seinen Beispielen, die folgenden arbeiten würde, statt mein Beispiel oben, und könnte verwendet werden, um zu erreichen, was du nach gehen:
Ich habe gehört, es sagte, dass ältere Versionen von Safari nicht behandeln, das javascript: - URI-Schema sehr gut, aber ich konnte nicht einen Weg finden, um zu bestätigen, wie jeder mit Safari scheint zu aktualisieren, regelmäßig. Ich weiß auch nicht, ob dies wird in den Zeichen-Grenze Probleme, die URI im IE (da es kleiner ist als jeder andere browser), aber es lohnt sich, in für diejenigen von Ihnen leiden unter einem ähnlichen problem.
Das grundlegende problem ist, dass im IE kannst du nicht tun
Einmal dokumentieren.close() aufgerufen wird, auf das iframe, IE scheint halt alles was die Ausführung von javascript gibt. Die js-thread ausgeführt wird, das Dokument.schließen (), während die http-Anfrage für foo.js hervorragend, sodass die Datei wird geladen, aber nie ausgeführt.
Ich habe nicht gefunden, einen Weg, der für die übergeordnete Seite zu wissen, dass das Skript die Ausführung innerhalb des iframe komplett fertig ist. Ein work-around zu machen foo.js verantwortlich für die aufrufende Dokument.close() selbst -- nicht sehr angenehm, aber wenn Sie nichts dagegen haben, ändern des namens script, es funktioniert der trick.
Hinweis: müssen Sie nicht dokumentieren.write('document.close()') in den iframe direkt: , dass Ursachen IE hängen schwer. Aber setTimeout(function(){document.close()}, 0) scheint immun — ebenso wie ein Dokument.schließen() in ein Skript geladen manchmal. Ugh.
Laden Sie den Inhalt des iframe mit der
"src"
Attribut: die Körper von einem iframe wird von Browsern, die keine Unterstützung für dieses display eine alternative Nachricht. Sie sind, stattdessen die Injektion in das iframe einer vollständigen inline -, html-Dokument, und einige Browser werden es nicht mögen.Mehr info hier.
Wenn Sie wollen, um Nachrichten zu senden, um den iframe aus dem Hauptdokument gibt es ein nettes tutorial auf der John Resig ' s blog.
<
und&
Zeichen in der<script>
tag nicht gültiges XHTML, entweder (die</scr
wäre das noch nicht einmal valides HTML!) aber hoffentlich ist das eine aufgebohrte Testfall, reflektiert nicht den realen code 🙂Wäre etwas so einfaches wie:
Ihre Probleme zu lösen? Funktioniert im IE8/Win7.
Das ist Bizarr, und Michael Kleber ist, der Irrt: die Warnungen kommen nur in Ordnung, also das problem ist nicht, dass das Skript nicht ausführen. Es tut ausführen.
Beachten Sie die folgenden änderungen an main.js: