IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Recherche de mot clefs et affichage à l'utilisateur


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier Avatar de julienM38
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Novembre 2017
    Messages : 9
    Par défaut Recherche de mot clefs et affichage à l'utilisateur
    Bonjour à tous,

    J'ouvre ce nouveau topic pour parler des nouvelles techniques de recherche de mots clefs.(str.search() remplaçant le bon vieux window.find()).
    j'aimerais vos conseils pour chercher un string, trouver son élément (ou nœud )et renvoyer sa position pour l'afficher via scrollintoview().
    Étant débutant j'aimerais connaitre les bonnes pratiques sur ces méthodes et les bonnes fonctions qui rempliront ce schéma algorithmique:

    - chercher mot clef
    tant qu'il y a des élément trouvés:
    -trouver sa position
    -trouver son élément
    -afficher son élément

    Pour résumer, j'aimerais faire un window.find() à la mano pour rechercher dans un InnerHTML bien défini dans ma page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var book=document.getElementById("book").innerHTML;
    Le but de tout ceci est de proposé une méthode de recherche efficace à l'internaute
    J'avais aussi penser à créer une liste de liens vers les occurrences trouvés. Qu'en pensez vous?
    J'aimerais vos avis et/ou une liste de méthode au lieu d'un bout de code qui serait moins pédagogique pour moi.

    Merci de votre aide

  2. #2
    Membre régulier Avatar de julienM38
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Novembre 2017
    Messages : 9
    Par défaut suite
    sans réponse aujourd'hui j'ai donc coder. J'ai indexé mes Div représentant mes chapitres. Qu'en pensez vous?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    //recherche de mot clef
    function searchstring(){
     
    var keyword=document.getElementById("search-field").value;
    //scan de toute les div du book = nombre de cahpitre et sous chapitre  
    for (var iter=1;iter<=20;iter++){
        for (var jter=1;jter<=14;jter++){
          iter=iter.toString();
          jter=jter.toString();
          var div=iter+'I'+jter;
         //si la div n'existe pas=sortie 
        if(document.getElementById(div)!=null) {
          var content=document.getElementById(div).innerText;
          var fund=content.search(keyword);
          //si quelque chose trouvé
          if (fund>0){
            //ouverture du chapitre parent
            if (iter.length==1){var parent = div.substring(0,1);}
           else{var parent = div.substring(0,2);}
            dispdiv(parent);
            //ouverture du sous chapitre
           //document.getElementById(div).show();
           alert(parent+'      '+ div +'     '+fund+'     '+iter+' '+jter);  
            //go to position of the display
            //      var position=document.getElementById(div);
            //      position.scrollIntoView();
     
                         }
          }else {break;}
     
          }
          }
      //fin du scan et RAZ
      alert("recherche terminé");
     
    }

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Je ne comprends pas bien l’intérêt, ou alors je n’ai pas compris ce que tu veux faire. Pour moi tu cherches à réinventer la roue ; les navigateurs proposent déjà une fonctionnalité de recherche avec Ctrl+F et la touche F3. Firefox a même une fonction de recherche rapide qui ne cible que les liens quand on appuie sur ' (touche 4).

    Proposer un champ de recherche est utile quand les données ne se trouvent pas sur la page. Ton rôle alors, en tant que développeur, est d’écrire le code qui va interroger le serveur avec le mot-clé saisi.

    Bon, j’ai quand même quelques conseils à propos de ton code :
    string.search est un vieux machin, son utilisation est déconseillée aujourd’hui. Il faut savoir qu’il utilise sous le capot le constructeur RegExp, ce qui permet de faire des recherches par motifs. Par exemple, le motif b.lle trouvera entre autres « belle » et « bulle », et ma(land)?rin trouvera « marin » et « malandrin ».

    Si tu veux utiliser une méthode plus moderne qui repose sur les regexps, construis explicitement une regexp, et utilise sa méthode .test() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var reg = new RegExp(keyword);
    ...
    var fund = reg.test(content); // renvoie true ou false
    if (fund) {
      ...
    Tu peux éventuellement rajouter le flag "i" pour faire des recherches insensibles à la casse, c’est-à-dire qui trouvent indifféremment les majuscules et les minuscules.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reg = new RegExp(keyword, "i");
    Si tu veux simplement faire une recherche de sous-chaînes, ce qui a l’avantage de demander moins de temps de processeur, tu peux utiliser .indexOf() ou la plus récente méthode .includes().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var fund = content.indexOf(keyword); // peut renvoyer -1, comme .search()
    if (fund > 0) {
      ...
    Ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var fund = content.includes(keyword); // renvoie true ou false
    if (fund) {
      ...
    Je ne garantis pas que includes est supportée partout à l’heure actuelle.

    Cette partie peut être reformulée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (iter.length == 1) {
      var parent = div.substring(0, 1);
    } 
    else {
      var parent = div.substring(0, 2);
    }
    Tu fais substring(0, 1) quand iter a une longueur de 1, et substring(0, 2) quand iter a une longueur de 2. Tu peux donc utiliser directement iter.length comme paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var parent = div.substring(0, iter.length);
    Mais vu le nom de la variable parent, peut-être que tu serais intéressé par la propriété parentElement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var parentElement = document.getElementById(div).parentElement;
    var parent = parentElement.id;
    Je reste cohérent avec ta convention de n’utiliser que les id des éléments, même si je pense que ça serait plus pratique d’avoir des références sur les éléments eux-mêmes, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var divElement = document.getElementById(div);
    innerText ne tient pas compte du texte des éléments qui sont invisibles ! Voir textContent § Différences avec innerText. Ça marchera sans doute mieux avec textContent.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre régulier Avatar de julienM38
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Novembre 2017
    Messages : 9
    Par défaut
    Bonjour et merci pour ta réponse. elle m'aide vraiment.
    J'ai oublié de préciser le but de tout ca: c'est un livre interactif où il vas y avoir beaucoup d'informations et je voulais guider au mieux mes utilisateurs.

    Au vu de ton explication je pense utiliser regexp. J'avais entendu parler de ces fonctions mais voulais éviter d'y mettre le nez dedans.(je suis automaticien et développeur en autoformation)

    voila ou j'en suis et tu as raison je cherchai a réinventer la roue. Peux tu STP me conseiller sur la fin de la function:'l'affichage'. scrollintoview? ou simplement focus()? Je galère également pour ouvrir mon accordion qui contient le mot trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    //recherche de mot clef
    function searchstring(){
     
    var keyword=document.getElementById("search-field").value;
    //scan de toute les div du book = nombre de cahpitre et sous chapitre  
    for (var iter=1;iter<=20;iter++){
        for (var jter=1;jter<=14;jter++){
          iter=iter.toString();
          jter=jter.toString();
          var div=iter+'I'+jter;
         //si la div n'existe pas=sortie 
        if(document.getElementById(div)!=null) {
          var content=document.getElementById(div).textContent;
          var reg = new RegExp(keyword, "i");
          var fund = reg.test(content);
          //si quelque chose trouvé
          if (fund==true){
            //ouverture du chapitre parent
            dispdiv(iter);
            //ouverture du sous chapitre
           $('div#accordion-'+iter+'item-'+jter).collapse('show');
            //location.href=("div#accordion-1"+iter+" .item-"+jter);
           alert( div +'     '+fund+'     '+iter+' '+jter);  
            //go to position of the display
            //      var position=document.getElementById(div);
            //      position.scrollIntoView();
     
                         }
          }else {break;}
     
          }
          }
      //fin du scan
      alert("recherche terminé");
     
    }
    Merci de ton aide en tous cas

Discussions similaires

  1. Recherche par mot clef dans une feuille excel.
    Par takamo dans le forum Excel
    Réponses: 12
    Dernier message: 18/06/2008, 14h35
  2. [MySQL] Recherche de mots clefs
    Par _cheval_ dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 23h33
  3. Comment réaliser une recherche par mot clef ?
    Par mouchkar dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/09/2006, 11h48
  4. pblm recherche par mot-clef - mysql_db_query
    Par carelha dans le forum Langage
    Réponses: 8
    Dernier message: 21/06/2006, 17h20
  5. [MySQL] SQL et résultat de recherche par mot clef
    Par carelha dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/04/2006, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo