2012-12-27 1 views
1

J'utilise document.execCommand("unlink", false, false); pour supprimer les liens hypertexte et les ancres dans mon propre éditeur html. Cela fonctionne bien sauf dans un cas: il ne supprime pas les ancres dans Firefox. Est-ce que ce n'est pas supporté dans Firefox ou est-ce qu'il y a une autre manière de résoudre ceci?document.execCommand ('unlink') ne fonctionne pas pour les ancres dans Firefox

Voici mon exemple:

<div contenteditable="true">This is an <a name="anker">anchor</a>. And this is a <a href="#">normal hyperlink</a>. Please try to select them and then press the "Unlink" button.</div> 

<input type="button" id="btn" value="Unlink"> 

$(document).ready(function() {  
    $('#btn').click(function() { 
     document.execCommand("unlink", false, false); 
    }); 
}); 

Check it out on Fiddle

+3

Techniquement, est-ce un lien s'il n'y a pas de 'href'? –

+1

Pourquoi avez-vous toujours le gestionnaire 'onclick' dans l'élément' '? Fait-il quelque chose de différent ou est-ce simplement redondant? Ce n'est pas considéré comme un bon style de toute façon, il vaut mieux utiliser jQuery UNIQUEMENT pour lier les gestionnaires d'événements. – wnstnsmth

+0

Désolé, c'était juste redondant ... J'ai oublié de l'enlever mais maintenant c'est parti. – vso

Répondre

3

Pour répondre à votre question sur quelles alternatives il y a, vous pourriez forcer la question et définir href attribut de tout élément a avant d'appeler unlink:

$(document).ready(function() {  
    var $editable = $('[contenteditable]'); 

    $('#btn').click(function() { 
     $editable.find('a:not([href])').attr('href', '#'); 
     document.execCommand("unlink", false, false); 
    }); 
}); 

http://jsfiddle.net/Bz7pR/7/

Il existe, bien sûr, plusieurs façons de "résoudre" le problème. Je pense que $.unwrap() fonctionnerait probablement aussi bien. Je ne suis pas si versé sur document.execCommand et les éditeurs de texte riche, mais j'imagine que vous devez être prudent, précis et test de test.

Remarque, ce n'est qu'une démonstration; Vous devez vraiment penser à cela et considérer exactement comment vous allez gérer ce problème. Par exemple, vous pouvez détecter et exécuter uniquement si Firefox est le navigateur, ce qui limiterait les dommages inattendus ou les résultats que vous pourriez avoir.

EDIT

Et voici une version plus complète qui affecte uniquement la plage de texte sélectionné:

$(document).ready(function() {  
    $('#btn').click(function unlink() { 
     var holder, 
      frag, 
      range, 
      child; 

     if (window.getSelection && window.getSelection().getRangeAt) { 
      holder = document.createElement('div'); 
      frag = document.createDocumentFragment(); 
      range = window.getSelection().getRangeAt(0); 

      $(holder) 
       .append(range.cloneContents()) 
       .find('a:not([href])') 
       .attr('href', '#'); 

      while ((child = holder.firstChild)) { 
       frag.appendChild(child); 
      } 

      range.deleteContents(); 
      range.insertNode(frag); 
     } 

     document.execCommand("unlink", false, false); 
    });  
}); 

http://jsfiddle.net/Bz7pR/12/

Je ne suis pas le génie en matière de texte gammes et sélections, donc j'ai modifié le code trouvé dans cette réponse:

https://stackoverflow.com/a/6252893/451969

Pour trouver ce qui est ci-dessus. Si quelqu'un voit quelque chose d'incorrect ou d'incohérent, laissez-moi un commentaire ci-dessous.

+0

C'est une bonne idée! Maintenant, il n'y a qu'une seule chose à penser. Je ne souhaite supprimer que les ancres qui se trouvent dans une sélection utilisateur. Votre solution suggérée fournit ceci mais comme un petit effet secondaire toutes les ancres à l'intérieur de cette div obtiennent le href attr. Serait-il possible de ne pas changer le code du texte non sélectionné? Malheureusement, il n'est pas si simple de gérer le texte sélectionné (éditer seulement les éléments inclus) via jQuery. http://jsfiddle.net/Bz7pR/8/ – vso

+0

@vso - Voir mes modifications. Pas tout à fait sûr si cela fonctionnera avec plusieurs sélections. Ce qui précède fonctionne dans IE, Firefox et Chrome, mais pas Opera pour une raison quelconque. –

+0

Merci beaucoup! Le dernier fonctionne bien et est exactement ce dont j'avais besoin - combiné avec une détection de navigateur à exécuter dans Firefox seulement. – vso

Questions connexes