【问题标题】:Dynamically generated button not working via jQuery动态生成的按钮无法通过 jQuery
【发布时间】:2020-11-08 05:37:00
【问题描述】:

在 AJAX 的帮助下创建和获取表格和表格中的按钮。

带来的表中的按钮不起作用。我看不到与控制台上的按钮单击相关的任何操作。按钮不起作用的原因可能是什么?

按钮创建的代码结构:

for (var i = 0; i < finishedExams.length; i++) {
  document.getElementById('FEtemplate').innerHTML += '<tr><th>' + (i + 1) + '</th><td>' + result + '</td><td>' + title + '</td><td>' + et + '</td><td>' + humanized_time_span(date) + '</td><td><button type="button" class="btn btn-sm btn-alt-primary sendButtonData" data-qr-exam-id="' + id + '"> Send</button></div></td></tr>';
}

按钮点击相关的代码结构:

$('.sendButtonData').click(function () { 
        /* AJAX POST code here.. */
        if (response.status == true) {
            /* some codes */
        } else {
            /* some codes */
        }
    });

我尝试了什么?

$('body').on('click', '.sendButtonData', function(){

此代码有效,但使用表格第一部分的 ID 获取它。所有其他按钮的行为就像它们在表格的第一行工作一样。

另外,我将按钮类型从“按钮”更改为“提交”。同样,没有任何改变。

【问题讨论】:

  • 因为您是动态创建这些按钮,所以您需要在创建它们之后附加一个事件监听器,或者对父元素使用点击事件委托,以便所有未来的子按钮都能获得点击监听器
  • 我知道这是在做监听任务。 $('body').on('click', '.sendButtonData', function(){ 代码中是否缺少某些内容?谢谢@SaymoinSam
  • 请检查我的答案,祝您编码愉快!

标签: javascript html jquery ajax button


【解决方案1】:

我认为您在创建这些按钮之前已将事件侦听器附加到 ".sendButtonData" 元素,当您单击其中一个时没有任何反应,因为事件已附加到具有该类名称的现有元素,在这种情况下没有,但是不适合未来的人

$('.sendButtonData').click(function () { 
  console.log("button click!");
});

for (var i = 0; i < 5; i++) {
  document.getElementById('FEtemplate').innerHTML += '<tr><th>' + (i + 1) + '</th><td>' + " some result " + '</td><td>' + " some title " + '</td><td>' + " some et " + '</td><td>' + " some date " + '</td><td><button type="button" class="btn btn-sm btn-alt-primary sendButtonData" data-qr-exam-id="' + " some id " + '"> Send</button></div></td></tr>';
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="FEtemplate"></div>

所以你需要在创建像这样的按钮之后附加那个监听器

for (var i = 0; i < 5; i++) {
  document.getElementById('FEtemplate').innerHTML += '<tr><th>' + (i + 1) + '</th><td>' + " some result " + '</td><td>' + " some title " + '</td><td>' + " some et " + '</td><td>' + " some date " + '</td><td><button type="button" class="btn btn-sm btn-alt-primary sendButtonData" data-qr-exam-id="' + " some id " + '"> Send</button></div></td></tr>';
}

$('.sendButtonData').click(function () { 
  console.log("button click!");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="FEtemplate"></div>

或者你可以像这样使用事件委托

$('#FEtemplate').click(function(e) { 
  // only if the element has that class `sendButtonData`
  // note that in this case we're not checking for the element type to be a button
  if(e.target.className.includes("sendButtonData")) {
    console.log("button click!");
  }
});

for (var i = 0; i < 5; i++) {
  document.getElementById('FEtemplate').innerHTML += '<tr><th>' + (i + 1) + '</th><td>' + " some result " + '</td><td>' + " some title " + '</td><td>' + " some et " + '</td><td>' + " some date " + '</td><td><button type="button" class="btn btn-sm btn-alt-primary sendButtonData" data-qr-exam-id="' + " some id " + '"> Send</button></div></td></tr>';
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="FEtemplate"></div>

【讨论】:

  • 我会在最后一部分中对您的示例有疑问。如何获取按钮的data-qr-exam-id 值?请查看 JSFiddle 上的示例。您将在控制台上看到它显示“未定义”。 JSFiddle
  • 很抱歉回复晚了,我正在工作,对于您的 JSFiddle 示例,您通过 $(e.target).attr("data-qr-exam-id") 而不是 $(this).attr("data-qr-exam-id") 获取按钮的属性,因为它是父元素的事件委托所以this 指的是父元素而不是当前点击的按钮
  • 成功了!我注意到当你无法回答时你很忙。非常感谢您花时间帮助我。土耳其致阿尔及利亚的问候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2017-08-25
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多