2010-10-22 40 views
1

我现在有一种方法,其中有一个实况搜索功能与JSON

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

标签。在包括输入的标签相同的文件中,有外部的链接的javascript称为ajax.js

该文件的内容文件中,如下所示:

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(); 
} 

基本上,JavaScript文件做什么就是说,无论何时将值插入到输入文本框中,都会将请求发送到名为“livesearch.php”的php文件,该文件解析名为politicians.xml的硬编码XML文档的内容。

的livesearch.php文件如下:

<?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; 
?> 

我的一个朋友最近告诉我,JSON是XML的一个伟大的选择,因为使用JSON会少放应变的服务器上,因为它不会需要依靠PHP来解析XML文档的内容。客户端会解析它。

但是,我没有足够的JSON经验来重写此函数,以便它可以与JSON文档一起使用。任何人都可以给我一些提示吗?

任何帮助将不胜感激!

+0

请将所有代码缩进至少四个空格,以便更易于阅读。 – ma11hew28 2010-10-22 23:57:32

+0

如果您希望它们可见,您必须选择HTML代码作为代码... – 2010-10-23 00:04:51

回答

1

好的。我现在更好地了解你现在在做什么。首先,我建议使用MongoDB(或者甚至Redis)来存储政客,而不是XML文件。想想看。很多人会做搜索。如果您正在搜索,然后尝试搜索,则必须等待您完成访问XML文件,然后才能完成。如果许多人将同时访问相同的数据,则应该使用数据库而不是文件。即使只有一个人正在搜索,每次键入内容时都必须打开文件&。数据库对于这种事情要快得多,尤其是, MongoDB导致这一切都发生在内存中。只要记住要为您搜索的内容添加索引,在这种情况下,就是政治家的名字。

另外,有多少政客呢?如果它少于5000个,你可以做Facebook用来处理你的朋友的事情:在初始页面加载时插入一个包含所有朋友ID的JSON数组。因此,您可以预先输出所有政治家名称的JSON数组,然后使用JavaScript在客户端上进行全部搜索。看看jQuery。 http://ejohn.org/blog/jquery-livesearch/

如果您打算使用AJAX,我还推荐使用jQuery,因为它更简单并为您处理浏览器兼容性问题。 (您的代码可能无法在某些浏览器中使用。)jQuery对于其他事件处理和修改DOM也非常有帮助,您也可以在代码中执行此操作。所以,你可以用它来做很多你已经用JavaScript来做更困难的事情。另外,使用MongoDB(检查MongoHQ的免费托管)。我也认为你会发现Sinatra比PHP容易得多,并且免费的&容易在Heroku上托管,你也可以将它连接到MongoDB。这就是我与acani http://github.com/acani/acani

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

斯卡拉或Node.js的也将是比PHP和Ruby快做。

马特

+0

谢谢。我已经学会了如何用php解析JSON。但是,现在我需要使用PHP根据用户在“字段中输入的内容动态输出结果。 – 2010-10-23 14:46:40

+0

例如,在我的JSON文件中,我有586名政治家的姓名,地点和职位。这全是硬编码。因此,让我们说我的JSON文件中的政治家的名字之一是巴拉克奥巴马。 – 2010-10-23 14:48:06

+0

我该怎么做,以便如果用户输入“Bara”或类似于输入字段中的内容,它会自动显示Barack Obama的名字以及他的位置,在标签 – 2010-10-23 14:50:25

0

PHP可以返回使用回波json_encode($阵列)JSON对象。您所需要的只是将数据格式化为一个php数组。 json对象可作为jsonObject ['php_array_keyname']