jquery结合js实现动态添加内容,并给动态添加的内容添加事件

客官°小女子只卖身不卖艺 2022-06-08 01:57 322阅读 0赞

jquery结合js实现向后台发送请求,给页面动态添加内容,并给动态添加的内容添加事件

.html内容如下:

  1. <button class="btn btn-md customButton" id="add_red_envelope">添加红包</button>
  2. <div >
  3. <label>其他推荐(可选):</label>
  4. <ul id="recommendTime">
  5. </ul>
  6. </div>
  7. <br />
  8. <div>
  9. <label>可发红包数:</label>
  10. <ul id="RedBagMaxNum">
  11. </ul>
  12. </div>

目的:前端点击button,向后台请求数据,动态添加到两个ul里面

jquery代码:

  1. $("#add_red_envelope").click(function(){
  2. var url = globalConfig.pre_api_url +"/wxwall_api/redbag/check_redbag.php";
  3. var hour = $('#startHour option:selected').val();
  4. var minute = $('#startMinute option:selected').val();
  5. var date = new Date();
  6. var seperator = "-";
  7. var year = date.getFullYear(); //获取年份
  8. var month = date.getMonth() + 1; //月份是从0-11,所以获得月份后要加1才是当前的月份
  9. var strDate = date.getDate(); //日期
  10. var currentDate = '';
  11. var start_time = '';
  12. var data = {};
  13. if (month >= 1 && month <= 9) {
  14. month = "0" + month;
  15. }
  16. if (strDate >= 0 && strDate <= 9) {
  17. strDate = "0" + strDate;
  18. }
  19. currentDate = year + seperator + month + seperator + strDate;
  20. // 显示日期输入框的值
  21. $("#currentDate").val(currentDate);
  22. start_time = currentDate + ' ' + hour + ':' + minute;
  23. data = {
  24. "start_time":start_time,
  25. };
  26. //请求初始化数据
  27. request(url,data,function(res){
  28. var selected_data = res.data.selected_data;
  29. var recomm_datas = res.data.recomm_datas;
  30. var len = recomm_datas.length;
  31. var recommendTimes = [];
  32. var recommendNums = [];
  33. // 添加推荐时间和可发红包数
  34. for(var i=0;i<len;i++){
  35. var dateAndTime = recomm_datas[i].recomm_time.trim().split(" ");
  36. var recommTimeList = '<li class="other_recommend" οnclick="chooseTime(this);" id="'+i+'">' + dateAndTime[1] + '</li>';
  37. var M_redbag_left = recomm_datas[i].M_redbag_left;
  38. var M_n = recomm_datas[i].M_n;
  39. var redBagLeftList = '<li class="number" id="num'+i+'">' + M_n + '</li>';
  40. $("#recommendTime").append(recommTimeList);
  41. $("#RedBagMaxNum").append(redBagLeftList);
  42. }
  43. $('#leftRedBag').text(selected_data.M_redbag_left);
  44. // 显示表单form和footer
  45. $("form").css("display","block");
  46. $("footer").css("display","block");
  47. });
  48. });

动态添加的内容如for循环语句里面所示。

动态添加内容效果如下:

Center

功能:每次向后台请求到的数据长度不一样,即Li个数不一样。给第一个ul中的每个li定义点击事件,选中该Li就改变样式

同时改变另一ul对应的li样式,效果如下:

Center 1

js实现该功能:

1、给第一个ul中的每一个li定义点击事件 :οnclick=”chooseTime(this)”,this传的是节点本身;同时定义id,id就用for中的i对应(考虑要改变另一个ul中对应的li的样式)

  1. //请求初始化数据
  2. request(url,data,function(res){
  3. var selected_data = res.data.selected_data;
  4. var recomm_datas = res.data.recomm_datas;
  5. var len = recomm_datas.length;
  6. var recommendTimes = [];
  7. var recommendNums = [];
  8. // 添加推荐时间和可发红包数
  9. for(var i=0;i<len;i++){
  10. var dateAndTime = recomm_datas[i].recomm_time.trim().split(" ");
  11. var recommTimeList = '<li class="other_recommend" οnclick="chooseTime(this);" id="'+i+'">' + dateAndTime[1] + '</li>';
  12. var M_redbag_left = recomm_datas[i].M_redbag_left;
  13. var M_n = recomm_datas[i].M_n;
  14. var redBagLeftList = '<li class="number" id="num'+i+'">' + M_n + '</li>';
  15. $("#recommendTime").append(recommTimeList);
  16. $("#RedBagMaxNum").append(redBagLeftList);
  17. }
  18. $('#leftRedBag').text(selected_data.M_redbag_left);
  19. // 显示表单form和footer
  20. $("form").css("display","block");
  21. $("footer").css("display","block");
  22. });

2、定义函数:chooseTime(node)

  1. chooseTime = function(node) {
  2. nodeId = node.id;
  3. if(flag == 0){
  4. // 页面渲染完成,首次点击推荐时间,不需要判断节点是否有选中属性
  5. flag = 1; // 用于解决页面初始化完成时lastSelectedTimeNode为空,不会具有属性的问题
  6. //node.addClass('active1'); // ???为什么这个总是提示出错呢
  7. $('#'+ nodeId).addClass('active1');
  8. $('#num'+ nodeId).addClass('active2');
  9. lastSelectedTimeNode = nodeId; //保存该节点,用于下次点击事件用
  10. }else{
  11. // 不是首次点击
  12. if( $('#'+nodeId).hasClass('active1') ){
  13. lastSelectedTimeNode = nodeId;
  14. }else{
  15. //修改node和lastSelectedTimeNode的颜色
  16. $('#'+lastSelectedTimeNode).removeClass('active1');
  17. $('#num'+lastSelectedTimeNode).removeClass('active2');
  18. $('#'+nodeId).addClass('active1');
  19. $('#num'+ nodeId).addClass('active2');
  20. //再把node赋值给lastSelectedTimeNode
  21. lastSelectedTimeNode = nodeId;
  22. }
  23. }
  24. }

如上面代码所示:页面首次渲染完成,首次点击推荐时间,不需要判断节点是否有选中属性,直接给选中li添加样式,同时保存 当前点击li的id,用于下次点击事件; 不是首次点击,如果当前点击和上次点击是同一个li就不需要做处理;否则 去掉上次的li添加的样式,给当前li 添加样式,并保存当前li的id

注意:在给页面动态添加内容节点之前,要将其父节点下的子节点移除掉,否则会产生意外的问题,比如给动态添加的某个节点赋予事件,而该节点又有id,那么当在页面不刷新的情况下,执行多次该代码,就会产生执行该节点的事件函数,但是并没有达到想要的效果。

原因:在不刷新界面的前提下,当多次添加同样的节点给当前界面,如果给某节点赋予id,那么body里面就会拥有多个相同id的节点,而在htnl里面每个节点都只能有一个id,且这个id在该页面只能出现一次,否则在事件处理函数中就会产生问题

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读