You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery动态赋值元素val属性异常及AJAX添加列表项问题求助

问题描述

我通过AJAX向#exercise-checkbox-list动态添加列表元素,后端逻辑正常。首次添加练习时一切正常,但第二次添加时,新练习对应的<a href='#' val='user_exercise_id' class='fa fa-times'>标签的val属性会变为首个添加元素的val值。排查后发现,问题出在使用jQuery('#exercise-times-button').attr('val', user_exercise_id)赋值时,所有练习的删除按钮共用了同一个id,导致每次修改的都是首个元素的val。相关AJAX代码如下:

jQuery.ajax({ 
  url: '/ajax/add_exercise/', 
  dataType: 'json', 
  data: { 
    'exercise_type': 0, 
    'exercise_id': exercise_id, 
    'duration': duration, 
    'daily_person_id': daily_person_id, 
    'daily_exercise_program_id': daily_exercise_program_id, 
    'csrfmiddlewaretoken': '{{ csrf_token }}', 
  }, 
  type: 'POST', 
  success: function (data) { 
    user_exercise_id = data.user_exercise_id; 
    console.log(user_exercise_id); 
    jQuery("#exercise-checkbox-list").append('<li> <label> <span><strong>' + exercise_name + "| " + duration + " min" + " | " + how_many_calorie_burn + " cal burned" + '<strong></span>\n <a href=\'#\'\n' + ' class="fa fa-pencil"></a>\n' + ' <a href=\'#\' val="user_exercise_id" class="fa fa-times"></a> </label> </li>'); 
    jQuery('#exercise-times-button').attr('val', user_exercise_id); 
  } 
});

解决方案

这个问题的核心是HTML中id必须唯一,你所有动态生成的删除按钮共用了同一个exercise-times-button id,导致jQuery的$('#exercise-times-button')只会选中页面上第一个匹配该id的元素,所以每次添加新练习时,都在修改第一个删除按钮的val,而不是当前新生成的那个。

解决方法很简单,直接在动态生成HTML的时候,就把正确的user_exercise_id赋值给当前的删除按钮,不需要事后通过id去查找修改:

步骤1:修改append的HTML代码

把原来固定写死的val="user_exercise_id"改成动态拼接变量值:

jQuery("#exercise-checkbox-list").append('<li> <label> <span><strong>' + exercise_name + "| " + duration + " min" + " | " + how_many_calorie_burn + " cal burned" + '</strong></span>\n <a href=\'#\' class="fa fa-pencil"></a>\n <a href=\'#\' val="' + user_exercise_id + '" class="fa fa-times"></a> </label> </li>');

步骤2:删除无效的id赋值代码

直接删掉这句只会修改第一个元素的代码:

// 删掉这行,不再需要
jQuery('#exercise-times-button').attr('val', user_exercise_id);

(可选)更规范的做法:使用data属性

HTML里不建议用自定义的val属性,更标准的方式是用data-*属性来存储自定义数据,比如:

// 生成元素时用data属性
jQuery("#exercise-checkbox-list").append('<li> <label> <span><strong>' + exercise_name + "| " + duration + " min" + " | " + how_many_calorie_burn + " cal burned" + '</strong></span>\n <a href=\'#\' class="fa fa-pencil"></a>\n <a href=\'#\' data-user-exercise-id="' + user_exercise_id + '" class="fa fa-times"></a> </label> </li>');

后续需要获取这个值的时候,用jQuery的.data()方法:

// 比如绑定点击事件时获取值
jQuery(document).on('click', '.fa.fa-times', function() {
  const userId = jQuery(this).data('user-exercise-id');
  // 这里做删除逻辑
});

这样修改后,每个新生成的删除按钮都会携带自己对应的user_exercise_id,不会再出现值被覆盖的问题了。

内容的提问来源于stack exchange,提问作者umutözdemir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:02:31