javascript - 动态生成的模态链接将在每个新生成的链接上进行初始化

标签 javascript jquery materialize

我在动态生成的包含模态链接的列表方面遇到问题。我有一个卡片列表(来自 Materialise css),其中包含各种锻炼的信息。用户可以选择将锻炼添加到列表中以创建锻炼程序。将锻炼添加到列表后,会生成一个模态链接,其中包含锻炼信息以及教学视频。看来我设置代码的方式是,每次将新的锻炼添加到列表中时,都会触发模式,从而再次触发任何先前存在的链接。因此,如果列表中存在三个锻炼,则附加到该列表的第一个项目已初始化三次。我认为这是一个逻辑错误,但我不确定如何修复它。

如果您需要更多信息或对此进行说明,请告诉我。这是相关代码。

    $(".add-workout").on("click", function(){
    var workoutExerciseIdForList = $(this).prev().attr("id");
    console.log(workoutExerciseIdForList);
    workoutListAppend(workoutExerciseIdForList);
  });

  //Append all necessary elements to workout list

  function workoutListAppend(workoutExerciseIdForList){
    var workoutName = workoutInfo[workoutExerciseIdForList][0].exercise;
    var workoutNameLink = $("<a>").attr("href","#modal-more-info").attr("id","name-"+workoutExerciseIdForList).addClass("modal-trigger").append(workoutName);
    var workoutAppend = $("<td>").append(workoutNameLink);
    var repAppend = $("<td>").append('<div class="input-field"><input class="formReps" id="reps-'+workoutExerciseIdForList+'" type="text" class="validate"><label for="reps-'+workoutExerciseIdForList+'"></label></div>');
    var setAppend = $("<td>").append('<div class="input-field"><input id="sets-'+workoutExerciseIdForList+'" type="text" class="validate"><label for="sets-'+workoutExerciseIdForList+'"></label></div>');
    var weightAppend = $("<td>").append('<div class="input-field"><input id="weight-'+workoutExerciseIdForList+'" type="text" class="validate"><label for="weight-'+workoutExerciseIdForList+'"></label></div>');
    var completeButtonAppend = $("<td>").append('<input type="checkbox" class="workoutCheckbox" id='+workoutExerciseIdForList+'-checkbox /><label for='+workoutExerciseIdForList+'-checkbox></label>');
    var removeWorkoutButton = $("<td>").append('<a class="waves-effect waves-light red btn">X</a>');
    var workoutAppendToTr = $("<tr>").append(workoutAppend)
                                     .append(repAppend)
                                     .append(setAppend)
                                     .append(weightAppend)
                                     .append(completeButtonAppend)
                                     .append(removeWorkoutButton);
    $("#workout-append").append(workoutAppendToTr);

    $('.modal-trigger').leanModal({
      dismissible: true, // Modal can be dismissed by clicking outside of the modal
      complete: function() { modalReset(); } // Callback for Modal close
    });

    enterToSubmitReps(workoutExerciseIdForList, workoutName);
    enterToSubmitSets(workoutExerciseIdForList, workoutName);
    enterToSubmitWeight(workoutExerciseIdForList, workoutName);
    fieldIsEmpty(workoutExerciseIdForList, workoutName);
    modalGetId(workoutExerciseIdForList);
    removeWorkoutHandler();
  };

当单击带有 add-workout 类的按钮时,它会从 HTML 元素获取锻炼的 ID,然后从我创建的 javascript 对象中检索数据,然后运行函数workoutListAppend。

感谢您的帮助

最佳答案

所以我假设您的问题是或源于此 block ......

$('.modal-trigger').leanModal({
  dismissible: true, // Modal can be dismissed by clicking outside of the modal
  complete: function() { modalReset(); } // Callback for Modal close
});

您在页面上找到所有模态触发器并对它们应用leanModal。这意味着您还要对所有先前存在的事件以及可能的双重/三重绑定(bind)事件执行此操作。您只需对新创建的元素执行此操作。

workoutAppendToTr.find('.modal-trigger').leanModal({ ...

上面的内容查找具有 modal-trigger 类的元素,但仅限于锻炼AppendToTr 内,这是您的新元素。所以它只对新事物进行绑定(bind),而不是再次触发所有模态。

关于javascript - 动态生成的模态链接将在每个新生成的链接上进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580362/

相关文章:

css - 删除行之间的底部填充物化

jquery - 使用 Materialize CSS Select 组件的 VueJS 2 不会激活更改事件

javascript - 在 3 列中显示 div

javascript - 从 Chart.js 的数据点进一步移动工具提示?

javascript - js语法区别

jquery - 如何在 jQuery 选择器上应用正则表达式?

javascript - 将 Plot.ly 与外部脚本结合使用来绘制图表

javascript - 执行具有滑动延迟的功能

jquery - 如何使用jquery将所有双引号替换为单引号?

css - flaticon 图标在本地托管时有效,但在在线时无效