【问题标题】:Attaching event handlers to dynamically generated elements将事件处理程序附加到动态生成的元素
【发布时间】:2019-04-16 16:26:00
【问题描述】:

我有以下 HTML:

<button type="button" id="Button">Go</button>
<div id="validation"></div>

我正在尝试通过以下方式将事件处理程序添加到动态生成的元素:

单击按钮 -> 在 div #validation 中生成元素 X -> 将事件处理程序附加到元素 X

$(document).ready(function(){
    ID = 1;

    $("#Button").click(function(){

        /*generate new div inside div #validation with id #validationID
        1st one would be #validation1
        it contains a form with name accepterID and a button with name refuserID
        1st ones would be accepter1 and refuser1*/
        var newline = `
                    <div id="validation${ID}">
                        <form name="accepter${ID}">
                            <input type="hidden" name="name" value="phoegasus">
                            <button type="submit" value="valider">
                        </form>
                        <button name="refuser${ID}">refuser</button>
                    </div>
                    `
        $("#validation").append(newline);

        /*attach event handlers to the generated elements
        1st iteration would attach handlers to accepter1 and refuser1 */

        $("#validation").on('submit',"form[name^='accepter"+ID+"']",function(e){
            $("#validation" + ID).remove();
            //remove div validationID after submitting form
        });

        $("#validation").on('click',"button[name^='refuser"+ID+"']",function(){
            $("#validation" + ID).remove();
            //remove div validationID
        });

        ID++;

    });
});

当我提交表单或单击生成的按钮时,我想删除包含它们的 div。如果我按下按钮拒绝 1,它应该删除 div #validation1。

生成元素时,处理程序不会附加到它们。

代码在 onclick 事件期间执行时不起作用,但当我在导航器控制台中执行时它起作用。

我尝试在 ID 为 #validation 的 div 上使用 DOMSubtreeModified,但没有成功。

【问题讨论】:

  • 首先,看到这个:stackoverflow.com/questions/4472528/…
  • 创建处理程序时ID的值是多少?查看包含所有 HTML 和 JS 的完整工作示例将有助于创建新元素并将处理程序添加到它们。话虽如此,似乎最好在您创建的所有元素上使用一个公共类,然后使用单个委托事件处理程序来管理所有元素。
  • 您需要提供minimal reproducible example。您的事件处理程序什么都不做,并且缺少创建元素的代码。从您的示例代码中无法判断它不起作用,让我们来确定原因。
  • 在创建每个新元素后创建一个唯一的委托事件侦听器,特定于该元素,这似乎是一种反模式。

标签: javascript jquery


【解决方案1】:

您可以通过在 on 函数的第二个参数中使用类(或其他元素)来管理它。

为此,请勿在 add 事件中声明事件侦听器。

这是一个完整的工作示例:

$("#validation").on('submit',"form.validation-form",function(e){
  e.preventDefault();
  console.log('form', $(this).attr('data-id'), ' submitted');
});



$("#validation").on('click',"button.validation-refuser",function(){
  console.log('clicked on refuser for form ', $(this).attr('data-value'));
    //code
});

var ID = 1;
$('#my-adder').on('click', function () {
  $('#validation').append('<form name="accepter'+ID+'" class="validation-form" data-id="'+ID+'"><input type="text" placeholder="my text field" /><button class="validation-refuser" name="refuser'+ID+'" data-value="'+ID+'">Refuser button</button><button type="submit">SUBMIT</button></form>');
  ID++;
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="validation">
  <form name="accepter0" class="validation-form" data-id="0">
    <input type="text" placeholder="my text field" />
    <button type="button" class="validation-refuser" name="refuser0" data-value="0">Refuser button</button>
    <button type="submit">SUBMIT</button>
  </form>
</div>

<button id="my-adder">ADD A FORM</button>

希望对你有帮助

【讨论】:

  • 我没有使用类,而是使用了所有表单之间的通用名称(accepter,不添加 ID),以及所有按钮之间的通用名称(拒绝者,不添加 ID),以及使用 data-id 属性来标识元素。因此,对于我添加的每个新元素,我都不需要一个新的事件处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多