Bootstrap typeahead autocomplete,在页面加载时仅加载一次源

时间:2012-12-26 23:43:55

标签: javascript jquery twitter-bootstrap bootstrap-typeahead

我想从服务器通过jquery加载整个源数据,但只在pageload上加载一次。我想将它存储在变量中。 jquery部分可以工作,但输入不会自动完成。它什么都不做。它只有在源代码来源时才有效:[“blablabla”,“dadadada”]。

这是我的Javascript代码:

var datasource;          // this is the variable where my source will be stored

$.post("typeahead.php",
  {
    query: 'query'       // 'query' has no meaning ;)
  }, 
  function(data) {       // data looks like ["asd","fds"] thanks to json_encode on the server side
    datasource = data;
});

$('#searchInput').typeahead( {
  source: datasource
});

服务器端php代码:

    /* connect to the db */
    $con = mysql_connect("localhost","fahrschulesql1","******");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }
    // Select Database
    $db_selected = mysql_select_db("fahrschulesql1", $con);
    if (!$db_selected) {
        die ("Select DB error: " . mysql_error());
    }
    $query = "SELECT Vorname, Nachname FROM Benutzer b, Fahrlehrer f WHERE b.BenutzerID = f.BenutzerID";
    $result = mysql_query($query) or die ("MySQL-Error: " . mysql_error());
    while($row = mysql_fetch_array($result)){
        $array[] = $row["Vorname"] . " " . $row["Nachname"]; 
    }
    echo json_encode($array);
    mysql_close($con);

我做错了什么?

2 个答案:

答案 0 :(得分:3)

通过分配新数组,您将丢失对数组datasource的引用。您需要操作数组以避免丢失对它的引用。

var datasource = [];

$.post("typeahead.php", {
    query: 'query'
}, function(data) {
    /* Add the responses to the datasource, don't mess up the reference */
    [].push.apply(datasource, data);
});

$('#searchInput').typeahead({
    source: datasource
});

See it here.


另一种选择是缓存响应。我个人更喜欢这种方法而不是之前的方法。

您可以在发送第一个请求并缓存数据后使用process回调。然后,使用缓存的数据。

var cachedsource = (function(){
    var datasource = null;
    return function(query, process){
        if(datasource !== null) {
            /* use cached data */
            return datasource;
        } else {
            $.post("typeahead.php", {
                query: 'query'
            }, function(data) {
                /* cache data */
                datasource = data;
                process(datasource);
            });
        }
    };
})();

$('#searchInput').typeahead({
    source: cachedsource
});

See it here.


PHP返回错误的Content-Type。请尝试使用$.ajax代替$.post

$.ajax({
  url: "typeahead.php", 
  data: {
    query: 'query'
  },
  success: function(data) {
    /* cache data */
    datasource = data;
    process(datasource);
  },
  dataType: "json"
});

请注意dataType设置为json

您还可以使用header()在PHP中设置正确的Content-Type

header('Content-Type: application/json');
echo json_encode($array);

答案 1 :(得分:0)

你的HTML代码在哪里?

你正在使用这个:

<input id="searchInput" type="text" data-provide="typeahead">

然后确保你的回调在firebug中没问题并且返回数据因为你没有在这里指定任何url:

$.post("typeahead.php",

然后确保你在document.ready

中运行你的js
$(document).ready(function(){

//do my js
});

也尝试:

在将var传递给bootstrap插件之前

console.log(datasource);

一定要试试这个:

$(function(){

$.post("typeahead.php",
  {
    query: 'query'       // 'query' has no meaning ;)
  }, 
  function(data) {       // data looks like ["asd","fds"] thanks to json_encode on the server side
    $('#searchInput').typeahead( {
  source: data
});
});

});