好的,所以在搜索Stack Overflow的答案后,我找到了两个线程,并尝试了它们,但它们对我不起作用。
将jQuery getJSON中的数据分配给数组
如何使用getJSON从文件中获取JSON数组?
我的问题是,我想使用数据库中的一些数据来创建映射实用程序,但在调用Jquery方法$.getJSON()后,JSON的一些元素会消失。我可以将它们创建为'ul'元素。我无法用我尝试过的任何方法让他们推到数组的数组中。我在这里问,因为我很好奇我做错了什么。我曾想过,我可能必须遍历DOM才能获得填充后的元素,但这对我来说似乎很傻,我想知道是否有更简单的方法。我是javascript和Jquery的新手,但了解编程概念。
我使用的概念是:
-
我有一个SQL Server 2008数据库,其值为:
PlaceID PlaceName 1 Place 1 2 Place 2 3 Place 3 4 Place 4
-
我可以使用"sqlsrv"驱动程序创建一个PHP脚本来获取值并输出
echo json_encode($data);
-
我可以确认我可以在IIS本地返回来自这个PHP脚本的数据。(你必须对IIS进行所有特殊的偷工减料操作,使其像PHP一样)
-
我可以调用php脚本,并使用使用JQuery库2.0.3.js显示它的数据
$.getJSON('SqlTalk.php')
-
我可以用它来填充HTML中的元素,但我无法获得一个数组来与其他对象重用,这正是我真正想要的。最终,我想制作一个完整的javascript,只需从PHP脚本中获取一个数组,然后引用嵌入的javascript或作为映射的引用。然而,从我的阅读来看,$.getJSON似乎是不正常的,但即使是我看到的方法也不适用于我尝试"推送"到现有数组。不过,在混合Jquery和传统javascript时,我可能误解了语法。
完成瓶颈所在的HTML代码。基本上,PHP将返回如步骤1所示的数据,除了作为JSON对象。这是一个简单的例子,让我首先超越概念验证。我可以显式地推送到数组,并且可以很好地生成ul元素的子项。无论我试图根据所读内容重新格式化getJSON方法,我都无法从"getJSON"中推送项目。
<html>
<head>
<script type='text/javascript' src='JQuery 2.0.3.js'></script>
</head>
<body>
<ul></ul>
<script>
test = [
{
PlaceID: "1",
PlaceName: "Somewhere"
}
]
test.push({PlaceID: "2", PlaceName: "SomewhereElse"});
function getArray() {
return $.getJSON('SqlTalk.php')
}
getArray().done(function(json){
$.each(json, function(key, val){
//test[key] = { PlaceID: val.PlaceID}; // doesn't work
test.push({PlaceID: val.PlaceID, PlaceName: val.PlaceName}); // also does not work, can't push.
$('ul').append('<li id="' + key + '">' + val.PlaceName + '</li>');
});
});
alert(test.length);
// So I get my output to the 'ul' element fine, but my test array never gets the values.
//I have tried what others have stated and it does not work.
</script>
</body>
</html>
只有在请求完成后,全局才会更新。
var getArrayPromise = getArray().done(function(json){
$.each(json, function(key, val){
//test[key] = { PlaceID: val.PlaceID}; // doesn't work
test.push({PlaceID: val.PlaceID, PlaceName: val.PlaceName}); // also does not work, can't push.
$('ul').append('<li id="' + key + '">' + val.PlaceName + '</li>');
});
});
getArrayPromise.done(function(){
alert(test.length);
});
没有解决方法,异步请求就是这样工作的。当接收到请求时,时钟一直在滴答作响,代码也一直在执行。
您可能需要在AJAX响应上使用complete
回调
$.ajax({
url: 'SqlTalk.php',
dataType: 'json',
success: function(data){
for (var i = 0; i < data.length; i++) {
test.push({PlaceID: data[i].PlaceID, PlaceName: data[i].PlaceName});
$('ul').append('<li id="' + i + '">' + data[i].PlaceName + '</li>');
}
},
complete: function(){
console.log(test);
}
});
我做了一个快速的小提琴(http://jsfiddle.net/Ar7kX/)来显示完整的回调(使用另一种数据和方式,因为我显然无法访问您的真实数据:),一个更合适的回调,在几分钟内跟踪数组数组(如果我知道如何从jsfiddle收集四方数据)
编辑
在这里,你可以看到一个直接从foursquare中提取的数组http://jsfiddle.net/f38F3/1/(30项),希望这反映了从php脚本中提取数据的相同情况