Javascript 如何将onmousedown事件绘制为存储在数组的某个索引中的值,而不是整个数组调用的值?
如果问题标题有点混乱,很抱歉,但我不确定该如何准确地表达我的问题 我有以下同步ajax调用(其目的是获取json文件内容) 有人告诉我需要结束语,但我无法理解我所看到的任何示例,因为我从未见过以这种方式设置的语法,并且我尝试过的示例不起作用(我将详细说明“不起作用”的含义) 这就是我所尝试的(我用下面显示的这一行替换了上面提到的相关行) 我得到的错误是:Javascript 如何将onmousedown事件绘制为存储在数组的某个索引中的值,而不是整个数组调用的值?,javascript,jquery,html,ajax,json,Javascript,Jquery,Html,Ajax,Json,如果问题标题有点混乱,很抱歉,但我不确定该如何准确地表达我的问题 我有以下同步ajax调用(其目的是获取json文件内容) 有人告诉我需要结束语,但我无法理解我所看到的任何示例,因为我从未见过以这种方式设置的语法,并且我尝试过的示例不起作用(我将详细说明“不起作用”的含义) 这就是我所尝试的(我用下面显示的这一行替换了上面提到的相关行) 我得到的错误是: Uncaught TypeError: Cannot call method 'getElementById' of undefined
Uncaught TypeError: Cannot call method 'getElementById' of undefined
我在原来的问题行以及上面显示的替换行中发现了这个错误
我发现这个自动执行函数非常新,所以我不确定如何继续
对于如何在访问时绘制jsonObj.events[i].title的实际值,而不是直接绘制“jsonObj.events[i].title”,如有任何建议,将不胜感激
我也尝试过(像我一样猜测)valueOf方法,但快速研究表明,它只返回布尔值。问题在于,mousedown事件总是使用for循环中的最后一个索引,您需要使用函数包装for循环,以确保其值得到正确维护
for (var i = 0; i < jsonObj.events.length; ++i) (function(i){
....stuff here
})(i)
for(var i=0;i
将封装循环内代码()与移动到for
内容的组合,以及一些其他更改
请参阅代码中的注释或询问以下内容以了解发生了什么。(我假设#eventBox是一个
)
函数(jsonObj){
对于(var i=0;i
错误来自document.getElementById(“eventBox”).document.getElementById(“title”).innerHTML
根据我的研究,我应该使用它从父页面访问iframe中的元素。这是错误的吗?假定您正在传递相同的源策略,则应使用.contentDocument
(或.contentWindow.document
)访问的文档。@PaulS。我想这也是我无法理解的。当我使用它而不是文档时,它只会产生大量错误。我确信,在理解之前,我必须仔细阅读它。函数是否按照“程序遇到”的方式解决(因为没有更好的方法来表达它)。我正在尝试这个…等等,现在我很困惑。我应该用另一个for循环来包装我的for循环?我试过了,但我不明白。函数关闭后出现的(i)是怎么回事?(i)
意味着函数在定义后立即被调用是的,然后由于函数以val形式获取参数,因此函数内部的i
从此对函数外部的i
的任何更改免疫(例如循环递增)。我在这里通读了您的代码,我必须说,我不认为有什么我真的不理解的。我以前从未使用过contentDocument,但我根据以前的反馈,假设在从父文档访问iframe的元素时,我应该始终使用它,而不是文档。我还假设您的code,整体上应该作为我的“$.ajax”函数中的success函数。是这样吗?@VoidKing“似乎”(function(i)”部分存在于for循环调用和它的第一个开口大括号之间的边缘”,好的,是时候把你所知道的关于JavaScript的一切都从水中吹出来了。你可以省略大括号。在这种情况下,引擎假设一个代码块,直到下一个定界符;
(或者插入它的位置,因为;
也可以省略,但我个人不喜欢这样做).如果您对此不满意,您可以简单地将它们添加回…我想我最好指出,您实际上不能忽略{
和}
无处不在;对象文本需要它们,只有Gecko支持在函数定义中省略它们。不过,你可以在大多数其他事情中省略它们,例如if
,else
,while
,for
,do
,with
。哇!这很有趣。这是我从中学到的另一件事我不介意忽略它们,只要我知道发生了什么。所以,是for循环去掉了两个大括号?^^^哦,我明白了,它在onload函数之后更改了src,onload函数是一个监听器,并且没有得到响应
(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);
Uncaught TypeError: Cannot call method 'getElementById' of undefined
for (var i = 0; i < jsonObj.events.length; ++i) (function(i){
....stuff here
})(i)
function (jsonObj) {
for (var i = 0; i < jsonObj.events.length; ++i) (function (i) { // `i` inside function is protected from outside changes
var cGridMod; // holder to reduce lookups
if (day == jsonObj.events[i].dateNumber
&& (navDate.getMonth() + monthAdjust) == (jsonObj.events[i].dateMonth -1)
&& navDate.getFullYear() == jsonObj.events[i].dateYear) {
cGridMod = document.getElementById("cGrid" + gridMod);
cGridMod.className="eventDay";
cGridMod.onmousedown = function () {
var eventBox = document.getElementById("eventBox"); // holder to reduce lookups
eventBox.onload = function () { // set an onload listener so #document exists at time of execution
eventBox.onload = null; // unset it so it only fires once
eventBox.contentDocument.getElementById("title").innerHTML = (jsonObj.events[i].title);
// using `.contentDocument` to get <iframe> document
};
eventBox.src="/Event htms/Event.htm";
// now set location (done after so onload will fire when loaded)
};
cGridMod.style.backgroundColor = "#336633";
isAnEvent = true;
}
}(i)); // invoke the function for this iteration of the loop; `i`
}