【问题标题】:jquery clone drop down listjquery克隆下拉列表
【发布时间】:2021-02-09 20:48:21
【问题描述】:

您好,我有以下下拉列表场景

每当我选择 cat1 选项时,都会填充子 cat 1 选项。但是如果我添加另一个类别 它应该只添加 cat1 选项而不是子 cat 选项。但在我的情况下,cat 1 和 sub cat 选项都已加载。以下是我克隆下拉列表的代码。

        <div class="new-categories">
                    <div class="new-category">
                        <select class="category-select" name="categories">
                        <option></option>
                        <option value="1">cat 1</option>

                    </select>
                    <select class='category-select-sub' style="display:none">
                        <!-- loaded from ajax -->
                    </select>
        </div></div>
    <a href="#" class="add-another-cat smallest" style="">Add another category</a>


$('.add-another-cat').click(function(event){
             event.preventDefault();
             var $orDiv = $('.new-category:last').after($('.new-category:first').clone());

});

这才是我真正应该的样子

谢谢。

更新:填充 ajax 结果

 $('div.new-categories').on('change', 'select.category-select', function () { 
             var $newselect = $('<select />').addClass('category-select-sub');
    $(this).parent().append($newselect);
            var cat_id = $(this).val();
            $.ajax({
                url:baseUrl+'categories/getsubcat',
                data:{'id':cat_id},
                dataType:'json',
                async:false,
                type:'POST',
                success:function(data){
                    var subhtml = data;
                    $('.category-select-sub').show();
                    $('.category-select-sub').html(subhtml);
                }
            });
        });

一旦添加了新的猫列表并选择了一个选项,第一个子猫就会根据新列表进行更改。如何预防?

【问题讨论】:

  • 您应该保持干净状态new-category 并在页面加载时自动克隆它。然后在按下add-another-cat 时再次克隆它。这样您就不会克隆修改后的new-category
  • 克隆后为什么不清空category-select-sub?
  • 您的第二个问题很简单,您使用$(".category-select-sub") 而不是保留对您创建的select-sub 的引用并引用它。写作$(".category-select-sub") 影响所有.category-select-sub。你应该简单地写$newselect.show().html(subhtml);
  • 编辑了我的答案以包含 category-select-sub 问题的解决方案。

标签: javascript jquery html ajax


【解决方案1】:

您的代码对我来说没有意义,但这是我认为您正在尝试做的事情。如果我错了,请纠正我。

“我想克隆 div new-category 并将其附加到 div new-categories。我只想克隆第一个选择列表,而不是其他任何内容。

http://jsfiddle.net/HZp5M/

$('a.add-another-cat').click(function(e) {
    e.preventDefault();
    //clone the first div
    var $newdiv = $('div.new-category:first').clone();
    //remove the second select (if there is one)
    $newdiv.children('select.category-select-sub').remove();
    //append new div
    $('div.new-categories').append($newdiv);
});

【讨论】:

  • 好的。但是当我在第一个类别上选择一个选项时如何防止 - 选择它应该填充第一个子猫列表而不是其他人的列表..?
  • @SaraswathiApavoo - 这真的是一个不同的问题。我不知道您如何填充第二个选择列表。如果您需要帮助,您应该提出一个新的 SO 问题。
  • 你的东西很好用,现在一旦我添加新猫并为它选择选项,第一个子猫也会根据新猫列表的结果发生变化
  • 如果它克隆了一个事件处理程序,您需要将其与新克隆的元素解除绑定:$(yourNewElement).unbind('change');(或使用的任何事件)。
  • 您的 jsfiddle.net/HZp5M/1 也不能正常工作。请注意,它不止一次附加..
【解决方案2】:

http://jsfiddle.net/SCArr

<script src="//code.jquery.com/jquery-latest.js"></script>
<div id="clone" class="new-category" style="display:none;">
    <select class="category-select" name="categories">
    <option></option>
    <option value="1">cat 1</option>

    </select>
    <select class='category-select-sub' style="display:none">
        <!-- loaded from ajax -->
    </select>
</div>
<div class="new-categories">
</div>
<a href="#" class="add-another-cat smallest" style="">Add another category</a>

<script>
$('.add-another-cat').click(function(event){
    event.preventDefault();
    var $orDiv = $('.new-category:last').after($('#clone').clone().removeAttr('id').show());
});
$('.new-categories').html($('#clone').clone().removeAttr('id').show());
</script>

【讨论】:

  • 好的。但是当我在第一个类别上选择一个选项时如何防止 - 选择它应该填充第一个子猫列表而不是其他人的列表..?
  • 您需要在&lt;select class='category-select-sub'&gt; 上使用id,而不是仅使用class。假设当&lt;select id="category-select-1" class="category-select" name="categories"&gt; 被选中时,&lt;select id="category-select-sub-1" class='category-select-sub'&gt; 被填充。
【解决方案3】:

我想看看您如何拥有第二个子选择菜单,因为它可能会影响解决方案。

解决方案 1 - 使用空状态更好地创建

问题出在你的 HTML 结构中

<div class="new-category">
      <select class="category-select"> ... </select> 
      <select> ... </select> 
</div>

当您克隆 .new-categories 时,您会克隆两个选择元素。 您需要重建您的 HTML,以便只克隆您想要的内容。 您将需要自己创建一些没有克隆的东西。 例如,像这样:

$('.new-category:last').after( $("<div/>")
         .addClass("new-category").append($('.category-select:last').clone()).append($("<select/>").addClass(".category-select-sub").hide());

解决方案 2 - 克隆后清空子选择

a jsfiddle that shows how to empty a select

自动填充影响所有的子选择怎么办?

这很简单,您的代码明确引用所有子选择。看到你的代码说

$('.category-select-sub').show().html(subhtml);

此代码的意思是 - 将此 HTML 设置为所有“.category-select-sub”元素。但是你只想要这个类的特定元素 - 不是全部..

您应该只引用您创建的子选择 - 这很容易,因为您已经引用了它 - 所以成功函数应该是这样的:

$newselect.show().html(subhtml);

【讨论】:

  • 通过创建一个新元素,您将删除自动填充子菜单的事件处理程序。您将需要重新添加事件。通过利用clone,您可以避免这一步。
  • 我没有看到任何关于自动填充子菜单的事件处理程序。但是 - 您应该查看“on”或“live”来解决此问题,因为您需要事件处理程序来处理尚不存在的元素。
  • 请添加有关自动填充子菜单要求的详细信息,以便我也可以为其提供代码 sn-p。
  • 这实际上不是我的问题。我只是在评论您的解决方案。他说第二个子菜单是通过 ajax 填充的,这意味着初始选择项上必须有一个事件。
  • 好的 - live 仍然会解决这个问题。但也许更好的解决方案是在这种情况下清空第二个选择..
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多