2014-05-13 5 views
-1

Je suis en train d'utiliser jquery colorpicker pour changer la couleur du texte du texte sélectionné à partir d'un div.Here est mon codeComment changer la couleur du texte sélectionné à l'aide colorpicker

var colorpickerOptions = { 

    select: function (event, color) { 
    var color_in_hex_format = color.formatted; 
    document.execCommand('foreColor', false, '#'+color_in_hex_format); 
    $('.colorpicker').css('background-color','#'+color_in_hex_format); 
}  

,inline: false 
}; 

$('.colorpicker').colorpicker(colorpickerOptions); 

Mais document.execCommand('foreColor', false, '#'+color_in_hex_format); ne fonctionnait pas quand je choisis un couleur de colorpicker.Why?

Voici le code de démonstration FIDDLE

+0

Raison de downvote? – Shin

+0

Je ne comprends pas pourquoi les gens sont en train de voter cette question, au moins mettre la raison dans le commentaire. –

+0

@ ChankeyPathak Comprenez-vous quelle est ma question? Est-ce pas compréhensible? Je ne sais pas la raison – Shin

Répondre

1

Comme par mozilla documentation about execCommands:

foreColor: 
Changes a font color for the selection or at the insertion point. This requires a color value string to be passed in as a value argument. 

Donc, dans votre code, même si vous sélectionnez quoi que ce soit de la contenteditable, une fois que vous cliquez sur le bouton colorpicker, votre sélection est perdu donc votre execCommand ne fonctionne pas. Vous pouvez vérifier le texte sélectionné en utilisant la console et cela montre qu'aucun texte n'est sélectionné.

Voici le test de code:

var colorpickerOptions = { 
select: function (event, color) { 
    var color_in_hex_format = color.formatted; 
    console.log(window.getSelection().toString());//Checks for selected text 
    //document.execCommand('foreColor', false, '#'+color_in_hex_format); 
    $('[contenteditable]').css('color', '#' + color_in_hex_format); 
    $('.colorpicker').css('background-color', '#' + color_in_hex_format); 
},inline: false 
}; 
$('.colorpicker').colorpicker(colorpickerOptions); 

Ainsi, la solution simple sera soit d'appliquer le color css pour compléter div comme:

$('[contenteditable]').css('color', '#' + color_in_hex_format); 

en remplaçant la ligne execCommand avec ce qui précède ligne. Démo: http://jsfiddle.net/lotusgodkk/6V7hL/144/

PS: Je n'ai pas répondu à votre question.

+0

Merci, mais cela ne fonctionne pas lorsque nous sélectionnons une partie du texte de ce div – Shin

+0

Voilà ce que j'ai dit, juste quand vous cliquez sur le div colorpicker, votre sélection devient zéro, et donc il n'y a pas de "couleur" appliquée sur zéro texte ou –

+0

Qu'est-ce que je fais? une idée? :) – Shin

3

Vous pouvez envelopper le texte sélectionné avec un élément span et ajouter de la couleur à cette durée, vous devez enregistrer le code sélectionné sur mouseup sur la div, puis utiliser .html() pour envelopper le texte avec span.

Obtenir le code texte sélectionnécode from TimDown

function getSelectionHtml() { 
    var html = ""; 
    if (typeof window.getSelection != "undefined") { 
     var sel = window.getSelection(); 
     if (sel.rangeCount) { 
      var container = document.createElement("div"); 
      for (var i = 0, len = sel.rangeCount; i < len; ++i) { 
       container.appendChild(sel.getRangeAt(i).cloneContents()); 
      } 
      html = container.innerHTML; 
     } 
    } else if (typeof document.selection != "undefined") { 
     if (document.selection.type == "Text") { 
      html = document.selection.createRange().htmlText; 
     } 
    } 
    return html; 
} 

Enregistrer le texte sélectionné sur la souris jusqu'à

var selection = ""; 
$('[contenteditable]').on('mouseup',function(){ 
selection = getSelectionHtml(); 

}); 

texte Wrap avec une durée

$('[contenteditable]').html(function(){ 
     return this.textContent.replace(selection,'<span style="color:#'+color_in_hex_format+'">'+selection+'</span>'); 
    }); 

DEMO

Une autre version

Si vous voulez changer la couleur de plus d'une sélection, vous pouvez modifier le code html comme celui-ci

$('[contenteditable]').html(html.replace(selection,'<span style="color:#'+color_in_hex_format+'">'+selection+'</span>')); 

DEMO

+0

avez-vous essayé de changer la couleur du texte au moins 2 fois? La première fois que cela fonctionne, essayez de sélectionner un autre texte, seul le texte sélectionné récemment a une couleur affectée, le dernier texte sélectionné devient normal. –

+0

Oui, j'espérais que c'était la solution attendue, mais je pourrais ajouter un moyen de le faire plus d'une fois @KingKing – Anton

+0

+1 pour la démo mise à jour, mais ce n'est pas si simple, essayez de sélectionner un nouveau texte qui couvre déjà texte coloré, cela ne fonctionnera pas alors. Je pense que c'est le cas le plus compliqué lié à ce problème. –

Questions connexes