Quelqu'un peut-il m'aider avec une fonction javascript qui peut mettre en évidence du texte sur une page Web. Et l'exigence est de - mettre en évidence une seule fois, pas comme mettre en évidence toutes les occurrences du texte comme nous le faisons en cas de recherche.
javascript
highlighting
Ankit
la source
la source
Réponses:
Vous pouvez utiliser l' effet de surbrillance jquery .
Mais si vous êtes intéressé par le code javascript brut, jetez un œil à ce que j'ai obtenu. Copiez simplement et collez dans un HTML, ouvrez le fichier et cliquez sur "surligner" - cela devrait mettre en évidence le mot "renard". En termes de performances, je pense que cela conviendrait pour un petit texte et une seule répétition (comme vous l'avez spécifié)
Modifications:
En utilisant
replace
Je vois que cette réponse a gagné en popularité, j'ai pensé que je pourrais y ajouter. Vous pouvez également facilement utiliser replace
"the fox jumped over the fence".replace(/fox/,"<span>fox</span>");
Ou pour les occurrences multiples (non pertinentes pour la question, mais qui ont été posées dans les commentaires), vous ajoutez simplement
global
l'expression régulière de remplacement."the fox jumped over the other fox".replace(/fox/g,"<span>fox</span>");
J'espère que cela aidera les commentateurs intrigués.
Remplacement du HTML sur la page Web entière
pour remplacer le HTML d'une page Web entière, vous devez vous référer au
innerHTML
corps du document.document.body.innerHTML
la source
"<span class='highlight'>"
par"<span style='color: " + color + ";'>"
, la couleur devrait être quelque chose commevar color = "#ff0000";
<img src="fox.jpg" />
Vous obtiendriez un code HTML non valide qui ressemblerait à:<img src="<span class='highlight'>fox</span>.jpg" />
Pas bonLes solutions proposées ici sont assez mauvaises.
&
pour &,<
pour <,>
pour>,ä
pour ä,ö
pour öü
pour üß
pour ß, etc.Qu'as tu besoin de faire:
Parcourez le document HTML, trouvez tous les nœuds de texte, obtenez le
textContent
, obtenez la position du texte en surbrillance avecindexOf
(avec un optionneltoLowerCase
s'il doit être insensible à la casse), ajoutez tout ce qui précède enindexof
tant quetextNode
, ajoutez le texte correspondant avec une plage de surbrillance, et répétez pour le reste du noeud de texte (la chaîne de surbrillance peut apparaître plusieurs fois dans latextContent
chaîne).Voici le code pour cela:
Ensuite, vous pouvez l'utiliser comme ceci:
Voici un exemple de document HTML
Au fait, si vous recherchez dans une base de données avec
LIKE
,par exemple
WHERE textField LIKE CONCAT('%', @query, '%')
[ce que vous ne devriez pas faire, vous devriez utiliser la recherche en texte intégral ou Lucene], alors vous pouvez échapper chaque caractère avec \ et ajouter une instruction SQL-escape, de cette façon vous trouverez des caractères spéciaux qui sont des expressions LIKE.par exemple
et la valeur de @query n'est pas
'%completed%'
mais'%\c\o\m\p\l\e\t\e\d%'
(testé, fonctionne avec SQL-Server et PostgreSQL, et tous les autres systèmes SGBDR prenant en charge ESCAPE)
Une version dactylographiée révisée:
Usage:
la source
ä
par exemple sera converti en caractère réel, même lors de l'utilisationinnerHTML
.Pourquoi utiliser une fonction de mise en évidence personnalisée est une mauvaise idée
La raison pour laquelle c'est probablement une mauvaise idée de commencer à créer votre propre fonction de mise en évidence à partir de zéro est que vous rencontrerez certainement des problèmes que d'autres ont déjà résolus. Défis:
innerHTML
)Cela semble compliqué? Si vous voulez certaines fonctionnalités comme ignorer certains éléments de la mise en évidence, le mappage des signes diacritiques, le mappage de synonymes, la recherche dans les iframes, la recherche de mots séparés, etc., cela devient de plus en plus compliqué.
Utiliser un plugin existant
Lorsque vous utilisez un plugin existant et bien implémenté, vous n'avez pas à vous soucier des choses nommées ci-dessus. L'article 10 des plugins de surligneur de texte jQuery sur Sitepoint compare les plugins de surligneur populaires.
Jetez un œil à mark.js
mark.js est un tel plugin qui est écrit en JavaScript pur, mais qui est également disponible en tant que plugin jQuery. Il a été développé pour offrir plus d'opportunités que les autres plugins avec des options pour:
DEMO
Alternativement, vous pouvez voir ce violon .
Exemple d'utilisation :
C'est gratuit et développé en open-source sur GitHub ( référence du projet ).
la source
acrossElements
option. Et au troisième commentaire; mark.js n'est pas grand par rapport aux fonctionnalités qu'il offre. Et non, il est peu probable que quelque chose se brise à l'avenir, car mark.js a été testé, par exemple au démarrage de Chrome 30 et dans toutes les nouvelles versions avec des tests unitaires multi-navigateurs et il n'y a jamais eu de problèmes avec les versions à venir.la source
span.style.backgroundColor = "yellow";
traduit en CSS -style="background-color: yellow;"
cette différence subtile entre le camelCase et la notation en pointillés m'a fait trébucher au début.Voici ma solution JavaScript pure regexp:
la source
one|two|three
>
caractère. Modifiez le regex en utilisant(?!([^<]+)?<)
pour qu'il fonctionne.J'ai le même problème, un tas de texte arrive via une requête xmlhttp. Ce texte est au format html. Je dois souligner chaque occurrence.
Le problème est que je n'ai pas besoin de mettre en évidence le texte des balises. Par exemple, je dois mettre en évidence le renard:
Maintenant, je peux le remplacer par:
Pour répondre à votre question: vous pouvez laisser de côté le g dans les options de regexp et seule la première occurrence sera remplacée mais c'est toujours celle de la propriété img src et détruit la balise image:
C'est ainsi que je l'ai résolu mais je me demandais s'il y avait une meilleure façon, quelque chose que j'ai manqué dans les expressions régulières:
la source
<img src="word">
ni<a href="word">
.Aucune des autres solutions ne correspond vraiment à mes besoins, et bien que la solution de Stefan Steiger ait fonctionné comme je m'y attendais, je l'ai trouvée un peu trop verbeuse.
Voici ma tentative:
Je recommanderais également d'utiliser quelque chose comme escape-string-regexp si vos mots-clés peuvent avoir des caractères spéciaux qui devraient être échappés dans les expressions rationnelles:
la source
Exemple de typeScript simple
REMARQUE: Bien que je sois d'accord avec @Stefan sur de nombreux points, je n'avais besoin que d'une simple mise en évidence de correspondance:
Et puis construire le résultat réel:
la source
Depuis HTML5, vous pouvez utiliser les
<mark></mark>
balises pour mettre du texte en surbrillance. Vous pouvez utiliser javascript pour insérer du texte / mot-clé entre ces balises. Voici un petit exemple de comment marquer et décocher du texte.DÉMO JSFIDDLE
la source
innerHTML
est dangereux. Cela supprimera les événements.Avance rapide jusqu'en 2019, l'API Web prend désormais en charge nativement la mise en évidence des textes:
Et vous êtes prêt à partir!
anchorNode
est le nœud de départ de la sélection,focusNode
est le nœud de fin de sélection. Et, s'ils sont des nœuds de texte,offset
est l'index du caractère de début et de fin dans les nœuds respectifs. Voici la documentationIls ont même une démo en direct
la source
Je me demandais que vous pourriez essayer ce que j'ai appris sur ce post.
J'ai utilisé:
vous pouvez également l'essayer ici: http://henriquedonati.com/projects/Extension/extension.html
xc
la source
Nous si vous souhaitez également qu'il soit mis en évidence lors du chargement de la page, il existe une nouvelle façon.
il suffit d'ajouter
#:~:text=Highlight%20These
essayez d'accéder à ce lien
/programming/38588721#:~:text=Highlight%20a%20text
la source
Utilisation de la méthode surroundContents () sur le type Range . Son seul argument est un élément qui encapsulera cette Range.
la source