Функция LiveSearch с JSON - PullRequest
       7

Функция LiveSearch с JSON

1 голос
/ 23 октября 2010

У меня в настоящее время есть метод, при котором есть тег

<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 говорит о том, что всякий раз, когда значение вставляется во входное текстовое поле, в php-файл с именем «livesearch.php» отправляется запрос, который анализирует содержимое документа в жестком коде XML, называемого politicians.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.Кто-нибудь может дать мне несколько советов?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Хорошо. У меня есть лучшее представление о том, что вы делаете сейчас. Прежде всего, я бы рекомендовал использовать MongoDB (или, возможно, даже Redis) для хранения политик, а не XML-файл. Думаю об этом. Многие люди будут искать. Если вы ищете, а затем я пытаюсь найти, мне придется подождать, пока вы закончите доступ к XML-файлу, прежде чем я смогу. Базы данных должны использоваться вместо файлов, если много людей будут одновременно обращаться к одним и тем же данным. Даже если поиск выполняется только одним человеком, файл должен открываться и закрываться каждый раз, когда вы что-то печатаете. Базы данных гораздо быстрее для такого рода вещей, особенно. MongoDB потому что это происходит все в оперативной памяти. Просто не забудьте указать индекс того, что вы ищете, в данном случае имя политика.

Кроме того, сколько там политиков? Если оно меньше 5000 или около того, вы можете сделать то, что Facebook делал со своими друзьями: вставьте JSON-массив идентификаторов всех ваших друзей при начальной загрузке страницы. Таким образом, вы можете предварительно вывести массив JSON со всеми именами и идентификаторами политиков, а затем выполнить livesearch на клиенте с помощью 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.

Мэтт

0 голосов
/ 23 октября 2010

php может вернуть объект json, используя echo json_encode ($ array).Все, что вам нужно, это отформатировать данные как массив php.Объект json доступен как jsonObject ['php_array_keyname']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...