我将Object传递给另一个函数,但我得到了`" Obj未定义错误"。我已经提到了http://jsfiddle.net/F6FxB/2/
HTML:
<div class="panel accordion clearfix" id="dispdir">
<script type="text/javascript">
window.onload = function () {
showFolders([{
"folderName": "eod-balance-summary",
"objects": [{
"keyName": "eod-balance-formatted-2014-06-01.csv",
"keyValue": "eod-balance-summary/eod-balance-formatted-2014-06-01.csv"
}],
"childDirs": []
}, {
"folderName": "reconciliation-activity-summary",
"objects": [{
"keyName": "recon-summary-2014-04-01-2014-04-02.csv",
"keyValue": "reconciliation-activity-summary/recon-summary-2014-04-01-2014-04-02.csv"
}],
"childDirs": []
}]);
};
</script>
</div>
JavaScript的:
folderId = 1;
function showFolders(folderList) {
var markup = "";
$("#dispdir").append("<ul>");
for (var i = 0; i < folderList.length; i++) {
var fid = "folder_" + folderId;
markup = "<li id='" + fid + "'>" + folderList[i].folderName + "</li>";
$("#dispdir").append(markup);
$("#" + fid).on("click", function () {
showJson(folderList[i]);
});
folderId += 1;
}
$("#dispdir").append("</ul>");
}
function showJson(Obj) {
alert(Obj.folderName);
}
答案 0 :(得分:2)
由于这一行,showJson(folderList[i]);
i
与folderList.length
具有相同的值。由于在单击元素时执行此行,因此循环已更改i
的值。 JavaScript中的There is no block scop e。由于i
与数组的长度相同,因此folderList[i]
为undefined
。当它传递给showJson
时,Obj
将为undefined
。
要解决此问题,只需使用匿名函数将其包装。
$("#" + fid).on("click",
(function(i){
return function(){
showJson(folderList[i]);
};
})(i)
);
但是在JavaScript 1.7中,有块范围:
for(let i = 0; i < folderList.length; i++){
let j = i;
$("#" + fid).on("click", function(){
showJson(folderList[j]);
});
}
答案 1 :(得分:1)
你不能使用变量&#34; i&#34;在点击功能内。因为当你点击div元素时我终于更新了值,即因为你的数组有2个元素。因此,将数据设置为元素本身,稍后在单击元素时检索此数据。对于Ex:
function showFolders( folderList ) {
$("#dispdir").append("<ul>");
for ( var i = 0; i < folderList.length; i++ ) {
var fid = "folder_"+folderId;
var markup = $("<li id='" + fid + "'>" + folderList[i].folderName + "</li>");
$(markup).attr("metadata",folderList[i].folderName);
$("#dispdir").append(markup);
$(markup).click(function(){
showJson($(this));
});
folderId += 1;
}
$("#dispdir").append("</ul>");
}
function showJson( Obj ) {
alert($(Obj).attr("metadata"));
}