0

我正在使用带有 ajax 调用的 bootstrap typeahead 来为我的网站创建一种即时搜索。除了 Typeahead 似乎只能处理标题而不是 href 之外,这一切都很好。例子:

我的 PHP 代码是这样的:

$results = mysql_query("MY SELECT QUERY GOES HERE");

$array = array();

while ($row = mysql_fetch_assoc($results)){
    $array[] = $row['title'];
}

echo json_encode($array);

我的 Javascript 在这里:

$('#quickSearch').typeahead({
    source: function (query, process) {

        $.ajax({
            url: "my_php_file.php",
            type: "POST",
            data: 'query=' + query,
            dataType: 'JSON',
            async: true,
            success: function(data){
                  console.log(data)
                  process(data)
            }
        })
    }
});

...一起,这些结果产生了这个 HTML:

<ul class="typeahead dropdown-menu" display: block;">
     <li data-value="Baltimore" class="active">
           <a href="#"><span class="highlighter">B</span>altimore</a>
     </li>
</ul>

process 函数是 Bootstrap 内置的函数,它获取每个结果的标题并用它填充下拉列表。我也希望能够从我的数据库中获取 href,然后下拉列表中的链接将真正起作用,而不仅仅是为了展示。

问题是,如果我写$array[] = array("title"=>$row['title'],"href"=>$row['link']");在我的 PHP 文件中,它会破坏一切,因为大概 process() 无法处理额外的数据。

有没有人有什么建议?关于 Typeahead 的更多信息可以在这里找到:http: //twitter.github.com/bootstrap/javascript.html#typeahead

谢谢

4

2 回答 2

1

您可以对结果使用 JSON 格式并定义一些选项,例如“matcher”、“sorter”、“updater”等:

PHP

$results = mysql_query("MY SELECT QUERY GOES HERE");
$array = array();
while ($row = mysql_fetch_assoc($results)){
    $array[] = array("title"=>$row['title'],"href"=>$row
}
echo json_encode($array);

Javascript:

$('#quickSearch').typeahead({
    source: function (query, process) {

        $.ajax({
            url: "my_php_file.php",
            type: "POST",
            data: 'query=' + query,
            dataType: 'JSON',
            async: true,
            success: function(data){
                       var resultList = data.map(function (item) {
                       var link = { href: item.href, name: item.title };
                       return JSON.stringify(link);
                     });
                return process(resultList);
            }
        })
    },

    matcher: function (obj) {
        var item = JSON.parse(obj);
        return ~item.title.toLowerCase().indexOf(this.query.toLowerCase())
    },

    sorter: function (items) {          
       var beginswith = [], caseSensitive = [], caseInsensitive = [], item;
       while (link = items.shift()) {
            var item = JSON.parse(link);
            if (!item.title.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(JSON.stringify(item));
            else if (~item.name.indexOf(this.query)) caseSensitive.push(JSON.stringify(item));
            else caseInsensitive.push(JSON.stringify(item));
        }

        return beginswith.concat(caseSensitive, caseInsensitive)

    },

    highlighter: function (link) {
        var item = JSON.parse(link);
        var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
        return item.title.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
            return '<strong>' + match + '</strong>'
        })
    },

    updater: function (link) {
        var item = JSON.parse(link);
       $('#quickSearch').attr('href', item.href);
       return item.title;
    }
});
于 2013-02-19T14:43:08.703 回答
1

item.title仅在 ajax 源函数中使用的这个完美脚本的注释。

其余代码应为item.name,如您在以下内容中定义的:

var link = { href: item.href, name: item.title };
于 2015-06-30T19:26:25.273 回答