【问题标题】:Input loses value when duplicated输入重复时失去价值
【发布时间】:2015-08-10 15:03:43
【问题描述】:

我的表单域有一个模板,我需要这些域能够被复制多次。

将此视为示例:

<a href='#' id="add">Add</a><br /><br />
<div id="box">
    <div id="template">
        <input type="text" name="template"></input>
        <br /><br />
    </div>
</div>

脚本:

var template = document.querySelector('#template');
var index = 1;

$('#template').remove();

$('body').on('click', '#add', function(e) {
    e.preventDefault();

    $('#box').append(template);

    var newInput = $('#box').html().replace(/template/g, 'input-'+index);

    $('#box').html(newInput);

    index++;
});

http://jsfiddle.net/bedex78/hkk7rx74/7/

为什么每当我在字段中输入一些值时,添加新值时该值消失(即单击“添加”按钮后)? p>

【问题讨论】:

    标签: jquery forms duplicates append input-field


    【解决方案1】:

    使用 $('#box').html(newInput); 时,您将替换所有 HTML - 其中包括所有输入和值。使用clone 的组合复制模板和append 添加到框中而不替换其内容:

    $('body').on('click', '#add', function(e) {
        e.preventDefault();
    
        var wrapper = $("<div>");
        wrapper.append($(template).clone());
    
        var newInput = wrapper.html().replace(/template/g, 'input-'+index);
    
        $('#box').append(newInput);
    
        index++;
    });
    

    jsFiddle

    注意:我在这里使用clone的原因是为了让你可以正确修改新的框。您不必使用html().replace,但可以使用 DOM 操作,例如wrapper.find("#template")

    【讨论】:

    • 只是好奇,您如何使用您建议的 DOM 操作 方法?哪一个更好、更高效?
    • 所以当你有wrapper时,你可以使用wrapper.prop("id", newId)和其他类似wrapper.find("input").addClass("input input-new")等的东西。这比将HTML替换为字符串更有效和更容易阅读。
    • 啊,我明白了......我想我决定使用.replace() 的最初原因是我的真实场景包含一个包含许多字段的表单以及我想要替换的单词的出现不仅限于input 标签或元素的属性,还包括文本内容。我想我不想针对每一个事件都添加更多的代码行。
    【解决方案2】:

    这是因为输入的值没有存储在html本身中。

    您的问题的解决方案是这样的:

    $('body').on('click', '#add', function(e) {
        e.preventDefault();
    
        var newInput = $(template).html().replace(/template/g, 'input-'+index);
    
        $('#box').append(newInput);
    
        index++;
    });
    

    jsfiddle:http://jsfiddle.net/hkk7rx74/8/

    【讨论】:

    • 我不知道您可以直接对变量进行更改。现在我知道了......无论如何,虽然这可行,但我还需要包含模板的容器(即div#template)。 @RGraham 的克隆方法似乎可以解决问题。不过,请 tx 帮忙!
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2015-12-16
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2021-02-21
    相关资源
    最近更新 更多