0

質問のタイトルが少しわかりにくい場合は申し訳ありませんが、問題の言い方が正確にわかりません。

次の同期ajax呼び出しがあります(その目的はjsonファイルの内容を取得することです)。

$.ajax({
    url: "/JsonControl/Events.json",
    dataType: 'json',
    async: false,
    success: 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";
                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);}
                document.getElementById("cGrid" + gridMod).style.backgroundColor = "#336633";
                isAnEvent = true;
            }
        }
    }
});

私が抱えている問題は、次の行にあります('$ .ajax({'が1行目である場合は12行目):

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);}

クロージャが必要だと言われましたが、構文がそのように設定されているのを見たことがなく、試した例が機能しないため、見た例の先頭または末尾を作成できません( 「機能しない」の意味について詳しく説明してください)。

これが私が試みたものです(上記の関連行を以下に示すこの行に置き換えました)。

(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 

このエラーは、元の問題の行と、上記の置換行で発生します。

この自己実行関数はかなり新しいものだと思うので、どうすればよいかわかりません。

'jsonObj.events [i] .title'を文字通りプロットする代わりに、アクセス時のjsonObj.events[i].titleの実際の値をプロットする方法に関するアドバイスをいただければ幸いです。

また、valueOfメソッドを試してみましたが(私が推測したように)、簡単な調査により、ブール値の値を返すだけであることがわかりました。

4

2 に答える 2

1

問題は、mousedownイベントが常にforループの最後のインデックスを使用するため、関数を使用してforループをラップし、その値が適切に維持されるようにする必要があるためです。

for (var i = 0; i < jsonObj.events.length; ++i) (function(i){
 ....stuff here

})(i)
于 2013-01-07T22:33:02.240 に答える
1

ループ内のコードをラップすること(Justinによって提案されているように.contentDocument)と<iframe>コンテンツの 移動の組み合わせ、およびその他のいくつかの変更。

何が起こっているのかを理解するには、コード内のコメントを参照するか、以下に質問してください。(私は#eventBoxがであると仮定しています<iframe>

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`
}
于 2013-01-07T23:03:56.027 に答える