0

我找到了关于使用 jquery 插入 dom 元素的良好做法的好帖子,例如thisthisthis

只需要插入一些元素就可以了,但在我看来,从可维护性的角度来看,这些选项非常糟糕(代码重复了两次,因此如果需要任何更改,它需要发生两次然后它变成很容易出错),

这是(只是一小部分)我所拥有的

<script type="text/javascript">
var phnFragment = "<tr><td align=\"right\">Telephone:</td><td colspan=\"2\"><select name=\"select\" size=\"1\"style=\"width: 100px;\"><option>-- Choose --</option><option>Home</option><option>Mobile</option><option>Work</option></select><input type=\"text\" size=\"20px\" /></td></tr>";
    $(document).ready(function() {
    $('#addmorephones').click(function() {
                $("#phones").append(phnFragment);
            });
    });
</script>
....
....
<tr id="phones">
        <td align="right">Telephone:</td>
        <td colspan="2"><select name="select" size="1"
            style="width: 100px;">
            <option>-- Choose --</option>
            <option>Home</option>
            <option>Mobile</option>
            <option>Work</option>
        </select><input type="text" size="20px" /> <a href="javascript:void(0);" id="addmorephones">[+]</a>
        </td>
    </tr>

有没有更好的方法来实现这一点?有没有办法告诉 jquery 复制 dom 树的一部分并将其用作要插入的片段?

很想学习替代品

4

3 回答 3

3

有没有办法告诉 jquery 复制 dom 树的一部分并将其用作要插入的片段?

是的:clone。(您甚至不需要 jQuery;它cloneNode是 DOM API 的一部分。)如果您id在克隆的内容中有任何值,那么您当然需要迭代更改它们的结果,因为ids 必须是独特。但它非常适合表格行之类的东西。

在页面加载时,您可以抓取其中一个真实模型,将其克隆(无需将其附加到文档中),清除不需要的任何内容,然后继续克隆该模型。有助于使您的 JavaScript在某种程度上与您的标记分离。

例子:

HTML:

<table>
  <tbody>
    <tr><td>I'm a row in the table</td></tr>
  </tbody>
</table>

JavaScript:

jQuery(function($) {
  var counter = 10,
      rowModel;

  // Get the row model, clone it, remove the
  // content we'll replace anyway.
  rowModel = $("tr:first").clone();
  rowModel.find("td:first").empty();

  // Do our first tick
  tick();

  // Use the model to append to the table
  function tick() {
    var clone = rowModel.clone();

    clone.find("td:first").html("Added at " + new Date());
    $("tbody:first").append(clone);

    // Again?
    if (--counter > 0) {
      setTimeout(tick, 500);
    }
  }

});

实时复制

显然这是一个快速和肮脏的,但你明白了。如果您使用data-xyz属性(HTML5 中允许)、names、classes 等,则可以避免将代码与结构过于紧密地联系在一起。

于 2011-03-23T17:31:54.020 回答
0

在这种情况下,您可以#phones在 ready 事件期间获取 的内容:

$(document).ready(function() {
    var phnFragment = $("#phones").html();

    $('#addmorephones').click(function() {
        $("#phones").append(phnFragment);
    });
});

如果需要复制更复杂的信息(如事件),可以使用.clone() 方法

$(document).ready(function() {
    var $phnFragment = $("#phones").children().clone();

    $('#addmorephones').click(function() {
        $("#phones").append($phnFragment.clone());
    });
});
于 2011-03-23T17:33:29.420 回答
0

如果您有想要重用的现有标记,TJ 有一个很好的答案。您还可以使用 text/html 脚本类型将您的内容作为模板放入标记中,如下所示:

http://ejohn.org/blog/javascript-micro-template/

于 2011-03-23T17:35:56.690 回答