3 votes

Imiter les suggestions de Google avec AJAX et PHP

Je veux imiter Google suggest avec le code suivant, ce qui signifie :

étape 1 : Lorsque l'utilisateur tape dans le champ de recherche, la chaîne de requête est traitée par un fichier php du serveur et la chaîne de suggestion de requête est renvoyée (à l'aide de l'objet Ajax).

étape 2 : lorsque l'utilisateur clique sur une suggestion de requête, celle-ci s'inscrit dans le champ de recherche (autocomplétion).

L'étape 1 est atteinte, l'étape 2 ne l'est pas. Je pense que le problème réside dans la méthode .click() (j'utilise .live() par la suite, mais cela ne fonctionne toujours pas). Mon intention est d'utiliser .live() ou .click() en liant un événement onclick à l'image créée dynamiquement. <li> élément. Une idée ?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script src="jquery-1.4.2.js">
</script>

<style>
#search,#suggest,ul,li{margin: 0; padding:0; width: 200px;}
ul{ list-style-type: none;}
.border{border: solid red 1px; }
</style>

<p>My first language is:</p>
<input type="text" width="200px" id="search" onkeyup="main(this.value)" value="" />
<ul id="suggest"></ul>

<script type="text/javascript">
$(function main(str)
{  //binding any forthcoming li element click event to a function
$('li').live('click', function(){ $("#search").val(array[i]);});
  //setup Ajax object 
  var request=new XMLHttpRequest();
  request.open("GET","language.php?q="+str,true)
  //core function
  request.onreadystatechange=function()
    {    
  if ( request.readyState==4 && request.status==200)
       {  if (str=="") {$('li').remove(); $('ul').removeClass('border');return;}
      $('li').remove();
      reply=request.responseText.split(",");
         for (i=0;i<reply.length;i++)
         {
          //create HTML element of <li>
         $('#suggest').append($('<li>',{id: 'li'+i, html: reply[i]}));
         //style ul
         $('ul').addClass('border');
              }       
      }
    }
  request.send(); 
})
</script>

PHP :

<?php
$q=$_GET[q];

$a[]='english';
$a[]='chinese';
$a[]='japanese';
$a[]='eeeeee';

//lookup all hints from array if length of q>0
if (strlen($q) > 0)
{
  $hint="";
  for($i=0; $i<count($a); $i++)
  {
    if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))
    {
      if ($hint=="")
      {
        $hint=$a[$i];
      }
      else
      {
        $hint=$hint." , ".$a[$i];
      }
    }
  }
}

// Set output to "no suggestion" if no hint were found
// or to the correct values
if ($hint == "")
{
  $response="no suggestion";
}
else
{
  $response=$hint;
}

//output the response
echo $response;
?>

3voto

Gert Grenander Points 9992

Vous recherchez jQuery Autocomplétion .

2voto

x1a4 Points 14082

Vous avez raison de dire quelle est la ligne qui pose problème. Il vous manque le # pour effectuer une recherche par ID.

$('li'+i).click(function(){ $("#search").html(array[i]);});

devrait être

$('#li'+i).click(function(){ $("#search").html(array[i]);});

Il existe cependant des méthodes beaucoup plus simples qui ne nécessitent pas de réinterroger le document pour y attacher ce gestionnaire. Je suis tout à fait d'accord avec la suggestion d'utiliser un plugin.

2voto

Tim Points 704

Vous pouvez également attendre que l'utilisateur soit inactif. Cela permet d'éviter un trop grand nombre d'allers-retours. Il faudrait donc écrire quelque chose comme

$("input").keyUp(function(e) {
  clearTimeout(updater);
  updater = setTimeout(whenReady, 200);
}

function whenReady() {
  // update the search box here...
}

1voto

Ayaz Alavi Points 2911

J'ai parcouru votre code et j'y ai trouvé quelques problèmes. 1) Si vous voulez lier l'événement click sur des éléments créés dynamiquement, vous devez utiliser le liant événementiel .live('click', function(){}). Cette fonction jQuery liera l'événement click sur le sélecteur qui sera créé plus tard dans le code de manière dynamique. Ainsi, les éléments qui viennent du serveur seront automatiquement liés à l'événement click si vous écrivez l'événement live() sur la fonction document ready. Lire docs .

Voici un exemple de code

<script>
$(function() {
  $("#suggest li").live('click', function() {
    $("#search").val($(this).text()); // li inner html contains text that needs to put into search box
    alert($(this).text()); // or  alert(array[i]); in your code 
    //c what is the out put of above code. better if you change name of an array
  });
});
</script>

De plus, les valeurs des éléments de saisie de texte sont récupérées à l'aide de la fonction .val() au lieu de la fonction .html dans votre code. $("#search").html(array[i]);

regards Ayaz Alavi

-1voto

Rob Points 1247

Si vous voulez que votre application fonctionne correctement, vous devez également envisager de mettre en cache la réponse, en cas de retour arrière par exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X