【问题标题】:jQuery how to dynamically add select element and reset choice?jQuery如何动态添加选择元素并重置选择?
【发布时间】:2015-02-26 19:34:47
【问题描述】:

我正在 Play Framework 中编写一个动态表单,但我对 javascript 不是很有经验。我正在尝试构建允许动态添加字段的this jQuery example。我不想只添加一个文本字段,而是每次都添加一个文本字段和一个选择框。棘手的部分是即使有selected 项,我也希望重置动态添加的选择框。

这是我的尝试,使用this answer

 $('.multi-field-wrapper').each(function() {
   var $wrapper=$('.multi-fields', this);
   $(".add-field", $(this)).click(function(e) {
     var obj=$('.multi-field:first-child', $wrapper).clone(true).appendTo($wrapper).find('input').val('').focus();
     // This following line is incorrect...
     obj.find('.blank').prop('selected', true).end().trigger('chosen:updated');
   }
   );
   $('.multi-field .remove-field',
   $wrapper).click(function() {
     if ($('.multi-field', $wrapper).length > 1) $(this).parent('.multi-field').remove();
   }
   );
 }
 );
<form role="form" action="/wohoo" method="POST">
  <label>Stuff</label>
  <div class="multi-field-wrapper">
    <div class="multi-fields">
      <div class="multi-field">
        <div>
            <input type="text" name="stuff[]"/>
        </div>
        <div>
            <select>
              <option class="blank" value="">Select a car</option>
              <option value="saab">Saab</option>
              <option value="mercedes" selected>Mercedes</option>
              <option value="audi">Audi</option>
            </select>
        </div>
        <button type="button" class="remove-field">Remove</button>
      </div>
    </div>
    <button type="button" class="add-field">Add field</button>
  </div>
</form>

由于它使用clone() 功能,如果选择了“Mercedes”,那么动态添加的select 下拉菜单也会选择“Mercedes”。如何让新的selects 显示空白选项?

谢谢!

编辑 - 更新了我的代码以反映我的inputselect 标签被divs 封装的事实

【问题讨论】:

  • 既然可以创建新元素插入,为什么还要克隆?
  • 好问题。我想这是因为我发现的原始 jsfiddle 示例使用了clone()。这个问题实际上来自使用 Play 框架的 Web 应用程序的上下文,并且在那里我动态添加到包含这样的选择元素的视图模板。

标签: javascript jquery html


【解决方案1】:

“obj”变量成为此表达式末尾选择的输入节点:

var obj = $('.multi-field:first-child', $wrapper).clone(true).appendTo($wrapper).find('input').val('').focus();

但是您应该使用选择节点来解决问题,在您的情况下,它是“obj”的兄弟。

 obj.siblings('select').find('.blank').prop('selected', true).end().trigger('chosen:updated');});

http://jsfiddle.net/xogeufa2/1/

此外,如果“输入”和“选择”节点被包裹在 div 标签中,它们就会失去兄弟关系。所以在这种情况下,你应该找到另一种方法,来获得“选择”。例如,通过父母:

obj.closest('.multi-field').find('select').find('.blank').prop('selected', true).end().trigger('chosen:updated');
    });

http://jsfiddle.net/2ymd7ug7/2/

【讨论】:

  • 我稍微简化了我的例子。在我的实际应用程序中,我有一个 div 包围 inputselect 元素。因此,当我在这种情况下尝试您的解决方案时,它不起作用jsfiddle.net/2ymd7ug7/1 如果siblings() 行在 div 内,我该如何更改它们才能工作?
  • 好吧,在你的情况下,“select”和“input”节点不再是兄弟姐妹,相反,他们的父母变成了。在这种情况下,爬到“多字段”会更容易,然后查看它的所有子节点以查找“选择”节点。找到“选择”后,就可以了。我们开始:jsfiddle.net/2ymd7ug7/2 ps:更新了我的答案。
  • 谢谢!今天我了解了siblings()closest() =)
【解决方案2】:

您只需要删除从选项标签中选择的属性。

为此,您可以使用 removeAttr 方法

这是完成您所描述的完整代码。

$('.multi-field-wrapper').each(function() {
    var $wrapper = $('.multi-fields', this);
    $(".add-field", $(this)).click(function(e) {
        var obj = $('.multi-field:first-child', $wrapper).clone(true).appendTo($wrapper).find('input').val('').end().find('option').removeAttr('selected').focus();
    });

    $('.multi-field .remove-field', $wrapper).click(function() {
        if ($('.multi-field', $wrapper).length > 1)
            $(this).parent('.multi-field').remove();
    });
});

刚刚在您的代码中添加了.end().find('option').removeAttr('selected') :)

我希望我能帮上忙..

在此处查找代码:https://jsfiddle.net/yrchyndk/

【讨论】:

  • 我喜欢您的解决方案,因为它更简洁。我要改变的一件事是将注意力集中在文本字段上,所以我使用了这个$('.multi-field:first-child', $wrapper).clone(true).appendTo($wrapper). find('input').val('').focus().end(). find('option').removeAttr('selected');jsfiddle.net/frkjyv87/2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多