Pourquoi n'est-ce pas le JavaScript (à l'aide de document.ouvrir et document.écrire) dans Internet Explorer ou Opera?
J'ai désespérément besoin d'un peu d'aide sur ce point.
J'ai créé un <script> qui suit de près, et reproduit le problème de l', l'autre, plus complexe <script> que j'ai écrit ailleurs.
Voici ce qu'il fait:
- crée un <iframe> et l'insère dans un <div> sur la page
- crée et ajoute un document pour que <iframe> qui contient un <script> qui définit un peu de fonctions (y compris une fonction de rappel et une fonction qui charge un externe <script> à l'aide d'AJAX)
- le dernier script externe est juste un appel à la fonction de rappel, qui appelle une fonction qui crée un document et l'ajoute à la <iframe> c'est; cela devrait effectivement remplacer les <script>
Les trois fichiers concernés sont:
- http://troy.onespot.com/static/document_write/index.html (la page principale)
- http://troy.onespot.com/static/document_write/main.js (le premier <script> qui est chargé)
- http://troy.onespot.com/static/document_write/jsonp.js (le <script> chargé par jQuery $.ajax ())
Tout cela fonctionne dans Firefox, Safari et Chrome. Où il se décompose est dans Internet Explorer et Opera. Ce qui se passe est que le render() de la fonction dans main.js s'exécute, et tous les trois alertes sont licenciés, mais le document dans le <iframe> n'est pas remplacé. Je ne peux pas dire ce document est en cours de création ou d'écriture, ou si l'on est.
Si j'ajoute le code de débogage (comme la console.log(document)) au début du render() de la fonction, le travail navigateurs semblent obtenir une poignée sur l'existant <iframe> document et la liste des biens inscrits ci-dessous. Internet Explorer apparaît également trouver un document quelconque. Je ne peux pas dire pourquoi c'est ne pas me laisser écraser.
Pourrait-il être un problème de portée? Peut-être que je suis en utilisant le document.write(), document.open() ou d'un document.close() les méthodes de mal, et Firefox et quelques autres navigateurs sont juste me laisser sortir avec elle?
Un possible indice: si je prends le courage de le render() de la fonction (c'est à dire, il suffit de les placer après le chargement() dans main.js), cela fonctionne très bien. Qui me donne à penser que ce n'est pas la façon dont je suis l'aide de document.open(), etc., mais qu'en quelque sorte, par le temps que le rappel() la fonction est exécutée, l'objet document n'est pas disponible, ou a disparu hors de portée, ou quelque chose comme ça.
Cela m'a totalement perplexe, et c'est pour un très important projet avec une approche de la date limite. Je ne suis pas au-dessus d'un hack ou une solution de contournement si il me fait sortir de cette ornière. Toute aide ou des connaissances serait EXTRÊMEMENT apprécié!
de la console.journal (le)'liste des propriétés du document:
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 la méthode addEventListener: la fonction addEventListener() { adoptNode: fonction adoptNode() { alinkColor: "" tous: HTMLCollection ancres: HTMLCollection appendChild: fonction appendChild() { les applets: HTMLCollection attributs: null baseURI: "http://localhost/projects/test/ajax_loader/document_write/index.html" bgColor: "" corps: HTMLBodyElement captureEvents: fonction captureEvents() { characterSet: "UTF-8" charset": "UTF-8" childNodes: NodeList claire: function effacer() { cloneNode: fonction cloneNode() { à proximité: function fermer() { compareDocumentPosition: fonction compareDocumentPosition() { compatMode: "BackCompat" cookie: "__gads=ID=62bb88ab20ac9451:T=1256683145:S=ALNI_Mbso-nFjAvRzYhCSwhiuaDh84G8CA" createAttribute: fonction createAttribute() { createAttributeNS: fonction createAttributeNS() { createCDATASection: fonction createCDATASection() { createComment: fonction createComment() { createDocumentFragment: fonction createDocumentFragment() { createElement: la fonction createElement() { createElementNS: fonction createElementNS() { createEntityReference: fonction createEntityReference() { createEvent: fonction createEvent() { createExpression: fonction createExpression() { createNSResolver: fonction createNSResolver() { createNodeIterator: fonction createNodeIterator() { createProcessingInstruction: fonction createProcessingInstruction() { createRange: fonction createRange() { createTextNode: fonction createTextNode() { createTreeWalker: fonction createTreeWalker() { defaultCharset: "iso-8859-1" defaultView: DOMWindow designMode: "off" dir: "" dispatchEvent: fonction dispatchEvent() { doctype: null documentElement: HTMLHtmlElement documentURI: "http://localhost/projects/test/ajax_loader/document_write/index.html" domaine: "localhost" elementFromPoint: fonction elementFromPoint() { intègre: HTMLCollection évaluer: la fonction evaluate() { execCommand: fonction execCommand() { fgColor: "" firstChild: HTMLHtmlElement formes: HTMLCollection getCSSCanvasContext: fonction getCSSCanvasContext() { getElementById: la fonction getElementById() { getElementsByClassName: fonction getElementsByClassName() { getElementsByName: fonction getElementsByName() { getElementsByTagName: fonction getElementsByTagName() { getElementsByTagNameNS: fonction getElementsByTagNameNS() { getOverrideStyle: fonction getOverrideStyle() { getSelection: fonction getSelection() { hasAttributes: fonction hasAttributes() { hasChildNodes: fonction hasChildNodes() { possèdefocus: fonction possèdefocus() { hauteur: 150 images: HTMLCollection mise en œuvre: DOMImplementation importNode: fonction importNode() { inputEncoding: "UTF-8" insertBefore: fonction insertBefore() { isDefaultNamespace: fonction isDefaultNamespace() { isEqualNode: fonction isEqualNode() { isSameNode: fonction isSameNode() { isSupported: fonction isSupported() { jQuery1258269389622: 2 lastChild: HTMLHtmlElement lastModified: "" linkColor: "" liens: HTMLCollection localName: null emplacement: emplacement lookupNamespaceURI: fonction lookupNamespaceURI() { lookupPrefix: fonction lookupPrefix() { namespaceURI: null nextSibling: null nodeName: "document#" nodeType: 9 nodeValue: null normaliser: la fonction normalize() { ouvert: la fonction open() { ownerDocument: null parentElement: null parentNode: null plugins: HTMLCollection preferredStylesheetSet: null préfixe: null previousSibling: null queryCommandEnabled: fonction queryCommandEnabled() { queryCommandIndeterm: fonction queryCommandIndeterm() { queryCommandState: fonction queryCommandState() { queryCommandSupported: fonction queryCommandSupported() { queryCommandValue: fonction queryCommandValue() { querySelector: fonction querySelector() { querySelectorAll: fonction querySelectorAll() { readyState: "compléter" référent: "http://localhost/projects/test/ajax_loader/document_write/index.html" releaseEvents: fonction releaseEvents() { removeChild: fonction removeChild() { removeEventListener: fonction removeEventListener() { replaceChild: fonction replaceChild() { scripts: HTMLCollection selectedStylesheetSet: null les feuilles de style: StyleSheetList textContent: null titre: "Page" vlinkColor: "" largeur: 300 écrire: la fonction write() { writeln: fonction writeln() { xmlEncoding: null xmlStandalone: faux xmlVersion: null
Salut meder - je ne suis pas le voir de toute les erreurs dans Internet Explorer ou Opera. À la fois tout simplement l'affichage de l'alerte (le)s dans le render() de la fonction, mais ne pas faire n'importe quoi avec le document dans le <iframe>.
regardez: stackoverflow.com/questions/12467151/...
OriginalL'auteur Bungle | 2009-11-15
Vous devez vous connecter pour publier un commentaire.
N'est pas pour moi dans IE8. Si je perds de l'appel AJAX complètement et il suffit d'appeler
render()
dans main.js, j'obtiens le même résultat. En fait, même si j'ai remplacer l'ensemble de l'main.js avec juste:avec ou sans l'ouverture du document, la bonjour, n'apparaît jamais!
Si je mets tout délai d'attente (même à 0) lors de l'appel à
render
dans main.js, il fonctionne. Le délai d'attente sur le document parent, d'autre part, ne semble pas faire quoi que ce soit.Cette extrême étrangeté est causée par jQuery à l'aide d'un temporairement-inséré
<script>
balise pour exécuter le code retourné par dans jsonp.js. Si vous appelez simplementeval
sur la valeur de retour au lieu d'avoir jQuery exécuter, il fonctionne très bien.Un problème connexe, j'ai trouvé un rétrécissement vers le bas la bonjour, est démontré par l'exemple index.html:
avec main.js contenant:
Il n'y a pas de foo écrit. (Un script en ligne, d'autre part, a été très bien.)
Si le
idoc.close
a été omis, il a travaillé. Si une autreidoc.write('bar')
a été ajouté, lebar
a été écrit avantfoo
dans IE uniquement. Si j'ai ajouté les deuxbar
et laclose
appel, c'est à dire s'est écrasé.Donc, pour résumer, il y a profonde des problèmes à l'aide de
document.write
de l'intérieur d'un document qui a été lui-même écrit pardocument.write
! Essayez de l'éviter si possible.document.open
peut être un moyen utile pour remplir une iframe à partir d'un document parent, mais vous ne devrait pas vraiment être dans le besoin à l'intérieur de l'enfant document, où vous pouvez utiliser les méthodes du DOM sur vous-même.OriginalL'auteur bobince
Comme la plupart des gens ont déjà couvert, c'est à dire qui a de graves problèmes lorsque vous tentez de faire quelque chose de simple comme:
Après une recherche, j'ai trouvé ce cette écriture-up qui suggère d'utiliser du javascript: schéma d'URI pour insérer le contenu dans l'iframe document. J'ai personnellement testé cette solution dans les versions actuelles de FF, Chrome, & Safari, ainsi que IE 7/8/9/10.
Des emprunts auprès de ses exemples, le tableau suivant, le travail à la place de mon exemple ci-dessus, et pourrait être utilisé pour réaliser ce que vous allez après:
Que j'ai entendu il a dit que les anciennes versions de Safari n'est pas gérer le javascript: schéma d'URI, très bien, mais je ne pouvais pas trouver un moyen de confirmer que tout le monde à l'aide de Safari semble pour mettre à niveau régulièrement. Aussi, je ne sais pas si cela va dans la limite de caractères problèmes pour l'URI dans IE (car il est plus petit que tous les autres navigateurs), mais il vaut la peine de regarder dans pour ceux d'entre vous qui souffrent d'un problème similaire.
OriginalL'auteur zaffudo
Le problème fondamental est que dans IE vous ne pouvez pas faire
Une fois le document.close() est appelée sur l'iframe, c'est à dire, semble mettre un terme à tous d'exécution de javascript. La js fil conducteur de ce document.fermer() lors de la requête http pour foo.js est en suspens, de sorte que le fichier est chargé, mais jamais exécuté.
Je n'ai pas trouvé de moyen pour la page parent de savoir que le script en cours d'exécution dans l'iframe est complètement terminé. Un travail est à faire foo.js responsable de l'appel de document.close() lui-même, pas très agréable, mais si vous ne me dérange pas de changer le script appelé, il fait le tour.
Remarque: vous ne devez pas le document.write('document.close()') dans l'iframe directement: que provoque IE accrocher dur. Mais setTimeout(function(){document.close()}, 0) semble immunitaire comme un document.close() à l'intérieur d'un script chargé parfois. Ugh.
OriginalL'auteur
Vous devez charger le contenu de l'iframe avec le
"src"
attribut: le corps d'un iframe est utilisé par les navigateurs qui ne supportent pas d'afficher une alternative message. Vous êtes, au lieu de cela, l'injection dans l'iframe complet, en ligne, le document html et certains navigateurs ne les aime pas.Plus d'infos ici.
Si vous souhaitez envoyer des messages à l'iframe à partir du document principal, il y a un bon tutoriel sur le John Resig blog.
Je ne sais pas le cahier des charges de votre projet, mais si vous n'avez pas besoin d'inclure un document externe pourquoi ne pas simplement ajouter le corps de votre page dans un flotteur élément? Votre page est sérieusement ne respectant pas la norme de sorte que vous serez à la merci des navigateurs de mise en œuvre (dans ces situations, je suis toujours de la chance avec FF mais pas sous IE 😉 ). À partir de w3.org/TR/html4/present/frames.html : "Le contenu de l'élément IFRAME, d'autre part, ne doit être affiché par les agents utilisateurs qui ne prennent pas en charge les cadres ou est configuré pour ne pas afficher les images".
Salut Marco - je ne suis pas sûr de savoir comment ce n'est pas standard, un <iframe> est une fenêtre comme toutes les autres, et je suis tout simplement écrit pour objet de document de la fenêtre. Qui devrait être en standard en l'ajoutant HTML pour la <body> élément. Je ne suis pas à l'ajout de ce texte pour le nœud à l'intérieur de la <iframe> élément qui, je comprends, c'est uniquement utilisée pour afficher un texte alternatif lorsque l' <iframe>s sont désactivé ou n'est pas pris en charge.
Salut, j'ai oublié de mentionner, mais l'iframe n'est pas pris en charge dans la DTD XHTML Strict dans votre page d'exemple.
Ouais, toutes les
<
et&
caractères dans le<script>
balise n'est pas valide XHTML (le</scr
ne serait pas valide en HTML!) mais j'espère que c'est un piraté cas de test qui ne reflète pas le vrai code 🙂OriginalL'auteur Marco Z
Serait quelque chose d'aussi simple que:
Résoudre vos problèmes? Fonctionne avec IE8/Win7.
OriginalL'auteur Sam C
Qui est bizarre, et Michael Kleber est erroné: toutes les alertes viennent juste d'amende, de sorte que le problème n'est pas que le script n'est pas exécuté. Il le fait exécuter.
Observer les modifications suivantes à main.js:
OriginalL'auteur steve