2016-05-12 113 views
0

我有一个表单,用户可以通过单击按钮添加更多字段。它是通过克隆制造,改变了名称,并在DIV apending领域:未选择克隆输入

$("#add").click(function(){ 
    var linha = $("#linha").clone(); 

    var num = $("#cont").val(); 
    var novo = parseInt(num) + 1; 
    novo = novo.toString(); 

    linha.find('#FaturamentoHoraExtra'+num+'Nome').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][nome]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Nome').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Responsabilidade').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][responsabilidade]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Responsabilidade').removeAttr("selected"); 
    linha.find('#FaturamentoHoraExtra'+num+'MaodeobraId').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][responsabilidade]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'MaodeobraId').removeAttr("selected"); 
    linha.find('#FaturamentoHoraExtra'+num+'Salario').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][salario]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Salario').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Qtd50').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][qtd_50]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Qtd50').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Valor50').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][valor_50]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Valor50').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Qtd100').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][qtd_100]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Qtd100').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Valor100').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][valor_100]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Valor100').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Dsr').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][dsr]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Dsr').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Total').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][total]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Total').val(''); 
    linha.find('#FaturamentoHoraExtra'+num+'Obs').attr({'name': 'data[FaturamentoHoraExtra]['+novo+'][obs]'}); 
    linha.find('#FaturamentoHoraExtra'+num+'Obs').val(''); 

    linha.appendTo("#bloco"); 

    $("#cont").val(novo); 

    return false; 
}); 

所有的字段由一些功能自动计算。这是我做的:

$("input[name$='[dsr]']").change(function(){ 
    somaColaborador(); 
    totalDsr(); 
    totalGeral(); 
}); 
$("input[name$='[valor_50]']").change(function(){ 
    total50(); 
    somaColaborador(); 
    totalDsr(); 
    totalGeral(); 
}); 
$("input[name$='[valor_100]']").change(function(){ 
    total100(); 
    somaColaborador(); 
    totalDsr(); 
    totalGeral(); 
}); 
$("input[name$='[porcentagem]']").change(function(){ 
    porcentagemRateio(); 
}); 

我的作品,但通过克隆新领域的“原始”没有选择,虽然它们具有相同的端名称。所以,计算不成立,我不明白为什么。

+0

看起来就像你是它过于复杂反正渲染无效的HTML标记与重复的ID。如果你提供了MCVE或至少相关的HTML标记,我想有人可以发布更好/更易读和可维护的方式 –

+0

还是要知道,这会导致无效的HTML标记,得到重复的ID:var linha = $(“#linha” ).clone();'** && **'linha.appendTo(“#bloco”);'。然后在DOM中至少得到两个具有相同id'linha'的元素,这是无效的。顺便说一句,同样的事情适用于所有的后代。最好不要在这里使用ID。 –

回答

1

如果我的理解正确,听起来就像您的克隆元素在创建后无法按预期工作。

如果动态地创建元素和预期的事件处理程序为他们工作,你需要使用on()功能的jQuery,而不是click()将针对存在的目前的元素和那些在未来创建:

$(document).on('change','input[name$="[dsr]"]',function(){ 
    somaColaborador(); 
    totalDsr(); 
    totalGeral(); 
}); 
$(document).on('change','input[name$="[valor_50]"]',function(){ 
    total50(); 
    somaColaborador(); 
    totalDsr(); 
    totalGeral(); 
}); 
$(document).on('change','input[name$="[valor_100]"]',function(){ 
    total100(); 
    somaColaborador(); 
    totalDsr(); 
    totalGeral(); 
}); 
$(document).on('change','input[name$="[porcentagem]"]',function(){ 
    porcentagemRateio(); 
}); 

click()功能只会线了这些事件处理程序为,在DOM存在创建事件处理程序的元素时工作。

+0

我在发布之后不久就更新了语法,实现了同样的功能。它从那以后被改变了。 –

+0

而不是委托事件,你可以传递'true'到'clone()'方法来复制任何绑定的事件或数据,包括任何绑定到任何后代的绑定事件或数据。 –

1

使用事件代表团考虑到后面将要创建的元素:

$(document).on("change", "input[name$='[dsr]']", function(){ 
    ... 
}); 

etc