【问题标题】:Dynamically cloned elements with jquery - can't .remove() them or increment their ID's使用 jquery 动态克隆的元素 - 不能 .remove() 它们或增加它们的 ID
【发布时间】:2013-06-04 04:23:49
【问题描述】:

我正在制作一个用户输入表单,最初包含 1 个信息“pod”和 2 个输入。有一个“添加另一个”按钮可以通过 clone()/insertBefore() 多次动态复制 pod - 这似乎工作正常。这是我到目前为止所做的事情:http://jsfiddle.net/N6Xty/8/

以下两个功能变得混乱: 1:我只在克隆的 pod 元素中需要一个“删除我”按钮(即 remove-self),而不是原始 pod - 这只是稍微有效,我尝试了 2 种方法,首先使用 .removeClass(),其次使用 ' if' 语句(已被注释掉),但 'if' 会引发我无法纠正的控制台语法错误。 查看 Fiddle 比解释正在发生的事情要容易得多,但是第一个“删除”按钮位于错误的 pod 上,这是唯一真正有效的按钮......对于代码参考,有 2 个相关变量:“removeThisDivButton”和'removeThisDivButton02'

2:每个克隆的 pod 都有表单输入元素 - 我希望它们具有唯一的 ID(例如,用于引用 textarea 的标签)所以我一直在尝试实现动态 id 递增,但成功有限,我也在尝试实际 pod 上的唯一 ID(不是 100% 要求,但我希望它理想)。为此,有 2 个“附加 ID”脚本,一个使用“索引”,一个注释掉了我从这篇 SO 帖子中得到的:Append ID's

(我看过其他“附加 ID”回复,但我不明白如何将它们应用于此)。

如果有人可以就这方面的任何建议给我建议,那么非常感谢。

HTML:

<div id="outer-wrapper">
        <div class="content-wrapper">
            <a href="#" title="Duplicate" class="duplicate-butt">Add Another</a>
            <form name="userInfoForm" method="post" action="">
                <div id="info-div-" class="append-me-div">      
                    <select name="various-options">
                        <option>-- Please Choose --</option>
                        <option value="opt-one">One</option>
                        <option value="opt-two">Two</option>
                        <option value="opt-three">Three</option>
                    </select>
                    <label for="message-">Comments:</label>
                    <textarea id="message-" class="message-box" rows="10" cols="30"></textarea>

                    <a href="#" class="remove-this-div hidden-button">Remove ME</a>

                </div>
                <button type="submit" id="submit-button">Submit</button>
            </form>
        </div>
    </div>

jQuery:

(function($){
        // append ID (partly working)
        $('#info-div-, #message-').each(function(index){
            $(this).attr({
                'id': this.id + index
            });
        });

        // duplicate the <div>append-me-div</div> + show the 'Remove Me' button
        var duplicateButton = $('a.duplicate-butt');
        var appendMeDiv = $('div.append-me-div');
        var removeThisDivButton = $('a.remove-this-div');
        //var removeThisDivButton02 = $('<a href="#" class="remove-this-div">Remove ME</a>');

        duplicateButton.on('click', function(index){
            appendMeDiv.clone().insertBefore('button#submit-button');

            // 'Remove Me' version01
            removeThisDivButton.removeClass('hidden-button');   

            // 'Remove Me' version02
            /*if (this.appendMeDiv:eq+=(1)){
                removeThisDivButton02.appendTo(this.appendMeDiv);
            }*/

            // append ID (PARTLY working)
            /*appendMeDiv.attr({
                'id': this.id += 1
            });*/

            // append ID (not working)
            var idIncrement = 0;
            $('#info-div-, #message-').each(function(){
            //$('#info-div-').each(function(){
                idIncrement++;
                $('this').attr('id', 'id'+idIncrement);
            });

            console.log('a.duplicate-butt clicked');
        });

        // remove the current/parent <div>append-me-div</div>
        removeThisDivButton.on('click', function(e){
            $(this).parent('div').remove();
            e.preventDefault(); // tried this to stop the page auto-scrolling back to top on click - not working
            console.log('CLICKED: a.remove-this-div');      
        });
    })(jQuery);

