2010-07-09 11 views
1

Je dois déboguer un éditeur HTML basé sur javascript WYSIWYG qui échoue dans IE8. Il est uniquement conçu pour une utilisation dans IE, ce qui devrait simplifier la solution. Voici le code existant qui échoue:Modification de la fonctionnalité de sélection et de plage dans IE8

function isAllowed() { 
    var sel 
    var obj 

     sel = foo.document.selection 

     if (sel.type != "Control") 
     { 
      obj = sel.createRange().parentElement() 
     } else { 
      obj = sel.createRange()(0) 
     } 

     if (obj.isContentEditable) { 
      foo.focus() 
      return true 
     } else { 
      return false 
     } 
} 

Essentiellement ce qui se passe est que si vous sélectionnez un texte et cliquez dire le bouton Insérer une image il se dirige d'abord cette isAllowed fonction pour voir si le texte » ve selected est modifiable (c'est-à-dire dans l'iframe ContentEditable).
Cela semble se décomposer dans IE8 à document.selection ou createRange().

Le problème est que lorsque vous ne sélectionnez aucun texte avec votre souris et cliquez quelque part dans la région modifiable, sel.createRange().parentElement() semble retourner un élément extérieur de l'iframe et il est donc pas contentEditable et la fonction retourne faux. Je me demande si quelqu'un pourrait donner un aperçu de ce qui a changé dans la mise en œuvre des sélections et des plages IE8 qui provoquerait ce comportement?

Répondre

1

Ok, la réponse était assez simple! Ca doit être un changement dans la façon dont IE8 garde le focus sur iframe, en ajoutant foo.focus(); au code ci-dessous, tout fonctionne comme prévu. Espérons que cela aide quelqu'un, mais il ne sera probablement pas si leur code a été écrit correctement en premier lieu :)

function isAllowed() { 
    var sel; 
    var obj; 

     foo.focus(); 
     sel = foo.document.selection; 

     if (sel.type != "Control") 
     { 
      var rng = sel.createRange(); 
      obj = rng.parentElement(); 
     } else { 
      obj = sel.createRange()(0); 
     } 

     if (obj.isContentEditable) { 
      foo.focus(); 
      return true; 
     } else { 
      return false; 
     } 
} 
0

Avez-vous envisagé d'utiliser un débogueur ou de placer des alertes dans le script javscript pour que vous puissiez comprendre ce qui se passe. Déterminez quel élément est retourné et peut-être que vous trouverez votre problème. Il est possible qu'il renvoie un élément parent au lieu de l'iframe (je devine juste ici). Aussi, je ne suis pas sûr de savoir pourquoi il fonctionnerait si seulement ils avaient cliqué dans la zone. Peut-être que j'ai mal compris quelque chose.

+0

Hehe, été déconner avec le débogueur IE8 pendant des heures. Je peux voir ce qui se passe et, fondamentalement, si vous n'avez pas sélectionné autre chose que le curseur dans l'iframe quelque part, getParent() sur la 'selection' renvoie un gros morceau de la page globale. C'est comme si c'était ignorer l'iframe. Peut-être que le problème réside dans le iframe (référencé dans le code avec la variable foo). Je vais creuser plus loin. Qui utilise foo dans le code de production !!! vraiment! (Je n'ai pas écrit le code: D) –

+0

J'espère que vous comprendre. Peut-être que ce qui se passe est quand vous avez cliqué seulement son essayer d'obtenir le parent de l'iframe au lieu du contenu dans l'iframe? – qw3n