JQuery recherche dans la page HTML statique avec mise en évidence du mot trouvé

j'ai essayé de faire une recherche simple à l'intérieur d'une page HTML statique en utilisant JQuery. Je dois mentionner que ce n'est que la première fois que je travaille avec JQuery.

j'essaie de changer le fond du mot trouvé dans la page et c'est ce que j'ai essayé jusqu'à présent:

myJavascript.js:

$(document).ready(function(){

     $('#searchfor').keyup(function(){
         page = $('#all_text').text();
         searchedText = $('#searchfor').val();
         $("p:contains('"+searchedText+"')").css("color", "white");
    });
});

Voici le code HTML:

page.html:

<html>
<head>
    <title>Test page</title>
</head>
<body bgcolor="#55c066">
<input type="text" id="searchfor"></input>
    <p id="all_text">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euism modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.
    <font color="red">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tinci futurum.</font>
    </p>
</body>
    <script src="jquery-1.7.2.min.js"></script>
    <script src="myJavascript.js"></script>
</html>

après avoir inspecté la page avec Firebug Je peux voir que les variables dans JQuery obtiennent la valeur à partir du champ d'entrée mais je suppose que je gâche la partie de mise en évidence.

Merci d'avance pour votre aide!

16
demandé sur Radu Gheorghiu 2012-04-04 16:46:26

6 réponses

Faire quelque chose comme ceci

 $("p:contains('"+searchedText+"')").each( function( i, element ) {
      var content = $(element).text();
      content = content.replace( searchedText, '<span class="search-found">' + searchedText + '</span>' );
      element.html( content );
 });

 .search-found {
     text-decoration: underline;
 }

p. S. cela ne fonctionnera que si chacun des "éléments" n'a que du contenu en texte clair sinon il supprimerait les noeuds enfants

EDIT: suppression de l'extra ')'each rappel

11
répondu scibuff 2012-04-04 13:35:14

Pourquoi utiliser une fonction de mise en évidence auto-faite est une mauvaise idée

la raison pour laquelle il est probablement une mauvaise idée de commencer à construire votre propre fonction de mise en évidence à partir de Zéro est parce que vous allez certainement rencontrer des problèmes que d'autres ont déjà résolus. Défis:

  • vous devez supprimer les noeuds de texte avec des éléments HTML pour mettre en évidence vos correspondances sans détruire les événements DOM et déclencher la régénération DOM encore et encore (ce qui serait le cas avec par exemple,innerHTML)
  • si vous voulez supprimer les éléments surlignés, vous devez supprimer les éléments HTML avec leur contenu et aussi combiner les noeuds de texte fragmentés pour des recherches ultérieures. Cela est nécessaire car chaque plugin highlighter recherche des correspondances dans les noeuds de texte et si vos mots-clés sont divisés en plusieurs noeuds de texte, ils ne seront pas trouvés.
  • vous auriez aussi besoin de construire des tests pour s'assurer que votre plugin fonctionne dans les situations que vous avez pas pensé. Et je parle de tests de navigation croisée!

ça a l'air compliqué? Si vous voulez certaines fonctionnalités comme ignorer certains éléments de mise en évidence, cartographie diacritique, cartographie synonymes, recherche à l'intérieur d'iframes, recherche de mots séparés, etc. cela devient de plus en plus compliqué.

utilisez un plugin existant

lorsque vous utilisez un plugin existant, bien implémenté, vous n'avez pas à vous soucier des choses nommées ci-dessus. L'article 10 jQuery sélection de texte plugins on Sitepoint compare popular highlighter plugins. Cela inclut les plugins des réponses à cette question.

regardez marquer.js

marquer.js est un plugin qui est écrit en JavaScript, mais 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:

  • rechercher les mots-clés séparément à la place complet du terme
  • carte de signes diacritiques (Par exemple, si "justo" doit également correspondre "justò")
  • ignore corresponds inside custom elements
  • utiliser l'élément Custom highlighting
  • utiliser la classe custom highlighting
  • carte personnalisée synonymes
  • recherche aussi à l'intérieur iframes
  • recevez pas trouvé termes

DEMO

alternativement vous pouvez voir ce violon.

exemple d'Utilisation:

// Highlight "keyword" in the specified context
$(".context").mark("keyword");

// Highlight the custom regular expression in the specified context
$(".context").markRegExp(/Lorem/gmi);

C'est gratuit et développé en open-source sur GitHub ( référence du projet).

Exemple de marque.mise en évidence des mots-clés js avec votre code

$(function() {
  $("input").on("input.highlight", function() {
    // Determine specified search term
    var searchTerm = $(this).val();
    // Highlight search term inside a specific context
    $("#context").unmark().mark(searchTerm);
  }).trigger("input.highlight").focus();
});
mark {
  background: orange;
  color: black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/mark.js/7.0.0/jquery.mark.min.js"></script>
<input type="text" value="test">
<div id="context">
  Lorem ipsum dolor test sit amet
</div>
19
répondu dude 2016-07-07 16:08:28

Voici la mienne: http://jsfiddle.net/x8rpY/1/

JS:

$('#searchfor').keyup(function(){
         var page = $('#all_text');
         var pageText = page.text().replace("<span>","").replace("</span>");
         var searchedText = $('#searchfor').val();
         var theRegEx = new RegExp("("+searchedText+")", "igm");    
         var newHtml = pageText.replace(theRegEx ,"<span></span>");
         page.html(newHtml);
    });

CSS:

#all_text span
{
    text-decoration:underline;
    background-color:yellow;    
}

fonctionne pour la recherche répétée aussi.

9
répondu mshsayem 2016-04-11 03:19:40

$(function() {
  $("input").on("input.highlight", function() {
    // Determine specified search term
    var searchTerm = $(this).val();
    // Highlight search term inside a specific context
    $("#context").unmark().mark(searchTerm);
  }).trigger("input.highlight").focus();
});
mark {
  background: orange;
  color: black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/mark.js/7.0.0/jquery.mark.min.js"></script>
<input type="text" value="test">
<div id="context">
  Lorem ipsum dolor test sit amet
</div>
3
répondu Rajan 2017-04-20 10:19:41

(pour une chose que vous voulez utiliser la Couleur d'arrière-plan, pas de Couleur, pour le fond)

je créerais une classe css pour normal et une classe CSS distincte (héritée) pour le texte en surbrillance, puis j'utiliserais le JQuery pour changer la classe CSS lorsque vous trouvez ce que vous cherchez.

juste mes premières pensées cependant, pas sûr s'il y a une meilleure façon de le faire.

EDIT: si vous voulez changer seulement un mot spécifique, vous devrez modifier innerHTML pour le mettre dans un marque séparée à ce point.

-1
répondu Oofpez 2012-04-04 12:56:05

voici un autre exemple que j'ai rapidement hacké: http://jsfiddle.net/VCJUX/

-1
répondu alxbrd 2012-04-04 13:19:22