我想从服务器通过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);
我做错了什么?
答案 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
});
另一种选择是缓存响应。我个人更喜欢这种方法而不是之前的方法。
您可以在发送第一个请求并缓存数据后使用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
});
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
});
});
});