Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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 得到这个词;扩展;在for-in循环中传递按钮click事件上的键时_Javascript_Json_For Loop - Fatal编程技术网

Javascript 得到这个词;扩展;在for-in循环中传递按钮click事件上的键时

Javascript 得到这个词;扩展;在for-in循环中传递按钮click事件上的键时,javascript,json,for-loop,Javascript,Json,For Loop,我有一个json,看起来像这样: contacts = [{"id":"0001","title":"Mr","name_first":"Bob","name_last":"Edwards","address1":"2 ford road","address2":null,"address3":null,"town":"Bedford","county":"Bedfordshire","postcode":"Mk16hd","telephone1":"01827485999","telephon

我有一个json,看起来像这样:

contacts = [{"id":"0001","title":"Mr","name_first":"Bob","name_last":"Edwards","address1":"2 ford road","address2":null,"address3":null,"town":"Bedford","county":"Bedfordshire","postcode":"Mk16hd","telephone1":"01827485999","telephone2":null,"email":"bob@email.com"},
{"id":"8003","title":"Mr","name_first":"Joe","name_last":"Bloggs","address1":"186 Bath Road","address2":null,"address3":null,"town":null,"county":null,"postcode":null,"telephone1":"01827485648","telephone2":null,"email":"joe@email.com"},
{"id":"R005","title":"Mr","name_first":"Foo","name_last":"Bar","address1":null,"address2":null,"address3":null,"town":null,"county":null,"postcode":null,"telephone1":"01827485647","telephone2":null,"email":"foo@email.com"}];
然后我像这样循环,为每个按钮创建一个按钮:

for (var key in contacts) { 
    if (contacts.hasOwnProperty(key)) {
        var contact = contacts[key];

        var button = document.createElement('button');
        button.innerHTML = '<span class="left-body">Edit</span>';
        button.onclick = function() { editContact(key); return false; };
    }
}

问:这是什么?我如何设置它,以便将每个json项的键输入到
editContact()
函数中?

contacts
是一个数组。如果要循环浏览一个联系人的属性,则必须指定它(例如,使用
联系人[0]
)。如果要循环浏览每个联系人的属性,则必须循环浏览它们:

for (var i=0;i<contacts.length;i++) {
    for(var key in contacts[i])

每次单击按钮时,
editContact
都会使用分配给键的最后一个值调用。假设要保留
键的值,可以执行以下操作:

(function() {
    var currentKey = key;
    button.onclick = function() { editContact(currentKey); return false; };
(());
编辑: 由于您只想在触点之间循环,如果您不必支持IE<9(或可以使用垫片),则可以执行以下操作:

contacts.forEach(函数(元素,索引){
var button=document.createElement('button');
button.innerHTML='Edit';
button.onclick=function(){editContact(index);返回false;};
});

每次单击按钮时,都会使用分配给键的最后一个值调用editContact。 所以它需要保留json行的索引,并将该索引用于进一步的工作

我是按照下面的方式来做的,这样您就可以从json中获取所有密钥

  function addButtons() {

    for ( var key in contacts) {
        if (contacts.hasOwnProperty(key)) {
            var contact = contacts[key];
            var button = document.createElement('button');
            document.body.appendChild(button);
            button.setAttribute('id', key);
            button.innerHTML = '<span class="left-body">Edit</span>';
            button.onclick = function() {
                editContact(this.id);
                return false;
            };
        }
    }
}


function editContact(index) {
    for ( var key in contacts[index]) {
        console.log("Key :" + key+" Value:"+contacts[index][key]);
    }
    return false;
}
函数addButtons(){
用于(var键入触点){
if(contacts.hasOwnProperty(键)){
var触点=触点[键];
var button=document.createElement('button');
document.body.appendChild(按钮);
setAttribute('id',键);
button.innerHTML='Edit';
button.onclick=函数(){
editContact(this.id);
返回false;
};
}
}
}
功能编辑联系人(索引){
用于(var输入联系人[索引]){
日志(“键:+Key+”值:+contacts[index][Key]);
}
返回false;
}
我的html看起来像

  <body onload="addButtons();"> </body>

这是因为关闭

for (var key in contacts) { 
    if (contacts.hasOwnProperty(key)) {
        var contact = contacts[key];

        var button = document.createElement('button');
        button.innerHTML = '<span class="left-body">Edit</span>';
        button.onclick = (function(key){
            return function() { editContact(key); return false; };
        })(key);
    }
}
用于(var键入触点){
if(contacts.hasOwnProperty(键)){
var触点=触点[键];
var button=document.createElement('button');
button.innerHTML='Edit';
button.onclick=(函数(键){
返回函数(){editContact(key);返回false;};
})(关键);
}
}

演示:

否,我只想为每个联系人创建一个按钮,因此在本例中只有3个按钮。我想你已经一针见血了,按钮上的每个点击事件都会被分配到循环中的最后一个关键点。这是我的主要问题。我明白了。但是使用传统的for循环更好(也更安全):
for(var index=0;indexOk cool,如果这真的是更安全的选项,我将使用传统循环。如何克服将当前“index”指定为参数editContact(index)的问题在onclick事件上?如果你不需要支持IE<9,你甚至可以使用它,这样你的代码就更短了,你就不会有“最后分配”的问题。嗯,是的,我确实需要让它工作,但有几个问题。据我所知(我被建议)元素的id不能是唯一的数字。另外,(这仅与我的示例有关)我为每个联系人都提供了“删除”按钮。如果我为“删除”按钮提供相同的id,则会使HTML无效。现在您可以为json获取键和值。使用此代码控制台.log(“键:“+键+”值:“+contacts[index][key]”);仅供参考,
contacts
是一个数组,而不是JSON。即使您最初将数据作为JSON获取,然后对其进行解析,您的问题与JSON无关。太棒了!非常感谢。
  function addButtons() {

    for ( var key in contacts) {
        if (contacts.hasOwnProperty(key)) {
            var contact = contacts[key];
            var button = document.createElement('button');
            document.body.appendChild(button);
            button.setAttribute('id', key);
            button.innerHTML = '<span class="left-body">Edit</span>';
            button.onclick = function() {
                editContact(this.id);
                return false;
            };
        }
    }
}


function editContact(index) {
    for ( var key in contacts[index]) {
        console.log("Key :" + key+" Value:"+contacts[index][key]);
    }
    return false;
}
  <body onload="addButtons();"> </body>
for (var key in contacts) { 
    if (contacts.hasOwnProperty(key)) {
        var contact = contacts[key];

        var button = document.createElement('button');
        button.innerHTML = '<span class="left-body">Edit</span>';
        button.onclick = (function(key){
            return function() { editContact(key); return false; };
        })(key);
    }
}