动态添加和删除表单域代码无法正常工作

时间:2013-08-22 02:28:14

标签: javascript jquery forms mobile input

我正在编写一个解决方案来动态添加和删除表格恶魔。

这是行动计划:

点击绿色的“+”按钮,在表格的末尾添加与其完全相同的另一个输入,然后按钮将自身更改为红色的“x”按钮。

点击红色的“x”按钮,它会完全删除点击/触摸的输入。

当我点击第一个绿色按钮时,好的。它完全符合我的要求。同样是第一个红色的。当我尝试删除或添加多个时,混乱开始,导致页面加载时唯一有效的按钮是2。

我还认为我必须做一个函数,为将来的后端数据库记录添加一个新的唯一类到每个输入。但我也不知道怎么做。

这是一个小提琴:http://fiddle.jshell.net/Ja9yE/2/

$(document).ready(function(){
var newField = '<div class="field-wrapper"><input type="text" class="field" disabled="disabled" /><div class="button-holder"><div class="button-add"><img src="http://www.ricardostrobel.com.br/add-cancel-color.svg"></div></div></div>'

$(document).on("touchend mouseup",".button-add",function(e){
    e.stopPropagation(); e.preventDefault();
    $(this).removeClass("button-add").addClass("button-cancel");
    $(".field").removeAttr("disabled");

    $(newField).hide().appendTo("form").fadeIn(500);

});

$(document).on("touchend mouseup",".button-cancel", function(){
    $(this).closest(".field-wrapper").fadeOut("fast");          
});

});

2 个答案:

答案 0 :(得分:2)

jQuery动态元素101 ....使用事件委托来处理事件!!!

$(document).ready(function(){
    var newField = '<div class="field-wrapper"><input type="text" class="field" disabled="disabled" /><div class="button-holder"><div class="button-add"><img src="http://www.ricardostrobel.com.br/add-cancel-color.svg"></div></div></div>'

    $(document).on("touchend mouseup",".button-add",function(e){
        e.stopPropagation(); e.preventDefault();
        $(this).removeClass("button-add").addClass("button-cancel");
        $(".field").removeAttr("disabled");

        $(newField).hide().appendTo("form").fadeIn(500);

    });

    $(document).on("touchend mouseup",".button-cancel", function(){
        $(this).closest(".field-wrapper").fadeOut("fast");          
    });

});

演示:Fiddle

当您使用普通事件注册模型时,它会将处理程序直接注册到目标,这些处理程序在处理程序注册执行时存在于dom中。因此,动态添加的元素将不会获得这些处理程序。

对此的解决方案是使用事件委托,在此模型中,处理程序注册到祖先元素,当页面加载了选择器以过滤掉源元素时,该元素将出现。这利用了事件传播 - 元素中发生的事件传播到所有祖先元素(像焦点事件这样的例外)。因此,元素中发生的事件会传播到其中一个元素中的祖先元素,然后处理器被注册,然后事件源元素(event.target)及其祖先与作为第二个参数传递的选择器匹配,如果满足则处理程序已执行。

答案 1 :(得分:0)

您需要在创建或删除新元素后重新注册事件处理程序。另一种方法是为父div注册一个事件处理程序。并检查单击了哪个子元素(.button-add或.button-cancel),然后将逻辑应用于单击的元素。