【问题标题】:jQuery clone - resulting cloned controls don't functionjQuery 克隆 - 生成的克隆控件不起作用
【发布时间】:2025-11-24 16:25:01
【问题描述】:

在 asp.net/mvc5 网站上工作。

我有一个弹出模式对话框(MVC 5 部分页面),它应该用于数据表的高级过滤。我希望用户能够添加或删除尽可能多的过滤“项目”/行。过滤器控件位于具有“filter_row”类的行上。这是模态正文代码....

          <div class="modal-body" style="height: 300px;">
                <div class="row filter_row">
                    <div class="col-lg-12">
                        <div class="checkbox i-checks inline-block">
                            <input type="checkbox" value="">
                        </div> &nbsp;
                        <select data-placeholder="Choose..." class="chosen-select" style="width: 150px;">
                            <option value="">First Name</option>
                            <option value="">Last Name</option>
                            <option value="">DOB</option>
                            <option value="">SSN</option>
                            <option value="">City</option>
                            <option value="">State</option>
                            <option value="">Zip</option>
                            <option value="">Account</option>
                        </select>
                        &nbsp;
                        <input type="text" placeholder="" class="form-control inline-block" style="width: 200px;">
                        &nbsp;&nbsp;&nbsp;
                        <a href="#" onclick="$(this).closest('.filter_row_clone').remove();"><i class="fa fa-trash" aria-hidden="true"></i></a>
                    </div>
                </div>
            </div>

当我单击添加按钮 (+) 时,该行应该是重复的,并且确实如此。这部分工作正常。 (见下图,我点击了几次 (+)。)问题是我无法点击或使用任何克隆的控件。这是一个屏幕截图。在此屏幕截图中,只有第 1 行(原始行)是可点击的。

这是我在标题中的“添加”按钮的代码......

<a href="#" onclick="addRow();">
    <i class="fa fa-plus-circle" aria-hidden="true"></i>
</a>

这里是主函数 addRow....(见下面的更新代码)

    function addRow() {
    $(".filter_row").clone(true, true).removeClass("filter_row").addClass("filter_row_clone").insertAfter("div.filter_row:last");
};

(我删除主“filter_row”类(在克隆期间)的原因是每次我单击按钮时,它在第一次单击后添加了太多行。)

仅供参考:复选框使用 iCheck 插件,下拉菜单使用所选插件。在主父窗体(从中调用此 MVC 部分页面(模态))上,我引用了必要的脚本和样式。

谢谢!

**** 更新 ****

所以,上面的部分页面基本上是作为模态弹窗使用的。 “父”页面具有此代码。 (此代码有效,并且效果正确应用于插件,但不是克隆的。)

       $('#AdvancedSearch')
        .on('shown.bs.modal',
            function (e) {
                // the custom checkbox plugin
                $('.i-checks').iCheck({
                    checkboxClass: 'icheckbox_square-green',
                    radioClass: 'iradio_square-green'
                });

                // the "chosen" plugins
                $(".chosen-select").chosen({
                    disable_search_threshold: 10,
                    no_results_text: "Oops, nothing found!"
                });

            });

使用下面的建议(感谢@StephenMuecke)这是我的新 addRow() 函数....

<script>
function addRow() {
    $(".filter_row").clone(true, true).first().insertAfter("div.filter_row:last");
    $('.chosen-select').last().chosen(
        {
            disable_search_threshold: 10,
            no_results_text: "Oops, nothing found!"
        }
    );
    $('.chosen-select').last().chosen();
    $('.i-checks').last().iCheck({
        checkboxClass: 'icheckbox_square-green',
        radioClass: 'iradio_square-green'
    });
};
</script>

对于克隆控件,我现在可以使用除下拉列表之外的所有克隆控件。当我单击下拉菜单时,第一行的原始下拉菜单会打开...

【问题讨论】:

  • 您需要提供有关原始 html 以及如何附加插件的更多信息。没有理由更改类名 - 您可以使用 $(".filter_row").first().clone();,但您还需要将插件附加到新创建的元素。
  • @StephenMuecke 谢谢。 +1 供您的 .first() 参考。谢谢!复选框和下拉菜单的样式不是显示插件已附加吗?我只是无法选中复选框或从下拉列表中选择。你能更具体一点吗?我也会将 modalbody 代码添加到我上面的代码中。再次感谢!
  • @StephenMuecke 我删除了复选框和下拉菜单的插件类,并且能够使用控件。所以这似乎是问题所在。那我该如何“附加插件”呢?
  • @StephenMuecke 也许这是个问题,因为克隆的控件没有唯一的 ID,所以插件代码可能总是使用原始控件?
  • 我们需要了解您当前如何将插件附加到您的元素。您不需要唯一的id's,但您确实需要将插件附加到新添加的元素 - 例如添加元素后类似于$('.chosen-select').last().chosen({ ... });

标签: javascript jquery asp.net-mvc


【解决方案1】:

试试这个。我不知道这是不是你想要的。测试后告诉我。

<a href="#">
    <i class="fa fa-plus-circle" id="test" aria-hidden="true">Button</i>
</a>
<div class="row filter_row"> 
    <select class="" name="txtCategory[]" id="category1">
       <option value="">Option 1</option>
       <option value="">Option 2</option>
       <option value="">Option 3</option>
       <option value="">Option 4</option>
    </select>
</div>



$("#test").on("click", clone);

function clone(){
  $(".filter_row").clone(true, true).removeClass("filter_row").addClass("filter_row_clone").insertAfter("div.filter_row:last");
}

https://jsfiddle.net/7gddtnee/

【讨论】:

  • 谢谢。你的 jsfiddle 似乎工作。你的代码到底有什么不同?我的 iCheck 或选择的插件是否以某种方式失败了?我不这么认为,因为它们的样式正确。只是无法点击它。再次感谢!我也会在上面的 cmets 中添加 modalbody 代码。
  • 您正在对“a”按钮执行 onClick,而我正在对脚本执行 onClick,我认为这可能是失败的部分,因为当我测试您的代码时,我复制了 a 按钮并且它没有做这个功能。