Javascript Jquery自动完成不工作
我的autocomplete不工作,我已经从ajax发出了响应,它是jsonJavascript Jquery自动完成不工作,javascript,jquery,ajax,jquery-ui,jquery-ui-autocomplete,Javascript,Jquery,Ajax,Jquery Ui,Jquery Ui Autocomplete,我的autocomplete不工作,我已经从ajax发出了响应,它是json <script src="../jquery.js" type="text/javascript"></script> <link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" /> <script
<script src="../jquery.js" type="text/javascript"></script>
<link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js" type="text/javascript">
</script>
$(document).ready(function(){
var arr=[];
$.ajax({
type:'POST',
url:'showtags.php',
success:function(res)
{
arr = $.parseJSON( res );
$('#tags').autocomplete({
source:arr
});
}
});
});
$(文档).ready(函数(){
var-arr=[];
$.ajax({
类型:'POST',
url:'showtags.php',
成功:功能(res)
{
arr=$.parseJSON(res);
$(“#标记”)。自动完成({
资料来源:arr
});
}
});
});
我还发现arr不是一个数组,因为javascript中的普通数组在我们发出警报(arr)时显示了它的所有元素,但它表示[Object]
res变量是={“1”:“hello”,“72”:“call you”,“73”:“this is me”}
arr变量是=object{1=“hello”,72=“call you”,73=“this is me”}您必须将autocomplete的构造函数放在ajax调用之后。
像这样:
$(document).ready(function(){
var arr=[];
$.ajax({
type:'POST',
url:'showtags.php',
success:function(res)
{
arr = $.parseJSON( res );
$('#tags').autocomplete({
source:arr
});
}
});
});
您必须在ajax调用的成功处理程序中调用autocomplete的构造函数,如下所示:
$(document).ready(function(){
var arr=[];
$.ajax({
type:'POST',
url:'showtags.php',
success:function(res)
{
arr = $.parseJSON( res );
$('#tags').autocomplete({
source:arr
});
}
});
});
按照您的方式,在发送请求后(在响应到达并填充数组之前),将立即调用构造函数,因此自动完成将使用空数组进行初始化。您的响应中有一个
对象,但您需要一个数组才能使AutoMLETE工作。如果可以访问后端,就必须在那里修复它,否则就必须迭代AJAX的返回值并尝试将对象转换为数组
$a = array("1"=>"one", "3"=>"three");
echo json_encode($a)
// {"1":"one", "3"=>"three"}
// doesn't work for jQuery.autocomplete
$b = array(array("id"=>"1", "label"=>"one"), array("id"=>"3","label"=>"three"));
echo json_encode($b);
// [{"id":1, "label":"one"}, {"id":3, "label":"three"}]
// works for jQuery.autocomplete
arr.push.apply(arr, $.parseJSON( res ));
Javascript不理解PHPs关联
数组的概念,由于JSON是Javascript对象表示法,JSON也不理解它们。当您使用PHPsjson\u encode
时,必须确保您的数组是简单数组(即没有强制数组键),否则您将获得json中的对象而不是数组
$a = array("1"=>"one", "3"=>"three");
echo json_encode($a)
// {"1":"one", "3"=>"three"}
// doesn't work for jQuery.autocomplete
$b = array(array("id"=>"1", "label"=>"one"), array("id"=>"3","label"=>"three"));
echo json_encode($b);
// [{"id":1, "label":"one"}, {"id":3, "label":"three"}]
// works for jQuery.autocomplete
arr.push.apply(arr, $.parseJSON( res ));
您正在经历按值调用(或者至少是javascript使用它的方式)
考虑以下示例:
var arr = [];
var x = {x: arr};
arr = [0,1];
console.log(x.x); // Outputs []
这里发生了什么事?
创建对象x
时,arr
的引用按值传递给对象构造函数。因此,x.x
现在指向我们最初的空数组。
当您现在将arr
设置为另一个值时,您只需用对新数组的引用覆盖对初始数组的引用。因此,arr
现在指向包含[0,1]
的新数组
您可以使用apply解决这个问题(假定res是一个数组)
arr
现在等于res
(假设arr以前为空)
编辑:因为问题是在我回答之后编辑的。这里是原始代码
$(document).ready(function(){
var arr=[];
$.ajax({
type:'POST',
url:'showtags.php',
success:function(res)
{
arr = $.parseJSON( res );
}
});
$('#tags').autocomplete({
source:arr
});
});
试试arr.push($parseJSON(res))@johnsmith仍然不工作您知道这是jQuery UI提供的功能,而不是基本的jQuery,对吗?@n.st是的,先生,我知道,我已经添加了jQuery的cdnUI@johnSmith我尝试了arr.push,然后我发出了警报(arr[1]);,它说未定义,为什么?您必须发现在'res'变量中接收到的内容,并在此处发布'res'变量的内容。我在后端有echo(json_encode($array)),其中$array包含$array[$row[“id:][]=$row[“name”];这就是您的问题所在,javascript不能在数组上使用强制键。请尝试以数组的形式保存对象(数组(“id”=>$row[“id”],“value”=>$row[“name”]),…)
。这样,您的数组是一个简单的数组,在JSON转换时保持为一个数组,而不是转换为对象的“关联”数组。作为旁注,请使用“标签”而不是“值”来实现jquery自动完成。使内容更简单我希望数组类似于$arr[1]=“您好“1和hello将来自数据库,我如何才能做到这一点,我是phpFirst的新手,您应该使用来访问您的数据库。然后,您可以这样做:$arr=$dbh->query(“select ID,VALUE from table;”)->fetchAll()
我真的不明白这是如何应用于这个问题的。