Aujourd'hui, j'ai soudain eu envie de revoir les principes de création d'un éditeur de texte enrichi. J’ai donc commencé à le faire étape par étape sans dire un mot. Parce que j'ai écrit un simple éditeur de texte enrichi il y a un an, j'ai probablement encore quelques impressions. Mais lorsque j'ai exécuté le code que j'ai écrit, j'ai trouvé un problème :
var ifr = document.createElement('iframe');
ifr.width = 300;
ifr.height = 300;
var idoc = ifr.contentDocument || ifr .contentWindow.document;
idoc.designMode = 'on';
idoc.contentEditable = true
idoc.write('');
document.body.appendChild(ifr); > Jetez un œil au code ci-dessus. Avez-vous trouvé des erreurs ?
Je pense que s’il n’y a pas d’enfants qui ont vécu des expériences similaires aux miennes, ils ne pourront probablement pas voir ce qui ne va pas avec ce code. Alors autant aller courir, peut-être que vous découvrirez bientôt le problème.
Laissez-moi vous révéler la réponse ci-dessous :
Ce code lancera une exception d'objet introuvable. Quel objet est introuvable ? L'objet document est introuvable, quoi ? Comment est-il possible que l'objet document soit introuvable ? Bien entendu, cet objet document est l’objet document de l’iframe. Quiconque a créé du texte enrichi sait que vous devez d'abord obtenir l'objet document de l'iframe avant de le rendre modifiable. Mais pourquoi ne pouvons-nous pas obtenir l'objet document ? Je ne serai pas trop prétentieux ici. Laissez-moi parler de mon processus de solution.
Tout d'abord, je suis allé sur Google et j'ai constaté que la façon dont j'avais obtenu le document était correcte. Ensuite, je me suis demandé si c'était Chrome ? Chrome ne prend-il pas en charge ces deux objets ? Je suis donc passé à Firefox. Le résultat est toujours le même. Alors ce qui est sûr, c'est que cela doit être un problème avec votre propre code.
Plus tard, en comparant le code sur Internet, j'ai trouvé que la position de mon appendChild était un peu fausse, je l'ai donc déplacé en avance pour obtenir l'objet document :
ifr.hauteur = 300;
document.body.appendChild(ifr);
var idoc = ifr.contentWindow.document; designMode = 'on';
idoc.contentEditable = true
idoc.write('');
Les résultats se sont bien déroulés. Ensuite, j'ai analysé l'erreur cette fois. En fait, la raison de cette erreur est très simple. Tout le monde sait qu'une iframe contient en fait un autre document, et ce document ne peut avoir un objet document qu'après son initialisation. Et si l'élément iframe n'est pas ajouté à l'arborescence DOM, le document dans l'iframe ne sera pas initialisé. Par conséquent, dans notre code au début, la valeur contentDocument dans la variable ifr que nous avons obtenue est nulle, ce qui signifie que le document dans l'iframe n'a pas été initialisé pour le moment.
En suivant cette ligne, j'ai vérifié l'état d'initialisation des autres nœuds et j'ai constaté qu'en fait, une fois que d'autres nœuds d'éléments seront créés, ils auront leurs propres attributs et méthodes, qu'ils soient ajoutés à l'arborescence DOM ou pas. En d’autres termes, iframe est une valeur aberrante parmi de nombreux nœuds d’éléments.