Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将onmousedown事件绘制为存储在数组的某个索引中的值,而不是整个数组调用的值?_Javascript_Jquery_Html_Ajax_Json - Fatal编程技术网

Javascript 如何将onmousedown事件绘制为存储在数组的某个索引中的值,而不是整个数组调用的值?

Javascript 如何将onmousedown事件绘制为存储在数组的某个索引中的值,而不是整个数组调用的值?,javascript,jquery,html,ajax,json,Javascript,Jquery,Html,Ajax,Json,如果问题标题有点混乱,很抱歉,但我不确定该如何准确地表达我的问题 我有以下同步ajax调用(其目的是获取json文件内容) 有人告诉我需要结束语,但我无法理解我所看到的任何示例,因为我从未见过以这种方式设置的语法,并且我尝试过的示例不起作用(我将详细说明“不起作用”的含义) 这就是我所尝试的(我用下面显示的这一行替换了上面提到的相关行) 我得到的错误是: Uncaught TypeError: Cannot call method 'getElementById' of undefined

如果问题标题有点混乱,很抱歉,但我不确定该如何准确地表达我的问题

我有以下同步ajax调用(其目的是获取json文件内容)

有人告诉我需要结束语,但我无法理解我所看到的任何示例,因为我从未见过以这种方式设置的语法,并且我尝试过的示例不起作用(我将详细说明“不起作用”的含义)

这就是我所尝试的(我用下面显示的这一行替换了上面提到的相关行)

我得到的错误是:

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`
}