0

thisthisthisのように jquery を使用して dom 要素を挿入するグッド プラクティスに関する良い投稿を見つけました。

いくつかの要素を挿入する必要があるだけの場合は問題ありませんが、これらのオプションは保守性の観点から非常に悪いように思えます (コードは 2 回繰り返されるため、変更が必要な場合は 2 回行う必要があります。非常にエラーが発生しやすい)、

これは(ほんの一部)私が持っているものです

<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複製したものに値がある場合は、それらを変更する結果を繰り返し処理する必要がありますid。個性的。ただし、テーブルの行などには最適です。

ページの読み込み時に、実際のモデルの 1 つを取得し、それを (ドキュメントに添付せずに) 複製し、不要なものを削除してから、そのモデルの複製を続けることができます。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、 es などを使用classすると、コードを構造に結びつけすぎないようにすることができます。

于 2011-03-23T17:31:54.020 に答える
0

この場合、#phonesready イベント中にのコンテンツを取得できます。

$(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-templating/

于 2011-03-23T17:35:56.690 に答える