Twitter bootstrap预先填写hrefs

时间:2013-02-19 12:09:21

标签: ajax href bootstrap-typeahead

我正在使用带有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

由于

2 个答案:

答案 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 };