我正在使用带有ajax调用的bootstrap typeahead来创建一种即时搜索我的网站。这一切都很有效,除了Typeahead似乎只能处理标题而不是hrefs。例如:
我的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>
进程函数是内置于Bootstrap中的函数,它获取每个结果的标题并用它填充下拉列表。我希望能够从我的数据库中获取href,然后下拉列表中的链接实际上可以工作,而不仅仅是用于显示。
问题是,如果我在PHP文件中编写$array[] = array("title"=>$row['title'],"href"=>$row['link']");
,它会破坏所有内容,因为可能是process()无法处理其他数据。
有没有人有任何建议?有关Typeahead的更多信息,请访问:http://twitter.github.com/bootstrap/javascript.html#typeahead
由于
答案 0 :(得分: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;
}
});
答案 1 :(得分:1)
One note for this perfect script that item.title used only in ajax source fuction.
The rest of the code should be item.name as you defined in:
var link = { href: item.href, name: item.title };