【问题讨论】:

  • 使用小模板可能会更容易,以便您拥有更多控制权...
  • 您需要存储对克隆的引用并作用于克隆而不是原始元素。
  • 感谢您的回复。我可以看到其中的意义,所以我在这里重新制作了小提琴:http://jsfiddle.net/JTKBq/2/ 我正在尝试模板路由,将其存储为变量并引用该变量-我的控制台报告SyntaxError: unterminated string literal,所以这很清楚。有人可以看看新的小提琴并告诉我如何正确制作这个模板。谢谢
  • 你不能把所有这些硬回报都放在那里。这不会给出错误(但仍然不起作用)。 jsfiddle.net/JTKBq/3

标签: jquery forms dynamic append clone


【解决方案1】:

这应该会让你继续前进。您必须将新克隆存储为对象,然后对其进行操作。这肯定需要一些调整,但希望它能让你滚动。

http://jsfiddle.net/N6Xty/9/

所有的魔法都发生在这里:var newOne = appendMeDiv.clone();。享受吧!

【讨论】:

  • 谢谢@Tim Wasson !!!非常感谢,我可以立即看到你在那里做了什么,有点帮助。我尝试添加一个额外的位 - 我想增加标签的“for”属性以与 textareas 一致,所以我使用了你的逻辑并调整了小提琴:newOne.find(".comments-label").attr("for"+idIncrement); 虽然不起作用,你能建议吗?
  • 看起来您的格式有点错误。类似于newOne.find(".comments-label").attr("for","for-"+idIncrement);
  • 真傻 - 我刚刚在 .attr() 中添加了额外的参数,一切都很好:newOne.find(".message-label").attr("for","message-id-"+idIncrement); 再次感谢,对学习曲线有很大帮助
【解决方案2】:

这实际上非常简单,诀窍是将处理程序附加到原始“删除我”按钮,然后使用clone(true, true) 克隆包括附加处理程序在内的所有内容:

(function($) {
    var appendMeDiv = $('.append-me-div');
    var submitButton = $('#submit-button');
    var count = 0;
    $('.remove-this-div').hide().on('click', function(e) {
        e.preventDefault();
        $(this).closest('.append-me-div').remove();
    });
    $('a.duplicate-butt').on('click', function(e) {
        e.preventDefault();
        var clone = appendMeDiv.clone(true, true).insertBefore(submitButton).find('.remove-this-div').show().end();
        var messageBox = clone.find('.message-box');
        var id = messageBox.attr('id') + ++count;
        messageBox.attr( 'id', id ).prev('label').attr( 'for', id );
    });
})(jQuery);

DEMO

就个人而言,我会省略&lt;label for="..."&gt; 功能。在这种情况下它并不是特别重要,因为 textarea 是一个比标签大得多的目标。

javascript 将简化为:

(function($) {
    var appendMeDiv = $('.append-me-div');
    var submitButton = $('#submit-button');
    $('.remove-this-div').hide().on('click', function(e) {
        e.preventDefault();
        $(this).closest('.append-me-div').remove();
    });
    $('a.duplicate-butt').on('click', function(e) {
        e.preventDefault();
        appendMeDiv.clone(true, true).insertBefore(submitButton).find('.remove-this-div').show();
    });
})(jQuery);

DEMO

【讨论】:

  • 感谢@Beetroot 的回复,又是一个巨大的帮助。我正在研究这两种解决方案并从中学习。在这个例子中,我稍微修改了一下以使#append-me-div 的 id 自动递增;到目前为止尝试过var $messageBox = clone.find('.append-me-div, .message-box');,但效果不佳,因此将继续修补。
  • 带有增量后缀的 ID 通常是不必要的,尽管我花了大约 15 年的时间编写 javascript 才发现这一点。我知道不能避免增量(或类似的东西)的唯一情况是使用&lt;label for="..."&gt;,您目前拥有它,但正如我已经建议的那样,可能没有它。如果你能向我解释为什么#append-me-div 目前需要增加,那么我会看看我是否能提供帮助。如果解释变得复杂,请提出单独的问题并在此处发布链接。
  • 这不是 100% 需要的(我在帖子中确实提到了这一点),但已包含在 Tim Wasson 的解决方案中,我能够将其应用于 label for="..."。但是我很高兴知道这种技术,因为它可以有其他应用程序。不过感谢您的意见!
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2014-09-06
  • 1970-01-01
  • 2012-09-28
相关资源
最近更新 更多