【问题标题】:Livesearch function with JSON带 JSON 的实时搜索功能
【发布时间】:2010-10-22 23:49:42
【问题描述】:

我目前有一个方法,有一个

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

标签。在包含输入标记的同一个文件中,有一个指向名为 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 文件发送请求,该文件会解析硬编码的 XML 文档的内容,该文件名为 politics.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 文档一起使用。谁能给我一些建议?

任何帮助将不胜感激!

【问题讨论】:

  • 请将所有代码缩进至少四个空格,以便于阅读。
  • 如果你想让它们可见,你必须选择 HTML 标签作为代码......

标签: php javascript xml json


【解决方案1】:

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

另外,有多少政客?如果少于 5,000 个左右,您可以像 Facebook 过去对您的朋友所做的那样:在初始页面加载时插入一个包含所有朋友 id 的 JSON 数组。因此,您可以预先输出一个包含所有政治人物姓名和 ID 的 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/

Scala 或 Node.js 也会比 PHP 或 Ruby 更快。

马特

【讨论】:

  • 谢谢。我已经学会了如何用 php 解析 JSON。但是,现在我有点需要使用 PHP 根据用户在 字段中输入的内容动态输出结果。
  • 例如,在我的 JSON 文件中,我有 586 位政治家的姓名、位置和职位。这都是硬编码的。因此,假设我的 JSON 文件中的一位政治家的名字是巴拉克奥巴马。
  • 我该怎么做,如果用户在输入字段中输入“Bara”或类似的内容,它会自动显示巴拉克奥巴马的名字以及他的位置,在分区右边的位置在 标签下
  • 好的,我有 586 位政治家,我预测随着用户通过表格提交更多姓名,这个数字将会增加。我想我会做 facebook 对 JSON 数组所做的事情并使用 jquery。非常感谢,伙计。
  • np。如果用户要添加更多,则使用数据库作为后端。同样,我强烈建议使用 MongoDB。这就是 Foursquare 正在使用的。您不应该将这些内容存储在文本文件中。另外,我建议将 WebSockets (checkout socket.io) 与 node.js 一起使用,以实现最快的实现。然后,让节点与 mongodb 对话。 PHP 已经死了。
【解决方案2】:

php 可以使用 echo json_encode($array) 返回一个 json 对象。您所需要做的就是将数据格式化为 php 数组。 json 对象可作为 jsonObject['php_array_keyname']

访问

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多