2016-05-08 12 views
4

私はjQueryを使って、いくつかのテンプレートを挿入し、私が使用しているときに、2つの異なる結果を取得しようとしている:jQuery append template?

var $template = $($("#productTemplate").html()); 

A)

var $template = $("#productTemplate").html(); 

Bを私が使用している場合は、A)場合は、テンプレートを何度も追加できます。使用すると、テンプレートを1回だけ追加できます。 違いは何ですか?

index.htmlを

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
    <link rel="stylesheet" href="style.css"/> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> 
    <script src="main.js"></script> 
</head> 

<body> 


<div class="but"> 
    <a href="#" class="showForm"> Click </a> 
</div> 


<script id='productTemplate' type='text/template'> 
    <div class="product"> 
     <h1>H1</h1> 
    </div> 
</script> 

</body> 
</html> 

main.js

$(document).ready(function(){ 


    var $template = $($("#productTemplate").html()); 

    $(".showForm").on("click",function() { 
     $("body").append($template); 
    }); 

}); 

答えて

1

"私の推測":あなたはクリックハンドラoutsiteあなたの$テンプレートオブジェクトをロードするとおそらく、jQueryのは、あなたが追加しようとしている特定し同じjQueryオブジェクト、そしてjQueryは追加されません。あなたがもう一度あなたの変数をロードする場合、それは動作します:

$(document).ready(function() { 
    $(".showForm").on("click", function() { 
    var $template = $($("#productTemplate").html()); //inside the click handler works 
    $("body").append($template); 
    }); 
}); 

Plunker:https://plnkr.co/edit/L19RGOKeQXYYkvOuBbX7?p=preview

EDIT:

2つのオプションの違いは、あなたがすでにDOM要素のように操作することができます)Bということです、つまり、あなたのような何かを行うことができます。

$template.find("#my_hidden_id").val("12"); 
$template.find("#another_div").append("<p>Another html</p>"); 

をして、新しいカスタムテンプレートを追加...

3

In(a)$templateは文字列です。.append($template)は、追加する前に、文字列に基づいて常に新しいDOMフラグメントを作成します。それがDOMの周りを移動する再付加 - $(HTML_String)戻りjQuery、及び.append($template)が常に同じオブジェクトを使用するので、(B)$templateにおいて

は、オブジェクトです。 $templateを再利用するには、追加する前に明示的に.clone()する必要があります。