Jquery html不适用于动态添加的元素

Posted

技术标签:

【中文标题】Jquery html不适用于动态添加的元素【英文标题】:Jquery html not working on dynamically added element 【发布时间】:2021-07-09 10:31:48 【问题描述】:

我先做这个

var columns = row.getElementsByTagName('td');

columns[2].innerhtml ='<Button class="btn btn-success" style="margin-right:4px;" onclick="savecategory(this.parentNode,this)">Save</Button>

现在我的功能

function savecategory(but,save_button)
$(save_button).html('<span class="spinner-border spinner-border-sm"></span> Save');
$(save_button).attr("disabled",true);
//These two lines do not work


savecategory 里面的行不起作用,但是当我控制台它显示正确的按钮

这里编辑是完整的功能:

function savecategory(but,save_button)
  var row = but.parentNode;
var columns = row.getElementsByTagName('td');
var newmain = $(columns[0]).children('select[name=maincategory]').val();

columns[1].innerHTML = (columns[1].innerHTML).replace(/&nbsp;/g, '');
var newcat = $(columns[1]).text();
var oldmain = columns[0].getAttribute('data-init');
var oldcat = columns[1].getAttribute('data-init');

$(save_button).html('<span class="spinner-border spinner-border-sm"></span> Save');
$(save_button).attr("disabled",true);

var xmlhttp=new XMLHttpRequest();
  xmlhttp.onreadystatechange=function() 
    if (this.readyState==4 && this.status==200) 
    var arr= JSON.parse(this.responseText);
if(arr[0] == 1)
columns[0].innerHTML = newmain;
columns[1].innerHTML = newcat;
columns[1].setAttribute("contenteditable","false");
columns[0].setAttribute('data-init',newmain);
columns[1].getAttribute('data-init',newcat);

columns[2].innerHTML ='<Button class="btn btn-primary" onclick="editcategory(this.parentNode)"><i class="zmdi zmdi-edit zmdi-hc-lg"></i></Button>';


$('select[name ="dishtype"] option[value="'+oldcat+'"]').remove();
$('select[name ="dishtype"]').append('<option value="' + newcat + '">' + newcat + '</option>');
var $alen = $('.scrollmenu').eq(0).children().length;


$('.scrollmenu').eq(0).find('a').each(function()
  if($(this).attr('data-init').localeCompare(oldcat) == 0)
    $(this).attr('data-init',newcat); 
     $(this).html(newcat);
  
  );

var area = document.getElementsByClassName(oldcat)[0];
$(area).find("p:first").html(newcat);

$(area).removeClass(oldcat).addClass(newcat);

alert("Category updated");


else
  alert(arr[1]);

$(save_button).html('Save');
$(save_button).attr("disabled",false);


    
else
$(save_button).html('Save');
$(save_button).attr("disabled",false);


  


  xmlhttp.open("GET","url.php?oldmain="+encodeURIComponent(oldmain)+"&oldcat="+encodeURIComponent(oldcat)+"&newmain="+encodeURIComponent(newmain)+"&newcat="+encodeURIComponent(newcat),true);

  xmlhttp.send();




编辑代码写在上面,请检查上面写的,我找不到错误,这就是我正在做的,在这种方法有效的地方休息,我不明白

【问题讨论】:

谁是save_button?不应该放在 $('save_button') 这样的引号下吗? @MaraBlack 是 HTML 中的按钮,值在内联侦听器的参数中传递。标记中似乎没有 save_button 标记,因此您的建议不起作用。 如果需要,我可以提供完整的功能 啊,我的错,没看到.. 我不能reproduce 这个问题,代码似乎可以正常工作..?请注意,span 元素是空的,在该内联元素中没有什么可看的。 【参考方案1】:

编辑问题后,我们可以看到,当检测到响应不成功时,保存按钮在readystatechange 处理程序的else 块中恢复。但是,readystatechange 会触发多次,并且每次触发事件时您都会覆盖原始 Save 按钮的内容,而不是设置 spinner-span,并将其disabled 属性设置为false,直到请求实际上检测到一个成功的响应。

要解决此问题,请在 XHR 对象上侦听 load 事件而不是 readystatechange,它只会触发一次。检查请求的状态,如果不成功(200),else 块将恢复保存按钮。您无需在成功处理程序中重置按钮,因为当您设置单元格的innerHTML 时,该按钮将从 DOM 中删除。一个简短的代码:

function savecategory(but, save_button) 
  var row = but.parentNode,
    columns = row.getElementsByTagName('td');
  // Show the loadtime Save button
  $(save_button).html('<span class="spinner-border spinner-border-sm"></span> Save');
  $(save_button).attr("disabled", true);

  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onload = function() 
    if (this.status == 200) 
      columns[2].innerHTML = '<button class="btn btn-primary" onclick="editcategory(this.parentNode)"><i class="zmdi zmdi-edit zmdi-hc-lg"></i></button>';      
     else 
      // Unsuccessful AJAX call, restore the Save button
      $(save_button).html('Save');
      $(save_button).attr("disabled", false);
    
  
  // 
  xmlhttp.open("GET", "...", true);
  xmlhttp.send();

【讨论】:

【参考方案2】:

如果您在静态 HTML 中创建它,那么只需使用 .ready(handler) 或 .on("load", handler)。

如果你使用的是 jQuery 的 load() 函数,那么当内容被加载时,你可以运行一个回调:

$('#element').load('sompage.html', function()/ 回调/ );

在回调函数中你可以编写你的函数来调用函数。我希望这对你有用。谢谢

【讨论】:

什么意思可以给我与我的案例相关的样本

以上是关于Jquery html不适用于动态添加的元素的主要内容,如果未能解决你的问题,请参考以下文章

jquery如何动态的添加一条html代码

点击事件不适用于动态生成的元素[重复]

jQuery .validate() 不适用于动态创建的表行

jquery sortable不适用于动态添加的项目

jquery 动态添加表单元素

Sumoselect 插件不适用于动态选择下拉菜单