我目前有一个方法,其中有一个
<input type="text" id="politician" name="politician"
onkeyup="showResult(this.value)" value="Enter a politician's name"/>标签。在包含input标记同一文件中,有一个指向名为ajax.js的外部javascript文件的链接
该文件的内容如下:
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文档一起工作。有人能给我一些建议吗?
任何帮助都将不胜感激!
发布于 2010-10-23 08:07:05
好吧。我对你现在在做什么有了更好的了解。首先,我建议使用MongoDB (或者甚至Redis)来存储政客,而不是XML文件。想想看。很多人都会进行搜索。如果您正在搜索,然后我尝试搜索,那么我必须等待您完成对XML文件的访问,然后才能进行搜索。如果许多人同时访问相同的数据,则应该使用数据库而不是文件。即使只有一个人在搜索,每次您键入内容时,文件都必须打开和关闭。对于这类事情,数据库要快得多,尤其是。MongoDB导致这一切都发生在内存中。只需记住在你要搜索的内容上建立一个索引,在这种情况下,就是政治家的名字。
还有,有多少政客?如果小于5,000左右,您可以像Facebook过去对您的朋友所做的那样:在初始页面加载时插入一个包含所有朋友ids的JSON数组。因此,您可以预先输出一个包含所有政客姓名和ids的JSON数组,然后使用JavaScript在客户机上执行所有的生活搜索。调查一下jQuery。http://ejohn.org/blog/jquery-livesearch/
如果您打算使用AJAX,我建议您也使用jQuery,因为它更简单,而且可以为您解决浏览器兼容性问题。(您的代码可能无法在某些浏览器中运行。)对于其他事件处理和修改DOM,jQuery也非常有用,您也可以在代码中这样做。所以,你可以用它来做很多你已经在用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/
Scala或Node.js也会比PHP或Ruby更快。
哑光
发布于 2010-10-23 09:32:59
php可以使用echo json_encode($array)返回json对象。您所需要的就是将数据格式化为php数组。json对象可作为jsonObject“‘php_array_keyname”进行访问
https://stackoverflow.com/questions/4001723
复制相似问题