1
votes

Comment changer la couleur du texte dans une zone de texte

J'ai une zone de texte et quand je tape quelque chose, pour certains mots la couleur devrait changer.

Par exemple, si le texte tapé est le suivant: Il est allé au marché acheter une pomme

  1. Le mot "marché" doit devenir vert^
  2. Le mot "pomme" doit devenir rouge^

Voici mon code actuel:

<textarea rows="9" cols="100" id="text" onClick="changeText();"></textarea>
var str = 'market';
var value = str.includes('market');

if (value == str) {
    document.getElementById("text").style.color = "green";
} else {
    document.getElementById("text").style.color = "red";
}


5 commentaires

La zone de texte ne peut pas avoir plusieurs couleurs, je suppose.


comment puis-je réaliser cette idée


Pour être honnête, ce n'est pas possible si facilement. Vous pouvez avoir un

mais cela ne résoudra pas le problème car pour changer de couleur, vous devrez changer le html. Lorsque vous modifiez le code HTML, le curseur démarre automatiquement. La meilleure idée est d'utiliser d'autres iframes.


Pour colorer un mot spécifique à partir de ce texte, vous devez envelopper ce mot avec une balise html. Mais textarea ne prend pas en charge les balises html.


Copie possible de Changer la couleur du texte si la correspondance est trouvée automatiquement JavaScript | HTML


3 Réponses :


1
votes

Vous pouvez styliser le texte dans la zone de texte dans son ensemble, mais comme une zone de texte n'a pas de sous-éléments tels que ou vous ne pouvez pas donner de texte séparé dans cette zone de texte, des styles séparés. d'autre part, si vous aviez un div distinct affichant une copie du texte, vous pourriez dans le fichier innerHTML du div assign Pomme pour remplacer le mot apple dans le .. mais le texte dans la zone de texte resterait inchangé .. éventuellement superposer div au-dessus de la zone de texte mais masqué jusqu'à ce que le texte soit entré dans la zone de texte. Je ne suis pas certain du code précis pour faire cette pièce ou si cela fonctionnerait. mais au moins c'est une chaîne logique viable qui, je l'espère, pourra vous aider à trouver une solution.


0 commentaires

0
votes

Pour colorer un mot spécifique à partir de ce texte, vous devez envelopper ce mot avec une balise html. Mais textarea ne prend pas en charge les balises html.

Vous pouvez le faire en dehors du champ textarea.


0 commentaires

3
votes

Malheureusement, vous ne pouvez pas ajouter de balisage dans une zone de texte , mais voici une idée que vous pouvez prendre comme approche de départ, elle vient de ce lien . L'approche sera basée sur ceci:

L'idée de base est de positionner soigneusement un

derrière la . Ensuite, JavaScript sera utilisé pour copier tout texte saisi dans la vers le
. Un peu plus de JavaScript fera défiler les deux éléments comme un seul. Avec tout parfaitement aligné, nous pouvons ajouter du balisage à l'intérieur du
pour donner des couleurs à certains mots particuliers, et nous allons définir la couleur du texte sur transparent sur la , complétant l'illusion.

Implémentation de base:

<div class="container">
  <div class="backdrop">
    <div class="custom-area">
        <!-- Cloned text with colors will go here -->
    </div>
  </div>
  <textarea id="myTextArea"></textarea>
</div>
.backdrop, #myTextArea {
  font: 12px 'Open Sans', sans-serif;
  letter-spacing: 1px;
  width: 300px;
  height: 100px;
}

#myTextArea {
  margin: 0;
  position: absolute;
  border-radius: 0;
  background-color: transparent;
  color: transparent;
  caret-color: #555555;
  z-index: 2;
  resize: none;
}

.backdrop {
  position: absolute;
  z-index: 1;
  border: 2px solid transparent;
  overflow: auto;
  pointer-events: none;
}

.custom-area {
  white-space: pre-wrap;
  word-wrap: break-word;
}
// Initialization.

const colorMap = {"apple": "red", "market": "green", "banana": "orange"};
let textArea = document.getElementById("myTextArea");
let customArea = document.querySelector(".custom-area");
let backdrop = document.querySelector(".backdrop");

// Event listeners.

textArea.addEventListener("input", function()
{
    customArea.innerHTML = applyColors(textArea.value);
});

textArea.addEventListener("scroll", function()
{
    backdrop.scrollTop = textArea.scrollTop;
});

function applyColors(text)
{
    let re = new RegExp(Object.keys(colorMap).join("|"), "gi");

    return text.replace(re, function(m)
    {
        let c = colorMap[m.toLowerCase()];
        return `<spam style="color:${c}">${m}</spam>`;
    });
}

Notez qu'il ne s'agit que d'une approche de base pour comprendre l'idée sous-jacente. Mais avec un peu de travail dessus, vous pourrez peut-être obtenir une version généralisée. Par exemple, à l'heure actuelle, la zone de texte ne peut pas être redimensionnable. Mais peut-être pouvez-vous détecter cet événement et redéfinir le fond de manière dynamique.


5 commentaires

j'aime votre code mais comment puis-je transmettre plusieurs valeurs {"apple": "red", "market": "green"} je veux passer pomme banane mangue et s'il y a l'espace devrait être accepté comme "market city" ceci toute la ville du marché du mot devrait devenir verte comment y parvenir


@fiker J'ai mis à jour pour lire les mots à colorifier à partir de l'objet color , qui résoudra votre première question. Pour votre deuxième question, vous pouvez peut-être améliorer la génération de l'expression régulière pour qu'elle corresponde toujours à market et au mot suivant. Laissez-moi y réfléchir, et je viendrai avec des mises à jour quand j'aurai plus de temps.


j'aime votre code il suffit de trouver un moyen de faire correspondre deux mots combinés comme "ville du marché" il y a un espace entre deux mots si je tape dans la zone de texte le mot combiné doit être coloré


J'ai une question si je crée un fichier de choix dans ce fichier, le texte est là, quel que soit le mot correspondant doit obtenir de la couleur et doit être affiché dans textarea


@fiker Je ne comprends pas, peux-tu mieux expliquer ce dont tu as besoin? peut-être avec un exemple.