Javascript b在循环中创建的锚定标记上绑定一个onclick函数,并将object作为参数

Javascript b在循环中创建的锚定标记上绑定一个onclick函数,并将object作为参数,javascript,jquery,object,jquery-events,Javascript,Jquery,Object,Jquery Events,我获取了一些JSON数据,并在其中循环,对于每个数据,我都创建了一个锚定标记,并尝试调用一个以object为参数的函数 大概是这样的: $.getJSON('/ui_dashboard/rest/getAlertDefVsAlertValues',function(data) { console.log(data) $("#checkAllAlertsTbody").empty(); var mailServerTbod

我获取了一些JSON数据,并在其中循环,对于每个数据,我都创建了一个锚定标记,并尝试调用一个以object为参数的函数

大概是这样的:

$.getJSON('/ui_dashboard/rest/getAlertDefVsAlertValues',function(data) {    
        console.log(data)
        $("#checkAllAlertsTbody").empty();
        var mailServerTbody="";
        var objData = data.getAlertDefVsAlertValues;
        var objLen = objData.length;
        
        for(var i=0;i<objLen;i++){      
            //one object for all the key in the json 
            var alertWholeObject = {
                    alertFunctionId : objData[i].alertFunctionId,
                    alertMessage : objData[i].alertMessage,
                    definitionName:objData[i].definitionName,
                    emailMessage : objData[i].emailMessage,
                    emailSubject:objData[i].emailSubject,
                    emailTemplate : objData[i].emailTemplate,
                    hubId:objData[i].hubId,
                    id : objData[i].id,
                    isDefinitionEnabled:objData[i].isDefinitionEnabled,
                    mandatoryParam : objData[i].mandatoryParam,
                    scanInterval:objData[i].scanInterval,
                    smsMessage : objData[i].smsMessage,
                    smsTemplateId:objData[i].smsTemplateId,
                    tenantId : objData[i].tenantId,
                    timestamp:objData[i].timestamp,
                    list: objData[i].list,
                    isArray : function(what){
                        return Object.prototype.toString.call(what) === '[object Array]';
                    }
            };
        console.log(alertWholeObject.alertMessage)
            var idWithoutSpace = alertWholeObject.id.replace(/ /g, '');
            //for overview table
                mailServerTbody = '<tr><td>'+(i+1)+'</td><td>'+alertWholeObject.definitionName+'</td><td>'+alertWholeObject.timestamp+'</td><td>'+
                '<div class="controls center">'+
                '<a class="btn btn-info btn-mini"  id="edit_'+idWithoutSpace+'" onclick="editAlertRules(' + alertWholeObject + ');"><i class="icon-edit icon-white">&nbsp;&nbsp;&nbsp;&nbsp;</i></a>'+
                '<a class="btn btn-danger btn-mini" id="delete_'+idWithoutSpace+'" ><i class="icon-trash icon-white">&nbsp;&nbsp;&nbsp;&nbsp;</i></a>'+
                '</div></td></tr>'; 
            $("#checkAllAlertsTbody").append(mailServerTbody);
        }
        
    });
}
$.getJSON('/ui_dashboard/rest/getAlertDefVsAlertValues',函数(数据){
console.log(数据)
$(“#CHECKALLERTBODY”).empty();
var mailServerTbody=“”;
var objData=data.getAlertDefVsAlertValues;
var objLen=objData.length;

对于(var i=0;i使用jQuery绑定到click事件。函数作用域将使正确的alertWholeObject可用于click回调。在将HTML附加到文档后添加此代码

$('#edit_' + idWithoutSpace).click(function () {
    editAlertRules(alertWholeObject);
});

已编辑

对不起,我在这件事上做得太过火了。以下是最新消息:

不要将对象作为参数传递。而是传递索引。声明具有外部作用域(或全局作用域)的对象数组

for
循环中,在当前索引处实例化此数组中的对象:

for (i=0; ....) {
    obj[i] = new Object;
...

}
现在,在指定内联
onclick
时,只需传递索引:

mailServerTbody = "... <a ... onclick='editAlertRules(" + i + ");'" ...</a>.."
检查一下这把小提琴,你就会明白:


希望能有所帮助。

您检查控制台是否有错误吗?未捕获的语法错误:意外标识您的逻辑似乎有缺陷。
onclick=“editAlertRules(“+alertWholeObject+”);”
将只产生字符串文字。此外,一旦锚插入DOM,对象
alertWholeObject
将不再可用!@abhitalks如何解决此问题?在这种情况下,每次最后一个对象作为参数进入函数时。代码必须在循环内(在代码中监督它).Append在循环的末尾并使用DocumentFragment。在循环后将DocumentFragment附加到文档中。在循环后使用文档片段是什么意思?在这种情况下,您也可以用一些示例来说明。即使循环中生成的最后一个对象作为参数,所有的a标记都已单击。@SaurabhSinha我已更新了e回答。对不起,刚才没有提到这一点。好问题是+1。如果我不想使用全局变量,怎么办?如果不使用全局变量,就不能这样做。据说使用全局变量是不好的做法。不一定是全局变量。重要的是,该变量至少应该与函数的作用域相同<代码>编辑警报规则
mailServerTbody = "... <a ... onclick='editAlertRules(" + i + ");'" ...</a>.."
function editAlertRules(index) {

console.log(obj[index]);
...
}