【问题标题】:Getting undefined when trying to fetch an ID from a data attribute尝试从数据属性中获取 ID 时未定义
【发布时间】:2016-08-31 16:46:45
【问题描述】:

我无法弄清楚为什么我在尝试从下面的代码中尝试 console.outiUsedId 变量时得到未定义。

这里我将用户ID附加到data-iUserId

var aUsers = [];            
            for( var i = 0; i < aUsers.length; i++ ){
                $("#lblUsers").append('<tr><th scope="row">'+aUsers[i].id+'</th><td>'+aUsers[i].username+'</td><td>'+aUsers[i].firstName+'</td><td>'+aUsers[i].lastName+'</td><td>'+aUsers[i].email+'</td><td>'+"<span data-iUserId='"+aUsers[i].id+"'</span><input type='checkbox' id='chk_"+i+"'"+'</td></tr>');
            }

在这里我尝试使用 data 属性中的数据,但在控制台中我得到的只是undefined

$(document).ready(function() {
    $("#remove").on("click", function() {
        $('input:checked').each(function() {
            $(this).closest('tr').remove();
            var iUserId = $(this).attr('data-iUserId');
            console.log(iUserId);
            for (var i = 0; i < aUsers.length; i++) {
                if (iUserId == aUsers[i].iUsersId) {
                    aUsers.splice(i, 1);
                }
            }
        });
    });

});

有什么猜测吗?请帮忙!

【问题讨论】:

标签: javascript jquery html


【解决方案1】:

您正在使用容器删除父级,然后尝试访问该元素。

删除父级应该在最后一步:

$(document).ready(function() {
    $("#remove").on("click", function() {
        $('input:checked').each(function() {
            var iUserId = $(this).closest('span').attr('data-iUserId');
            console.log(iUserId);
            for (var i = 0; i < aUsers.length; i++) {
                if (iUserId == aUsers[i].iUsersId) {
                    aUsers.splice(i, 1);
                }
            }
            $(this).closest('tr').remove();
        });
    });

});

另外,请考虑@pBuch 的评论

【讨论】:

    【解决方案2】:

    原因是您正在遍历复选框,而不是具有您尝试访问的属性的跨度。

    $(this) 指的是复选框,而不是您使用的每个方法中的跨度:

     $('input:checked').each(function() { 
         // Inside this each statement $(this) refers 
         // to the the current 'input:checked' element being accessed
     });
    

    您应该将 data-iUserId 属性放在复选框上,因为您正在访问该元素。

    还有!您缺少开始跨度标记上的结束“>”:

    <span data-iUserId='"+aUsers[i].id+"'</span>
    

    【讨论】:

    • 感谢您的意见!对不起,如果我要求太多,但你能建议如何循环它们,这样我也可以得到 id 吗?我对 JS 和 jquery 有点陌生。
    • 我不知道你为什么需要 span 标签。您只是将 data-iUserId 添加到标签中,但标签本身并未封装任何内容。我认为您可能希望将属性放在输入标签上,这样您就可以在使用 $('input:checked').each(function() { console.log($(this).data('iuserid')); console.log($(this).attr('id')); }); 进行迭代时访问 data-iUserId 属性和 id
    【解决方案3】:
    var aUsers = [];
    //...somehow populate array...
    // We have to assume here that the array got populated 
    for (var i = 0; i < aUsers.length; i++) {
      $("#lblUsers").append('<tr><th scope="row">' + aUsers[i].id + '</th><td>' + aUsers[i].username + '</td><td>' + aUsers[i].firstName + '</td><td>' + aUsers[i].lastName + '</td><td>' + aUsers[i].email + '</td><td>' + "<span data-iUserId='" + aUsers[i].id + "'></span><input type='checkbox' id='chk_" + i + "'" + '</td></tr>');
    }
    
    $(document).ready(function() {
      $("#remove").on("click", function() {
        $("#lblUsers").find('input[type="checkbox"]:checked').each(function() {
          // fixed to get the element with the data
          var iUserId = $(this).siblings('[data-iUserId]').data('iuserid');
          console.log(iUserId);
          for (var i = 0; i < aUsers.length; i++) {
            // bad practice to use a global aUsers
            if (iUserId == aUsers[i].iUsersId) {
              aUsers.splice(i, 1);
            }
          }
          $(this).closest('tr').remove();
        });
      });
    });
    

    【讨论】:

    • 注意:如果有多个具有该属性的兄弟姐妹,这将失败 - 所以不要更改附加的那部分。
    • 注意,如果您使用&lt;span data-i-user-Id= 而不是&lt;span data-iUserId=,您可以使用.data("iUserId") - 可能是我的.data('iUserid') 错误:) 所以我修复了它。我仍然假设该数组已填充。如果您更改它,请将选择器中的 [data-iUserId] 更改为 [data-i-user-id]
    • 顶部也有aUsers[i].id,但后面是aUsers[i].iUsersId...这可能不一致?
    • 非常感谢您的帮助。不幸的是,我仍然不确定......我认为这可能是我的某种方式。我忘记在此处粘贴部分代码,这对于这种情况可能很重要:if(localStorage.sUsers){ var sUsersFromLocalStorage = localStorage.sUsers; aUsers = JSON.parse(sUsersFromLocalStorage); }
    • localStorage.getItem('sUsers'); 也许?假设您使用localStorage.setItem("sUsers", "somestringthing"); 设置它,无论哪种方式,在使用前检查它是否存在...即使您使用localStorage.sUsers="somestringthing"; 这也是有效的...developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多