【发布时间】:2010-12-16 22:09:48
【问题描述】:
这可能更像是一个范围界定问题。我正在尝试在 $.getJSON 函数中设置 JSON 对象,但我需要能够在回调之外使用该对象。
var jsonIssues = {}; // declare json variable
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// jsonIssues not accessible here
在另一篇文章中提出了类似的问题,并且一致认为我需要对 JSON 对象执行的任何操作都需要在回调函数中完成,并且无法在其他任何地方访问。我真的没有办法在 $.getJSON 回调之外继续访问/操作该 JSON 对象吗?返回变量或设置全局变量怎么样?
如果有任何帮助,我将不胜感激。这似乎不太对...
更新:
尝试将 $.ajax() 异步设置设置为 false,并运行相同的代码,但没有成功。我试过的代码如下:
var jsonIssues = {}; // declare json variable
$.ajax({ async: false });
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// jsonIssues still not accessible here
另外,我有几个回应说全局变量应该可以正常工作。我应该澄清所有这些代码都在$(document).ready(function() { 内。要设置全局变量,我应该在 document.ready 之前声明它吗?因此:
var jsonIssues = {};
$(document).ready(function() {
var jsonIssues = {}; // declare json variable
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// now accessible?
}
我的印象是,在 document.ready 中声明的变量应该可以在 document.ready 的任何部分“全局”访问和修改,包括像 $.getJSON 回调函数这样的子函数。我可能需要阅读 javascript 变量范围,但似乎并不容易实现我想要的。感谢大家的回复。
更新 #2: 根据下面给出的答案,我确实使用了 $.ajax 而不是 .getJSON,并达到了我想要的结果。代码如下:
var jsonIssues = {};
$.ajax({
url: "url",
async: false,
dataType: 'json',
success: function(data) {
jsonIssues = data.Issues;
}
});
// jsonIssues accessible here -- good!!
对我的回答进行了多次跟进(我很感激他们)。我这样做的目的是首先加载一个 JSON 对象,其中包含用户可以从中删除并保存的问题列表。但这是通过页面上的后续交互来完成的,我无法预见用户想要对回调中的 JSON 对象 within 做什么。因此需要在回调完成后使其可访问。有人在这里看到我的逻辑有缺陷吗?说真的,因为可能有一些我没有看到的东西......
另外,我正在阅读 .ajax() jQuery 文档,它说将 async 设置为 false “同步加载数据。在请求处于活动状态时阻止浏览器。最好在以下情况下通过其他方式阻止用户交互同步是必要的。”
有没有人知道在这种情况下我应该如何阻止用户交互?为什么会有这样的担忧?再次感谢所有回复。
【问题讨论】:
-
$(document).ready 只是一个在文档准备好时调用的函数。在设置 Ajax 调用(以及您正在设置的任何其他内容)之后,代码是事件驱动的——在 Ajax 调用发生之前,您的任何代码都不会运行。这就是为什么您将“所有内容”放入回调中的原因。除了回调,您的代码都没有执行。
-
全局可以,但只有在 JSON 发生后才有效。这就是您从回调中访问它的原因。回调可以调用其他函数——如果你担心的话,你不必把所有代码都塞进去。
-
查看我提到的解决方案示例的更新答案。
-
通过在 ajax 调用期间不让他们做任何事情来阻止用户交互。例如,如果您有一些按钮可以让它们对加载的 Ajax 信息执行某些操作,则在加载数据之前不要显示按钮。在极端情况下,在所有内容上添加一个 div 以捕捉点击并显示 ajax 抖动。
-
您的后续问题似乎与您最初的问题大相径庭,值得提出自己的 SO 问题。 (它似乎也很不错。)
标签: javascript jquery variables scope callback