我想从服务器获取一些数据并用JavaScript将其写入全局数组。然后在文档就绪中我想使用这个数组来创建一些新元素(选项)。我应该有这个数据的全局数组,因为在第一次加载客户端之后可以使用这个数据修改用户界面。
$(document).ready(function () {
UseAjaxQueryForFillGlobalArray();
MakingInterfaceUsingGlobalArray();
});
但我有奇怪的行为,当我调试页面时,我可以看到 MakingInterfaceUsingGlobalArray 方法首先工作,然后我通过AJAX使用方法 UseAjaxQueryForFillGlobalArray 和我获取数据没有带有加载数据的新界面(html选项)。
如果我喜欢这样:
UseAjaxQueryForFillGlobalArray();
$(document).ready(function () {
MakingInterfaceUsingGlobalArray();
});
然后在Firefox工作正常,但在第一次加载时其他网络浏览器不正确(例如通过链接转到此页面)。但是如果我用F5刷新,我有正确的用户界面,它通过AJAX加载到全局JS数组。
如何解决?也许我使用完全不正确的方式?
在评论后添加:
这是我的ajax功能:
function UseAjaxQueryForFillGlobalArray(){
var curUserId = '<%= Master.CurrentUserDetails.Id %>';
var curLocale = '<%= Master.CurrentLocale %>';
$.ajax({
type: "POST",
url: "/segment.aspx/GetArrayForCF",
data: '{"userId":"' + curUserId + '","curLocale":"' + curLocale + '"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
//here is I doing parse my string from server and fill arrays.
}
});
}
答案 0 :(得分:5)
我认为问题在于你不知道第一个函数何时返回,因为它是异步的。所以你应该只在回调中使用数组
function UseAjaxQueryForFillGlobalArray() {
// make the call
$.post(url, data, function() {
// let's be sure that the dom is ready
$(document).ready(function () {
// use the array
MakingInterfaceUsingGlobalArray();
}
}
}();// invoke the function
答案 1 :(得分:4)
就像从死里复活这篇文章一样,但今天我遇到了同样的问题,jQuery版本大于1.6有这个能力:
https://api.jquery.com/jquery.holdready/
我用过这样的话:
$.holdReady(true);
var remoteJSONContent = null;
$.getJSON("http://www.example.com/remote.json", function(data) {
remoteJSONContent = data;
$.holdReady(false);
});
$(document).ready(function(){
console.log(remoteJSONContent);
});
在没有使用holdReady
的情况下,我得到了null,之后我得到了内容。
对于仍然在寻找答案的人。