首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换克隆元素上所有属性的更好方法?

替换克隆元素上所有属性的更好方法?
EN

Stack Overflow用户
提问于 2015-06-25 19:28:57
回答 4查看 111关注 0票数 1

这段代码很有效,但在我看来,它似乎有点长。我只倾向于在绝对必要的时候编写JS/Jquery,所以我是个菜鸟。

我正在克隆一个元素,然后用我创建的属性替换所有属性。

下面是JSFiddle或代码片段,如下所示:http://jsfiddle.net/og6Lcof0/3/

HTML:

代码语言:javascript
复制
<div id="eqblock" style="display:inline-block">

  <li id="equipment-0"><label for="equipment-0">Equipment</label> <select id="equipment-0" name="equipment-0"><option selected value="1">T700</option><option value="3">iLink</option></select></li>

  <li id="equipment-1"><label for="equipment-1">Equipment</label> <select id="equipment-1" name="equipment-1"><option selected value="1">T700</option><option value="3">iLink</option></select></li>

  <li id="equipment-2"><label for="equipment-2">Equipment</label> <select id="equipment-2" name="equipment-2"><option value="1">T700</option><option selected value="3">iLink</option></select></li>

</div>
<div id="modblock" style="display:inline-block">

  <li id="mod-0"><label for="mod-0">Method of Delivery</label> <input id="mod-0" name="mod-0" type="text" value="mod1">  <a href="#" id="remove_eq_0">Remove</a></li>

  <li id="mod-1"><label for="mod-1">Method of Delivery</label> <input id="mod-1" name="mod-1" type="text" value="mod2">  <a href="#" id="remove_eq_1">Remove</a></li>

  <li id="mod-2"><label for="mod-2">Method of Delivery</label> <input id="mod-2" name="mod-2" type="text" value="mod3">  <a href="#" id="remove_eq_2">Remove</a></li>

</div>

<a href="#" id="add_eq">Add Equipment</a>

联合来文/联合来文:

代码语言:javascript
复制
$( "#add_eq" ).click(function () {
    var num = findNum();
    if (typeof num !== 'undefined') {
        var $eqLabel = 'equipment-' + num;

        var $newEq = $( '#eqblock li:first' ).clone( false );
        $( $newEq ).attr( 'id', $eqLabel );
        $( 'label', $newEq ).attr( 'for', $eqLabel );
        $( 'select', $newEq ).attr( 'id', $eqLabel );
        $( 'select', $newEq ).attr( 'name', $eqLabel );
        $( "#eqblock" ).append( $newEq );

        var $modLabel = 'mod-' + num;
        var $newMod = $( '#modblock li:first' ).clone( false );
        $( $newMod ).attr( 'id', $modLabel );
        $( 'label', $newMod ).attr( 'for', $modLabel );
        $( 'input', $newMod ).attr( 'id', $modLabel );
        $( 'input', $newMod ).attr( 'name', $modLabel );
        $( 'input', $newMod ).attr( 'value', " ");
        $( 'input', $newMod ).val( '' );
        $( 'a', $newMod ).attr( 'id', 'remove_eq_' + num);
        $( "#modblock" ).append( $newMod );
    };
});

,这是一个更新的JSFiddle,其中有我已完成的供参考的代码 http://jsfiddle.net/og6Lcof0/4/

谢谢大家的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-25 19:40:45

问题的本质并不是完全自动化的,但是有一些语法快捷键可以用来减少重复。而不是:

代码语言:javascript
复制
    $( 'label', $newMod ).attr( 'for', $modLabel );
    $( 'input', $newMod ).attr( 'id', $modLabel );
    $( 'input', $newMod ).attr( 'name', $modLabel );
    $( 'input', $newMod ).attr( 'value', " ");
    $( 'input', $newMod ).val( '' );

尝试:

代码语言:javascript
复制
    $( 'label', $newMod ).attr( 'for', $modLabel );
    $( 'input', $newMod )
        .attr({
            id: $modLabel,
            name: $modLabel,
            value: " "
        })
       .val( '' );
票数 2
EN

Stack Overflow用户

发布于 2015-06-25 19:56:19

您可以极大地简化HTML,这可能使您能够简化JavaScript。

当前,您有重复的ID,这在HTML中是不允许的:

代码语言:javascript
复制
<li id="equipment-0">
  <label for="equipment-0">Equipment</label>
  <select id="equipment-0" name="equipment-0">
    <option selected value="1">T700</option>
    <option value="3">iLink</option>
  </select>
</li>

您可能不需要li的ID,所以删除它。

还可以通过使selectinput元素成为标签的子元素来移除标签的select。在这样做之后,您可能不再需要id上的selectinput元素。

这将上面的HTML简化为:

代码语言:javascript
复制
<li>
  <label>Equipment
    <select name="equipment-0">
      <option selected value="1">T700</option>
      <option value="3">iLink</option>
    </select>
  </label>
</li>

此时,只剩下一个在克隆后需要更改的属性。

票数 2
EN

Stack Overflow用户

发布于 2015-06-25 19:37:52

简短的回答:没有更好的方法了。

较长的答覆:

您可以将jQuery对象赋值到变量中,这样就不必重复查询选择器。

例如:

代码语言:javascript
复制
$( 'input', $newMod ).attr( 'id', $modLabel );
$( 'input', $newMod ).attr( 'name', $modLabel );
$( 'input', $newMod ).attr( 'value', " ");
$( 'input', $newMod ).val( '' );

变成了

代码语言:javascript
复制
var newModInput = $( 'input', $newMod );
newModInput.attr( 'id', $modLabel );
newModInput.attr( 'name', $modLabel );
newModInput.attr( 'value', " ");
newModInput.val( '' );

这也可能更有效,因为每次都不必遍历$newMod来查找输入。但还不足以引起注意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31059162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档