我遇到了一个问题,我似乎无法解决这个问题,并且由于我在网上找不到此类示例的任何其他示例,因此我(再次)转向了这个优秀的社区。
我不会通过说明该函数(以及许多其他函数)在协同工作时要做的所有事情来使这个问题变得过于复杂,但是,我会说这个函数(eventDayPlotter)会在该月的每一天重复。我不明白以下代码片段中包含的结果。
function eventDayPlotter(day, gridMod, monthAdjust)
{
//Beginning of event day plotting.
isAnEvent = false;
$.getJSON("/JsonControl/Events.json", function (jsonObj)
{
for (var i = 0; i < jsonObj.events.length; ++i)
{
if(day == jsonObj.events[i].dateNumber && (navDate.getMonth() + monthAdjust) == (jsonObj.events[i].dateMonth -1) && navDate.getFullYear() == jsonObj.events[i].dateYear)
{
document.getElementById("cGrid" + gridMod).className="eventDay";
console.log(jsonObj.events[i].title)
document.getElementById("cGrid" + gridMod).onmousedown = function(){document.getElementById("eventBox").src="/Event htms/Event.htm"; document.getElementById("eventBox").document.getElementById("title").innerHTML = jsonObj.events[i].title;}
isAnEvent = true;
}
}
});
if(isAnEvent == true)
{
console.log("true")
}
if(isAnEvent == false)
{
console.log("false")
}
}
console.log 的结果(完整)
33false _main.js:1708
Okmulgee Public Schools County Professional Day _main.js:1696
Okmulgee Public Schools Starts 3rd Quarter _main.js:1696
Okmulgee Public Schools-Closed in Observance of Martin Luther King Jr. Holiday
我确实希望第一个 if 分支执行 3 次,但是,正如您所看到的,一旦诊断 if 分支(带有 console.logs 的分支)位于 $.getJSON 之外函数(一旦它们包含有意义的内容,它们在逻辑上需要在哪里) isAnEvent 始终为 false。我无法理解这一点,因为它无论如何都没有超出范围(据我所知)。
此外,我不希望首先使用 console.log 记录文件中的后面几行(在其他 3 行之前),但似乎该函数正在向后执行?我的意思是,我知道这不可能是真的,但这怎么可能呢?我彻底迷失了......
当在第一个 if 分支内或在其外部(仍在 .getJSON 函数内)测试 isAnEvent 时,其值并不总是应有的值(因为这不是他们逻辑上需要去的地方),但它不是'也不总是 false,但是,一旦超出 .getJSON 函数,它就始终为 false,即使它刚刚变为 true。
显然这里发生了一些我无法理解的事情。
最后,如果不明显的话,有三件事:
1)我可以很好地获取 JSON 数据,并且
2) 如果 json 文件中的任何日期与该日期匹配,第一个 if 分支应该将 isAnEvent 设置为 true。然后,下次调用 eventDayPlotter 时,它应该将 isAnEvent 重置为 false 并以相同的方式测试下一个日期(通过参数传递)。
3)控制台中没有显示任何脚本错误。
如果需要更多信息,请告诉我。
最佳答案
getJSON()
是异步的。这意味着它会在 eventDayPlotter()
完成后的某个时间完成并调用其完成函数。
因此,您只能在完成函数内测试 isAnEvent
的值。您无法在 eventDayPlotter()
末尾测试它的值。
仅供引用,您可以通过在自执行函数闭包中捕获它来修复事件处理程序中的 i
值,如下所示:
function eventDayPlotter(day, gridMod, monthAdjust)
{
//Beginning of event day plotting.
isAnEvent = false;
$.getJSON("/JsonControl/Events.json", function (jsonObj)
{
for (var i = 0; i < jsonObj.events.length; ++i)
{
if(day == jsonObj.events[i].dateNumber && (navDate.getMonth() + monthAdjust) == (jsonObj.events[i].dateMonth -1) && navDate.getFullYear() == jsonObj.events[i].dateYear)
{
document.getElementById("cGrid" + gridMod).className="eventDay";
console.log(jsonObj.events[i].title)
(function(index) {
document.getElementById("cGrid" + gridMod).onmousedown = function(){document.getElementById("eventBox").src="/Event htms/Event.htm"; document.getElementById("eventBox").document.getElementById("title").innerHTML = jsonObj.events[index].title;}
})(i);
isAnEvent = true;
}
}
});
}
关于javascript - 在 $.getJSON 函数中测试 bool 变量时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204029/