2010-10-22 4 views
1

I ont actuellement un procédé dans lequel il y a unefonction Livesearch avec JSON

<input type="text" id="politician" name="politician" 
onkeyup="showResult(this.value)" value="Enter a politician's name"/> 
tag

. Dans ce même fichier qui inclut la balise d'entrée, il y a un lien vers un fichier javascript externe appelé ajax.js

Le contenu de ce fichier sont les suivantes:

function showResult(str) 
{ 
    if (str.length==0) 
    { 
     document.getElementById("livesearch").innerHTML=""; 
     document.getElementById("livesearch").style.border="0px"; 
     return; 
    } 

    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      document.getElementById("livesearch").innerHTML=xmlhttp.responseText; 
      document.getElementById("livesearch").style.border="1px solid #A5ACB2"; 
     } 
    } 
    xmlhttp.open("GET","livesearch.php?politician="+str,true); 
    xmlhttp.send(); 
} 

Fondamentalement, ce que le fichier javascript fait disons que chaque fois qu'une valeur est insérée dans la zone de texte d'entrée, une requête est envoyée à un fichier php appelé "livesearch.php" qui analyse le contenu d'un document XML codé en dur appelé politicians.xml.

Le fichier livesearch.php est la suivante:

<?php 

//Make sure we have something set before we go doing work 
if (isset($_GET["politician"])){ 

    $q = $_GET["politician"]; 
    if ($q == "") 
     exit(); 

    $xmlDoc = new DOMDocument(); 
    $xmlDoc->load("politicians.xml"); 
    $x=$xmlDoc->getElementsByTagName('Politicians'); 

    $hint = ""; 

    for($i=0; $i<($x->length); $i++) 
    { 
     $y=$x->item($i)->getElementsByTagName('name'); 
     $z=$x->item($i)->getElementsByTagName('url'); 
     $w=$x->item($i)->getElementsByTagName('location'); 
     $v=$x->item($i)->getElementsByTagName('position'); 
     $u=$x->item($i)->getElementsByTagName('photo'); 

     if($y->item(0)->nodeType==1) 
     { 
      //Find a link matching the search text 
      if(stristr($y->item(0)->childNodes->item(0)->nodeValue,$q)) 
      { 
       if($hint != "") 
       { 
        $hint .= "<br />"; 
       } 
       $hint .= "<h1 id='poli'><a id='blue' href='"; 
       $hint .= $z->item(0)->childNodes->item(0)->nodeValue; 
       $hint .= "'>"; 
       $hint .= $y->item(0)->childNodes->item(0)->nodeValue; 
       $hint .= "</a> <br /><a id='green'>"; 
       $hint .= $v->item(0)->childNodes->item(0)->nodeValue; 
       $hint .= "</a><a id='green'>"; 
       $hint .= $w->item(0)->childNodes->item(0)->nodeValue; 
       $hint .= "</a><br/><img width='30' height='40' id='schmidt' src='politicians/"; 
       $hint .= $u->item(0)->childNodes->item(0)->nodeValue; 
       $hint .= ".png' /></h1>"; 
      } 
     } 
    } 
} 

// Set output to "no suggestion" if no hint were found 
// or to the correct values 
if($hint == "") 
    echo "No suggestions"; 
else 
    echo $hint; 
?> 

Un de mes amis m'a dit récemment que JSON est une excellente alternative à XML, car en utilisant JSON va mettre moins de pression sur le serveur car il ne aura pas besoin de Comptez sur PHP pour analyser le contenu du document XML. Le client l'analyserait à la place. Mais, je n'ai pas assez d'expérience avec JSON pour réécrire cette fonction afin qu'elle fonctionne avec un document JSON. Quelqu'un pourrait-il me donner quelques conseils?

Toute aide serait grandement appréciée!

+0

Veuillez mettre en retrait tout le code d'au moins quatre espaces afin qu'il soit plus lisible. – ma11hew28

+0

Vous devez sélectionner les balises HTML comme code si vous voulez qu'elles soient visibles ... –

Répondre

1

OK. J'ai une meilleure idée de ce que tu fais maintenant. Tout d'abord, je recommande d'utiliser MongoDB (ou peut-être même Redis) pour stocker les politiciens, pas un fichier XML. Penses-y. Beaucoup de gens vont faire des recherches. Si vous cherchez et que j'essaie de faire une recherche, je vais devoir attendre que vous ayez fini d'accéder au fichier XML avant de pouvoir le faire. Les bases de données devraient être utilisées à la place des fichiers si de nombreuses personnes accèdent simultanément aux mêmes données. Même si une seule personne est à la recherche, le fichier doit être ouvert & fermé chaque fois que vous tapez quelque chose. Les bases de données sont beaucoup plus rapides pour ce genre de chose, en particulier. MongoDB cause cela se passe tout en RAM. N'oubliez pas de mettre un index sur ce que vous cherchez, dans ce cas, le nom du politicien.

En outre, combien de politiciens y a-t-il? Si c'est moins de 5 000 ou plus, vous pouvez faire ce que Facebook faisait avec vos amis: insérez un tableau JSON de tous les identifiants de vos amis sur le chargement initial de la page. Ainsi, vous pouvez afficher en amont un tableau JSON des noms de tous les politiciens & puis effectuer la recherche en direct sur le client avec JavaScript. Regardez dans jQuery. Si vous envisagez d'utiliser AJAX, je vous recommande d'utiliser jQuery également, car il est plus simple et prend en charge les problèmes de compatibilité avec les navigateurs. (Votre code peut ne pas fonctionner dans certains navigateurs.) Et jQuery est également très utile pour la gestion d'autres événements et la modification du DOM, ce que vous faites également dans votre code. Ainsi, vous pourriez l'utiliser pour beaucoup de choses que vous faites déjà d'une manière plus difficile avec JavaScript. En outre, utilisez MongoDB (consultez MongoHQ pour l'hébergement gratuit). Je pense aussi que vous trouverez Sinatra beaucoup plus facile que PHP, et il est facile d'héberger sur Heroku, et vous pouvez également l'accrocher à MongoDB. Voilà ce que je fais avec acani http://github.com/acani/acani

http://webhole.net/2009/08/31/how-to-read-json-data-with-php/

Scala ou Node.js serait également plus rapide que PHP ou Ruby.

Matt

+0

Merci. J'ai appris comment analyser JSON avec php. Mais, maintenant j'ai besoin d'utiliser PHP pour produire dynamiquement un résultat basé sur ce que l'utilisateur entre dans le champ . –

+0

Par exemple, dans mon fichier JSON, j'ai les noms, les emplacements et les positions de 586 politiciens. Tout est codé en dur. Alors, disons simplement que l'un des noms des politiciens dans mon fichier JSON est Barack Obama. –

+0

Comment faire est que si un utilisateur entre "Bara" ou quelque chose de similaire à celui dans le champ de saisie, qu'il affichera automatiquement le nom de Barack Obama avec son emplacement, la position dans une division juste sous l' tag –

0

php peut retourner un objet JSON en utilisant json_encode écho ($ array). Tout ce dont vous avez besoin est de formater les données en tant que tableau php. L'objet json est accessible en tant que jsonObject ['php_array_keyname']