javascript - 後から追加した要素 - jquery 要素が追加されたら



jQuery動的に追加されたHTML要素にonclickイベントをバインドする方法 (6)

この質問には既に回答があります:

jQueryで動的に挿入する要素にonclickイベントをバインドしたい

しかし、バインドされた機能を実行することはありません。 なぜこの例題がうまくいかず、どうやって正しく動作させることができるのかを指摘できれば嬉しいです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"        
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
        <head>
          <title>test of click binding</title>

<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
          <script type="text/javascript">


        jQuery(function(){
          close_link = $('<a class="" href="#">Click here to see an alert</a>');
          close_link.bind("click", function(){
            alert('hello from binded function call');
            //do stuff here...
          });
  
          $('.add_to_this').append(close_link);
        });
          </script>
        </head>
        <body>
          <h1 >Test of click binding</h1>
          <p>problem: to bind a click event to an element I append via JQuery.</p>

          <div class="add_to_this">
            <p>The link is created, then added here below:</p>
          </div>

          <div class="add_to_this">
            <p>Another is added here below:</p>
          </div>


        </body>
        </html>

編集:私は、メソッドが挿入されている2つの要素を含む例を編集しました。 その場合、 alert()呼び出しは決して実行されません。 (コメントの中でそれを指摘してくれた@Daffに感謝します)

https://src-bin.com


Answer #1

このことを考慮:

jQuery(function(){
  var close_link = $('<a class="" href="#">Click here to see an alert</a>');
      $('.add_to_this').append(close_link);
      $('.add_to_this').children().each(function()
      {
        $(this).click(function() {
            alert('hello from binded function call');
            //do stuff here...
        });
      });
});

それはあなたがすべての特定の要素にそれを添付するので、動作します。 このため、DOMにリンクを追加した後で、追加された要素をDOM内のJQuery要素として明示的に選択し、クリックイベントをバインドする方法を見つける必要があります。

最良の方法は、ライブメソッドを介して特定のクラスにバインドする(おそらく示唆されているように)でしょう。


Answer #2

これらのメソッドはすべて廃止予定です。 あなたの問題を解決するには、 onメソッドを使用する必要があります。

動的に追加された要素をターゲットにする場合は、使用する必要があります

$(document).on('click', selector-to-your-element , function() {
     //code here ....
});

これは廃止予定の.live()メソッドを置き換えます。


Answer #3

ライブメソッドはどうですか?

$('.add_to_this a').live('click', function() {
    alert('hello from binded function call');
});

それでも、あなたはそれがうまくいくかのように見えました。 かなり類似している別の投稿があります。


Answer #4

最初の問題は、複数の要素を持つjQueryセットでappendを呼び出すと、追加する要素の複製がそれぞれ作成されるため、接続されたイベントオブザーバが失われることです。

これを行う別の方法は、各要素のリンクを作成することです。

function handler() { alert('hello'); }
$('.add_to_this').append(function() {
  return $('<a>Click here</a>').click(handler);
})

別の潜在的な問題は、要素がDOMに追加される前にイベントオブザーバがアタッチされていることです。 これに何か言いたいことがあるのか​​どうかはわかりませんが、その振る舞いは未定と考えられます。 より確かなアプローチはおそらく次のようなものです:

function handler() { alert('hello'); }
$('.add_to_this').each(function() {
  var link = $('<a>Click here</a>');
  $(this).append(link);
  link.click(handler);
});

Answer #5

要素とともにクリックイベントを作成することは可能であり、必要な場合もあります。 これは、セレクタベースのバインディングがオプションでない場合などです。 重要な部分は、 Tobiasが単一の要素に対して.replaceWith()を使用して話していた問題を回避することです。 これは概念の証明に過ぎないことに注意してください。

<script>
    // This simulates the object to handle
    var staticObj = [
        { ID: '1', Name: 'Foo' },
        { ID: '2', Name: 'Foo' },
        { ID: '3', Name: 'Foo' }
    ];
    staticObj[1].children = [
        { ID: 'a', Name: 'Bar' },
        { ID: 'b', Name: 'Bar' },
        { ID: 'c', Name: 'Bar' }
    ];
    staticObj[1].children[1].children = [
        { ID: 'x', Name: 'Baz' },
        { ID: 'y', Name: 'Baz' }
    ];

    // This is the object-to-html-element function handler with recursion
    var handleItem = function( item ) {
        var ul, li = $("<li>" + item.ID + " " + item.Name + "</li>");

        if(typeof item.children !== 'undefined') {
            ul = $("<ul />");
            for (var i = 0; i < item.children.length; i++) {
                ul.append(handleItem(item.children[i]));
            }
            li.append(ul);
        }

        // This click handler actually does work
        li.click(function(e) {
            alert(item.Name);
            e.stopPropagation();
        });
        return li;
    };

    // Wait for the dom instead of an ajax call or whatever
    $(function() {
        var ul = $("<ul />");

        for (var i = 0; i < staticObj.length; i++) {
            ul.append(handleItem(staticObj[i]));
        }

        // Here; this works.
        $('#something').replaceWith(ul);
    });
</script>
<div id="something">Magical ponies ♥</div>

Answer #6
    function load_tpl(selected=""){
        $("#load_tpl").empty();
        for(x in ds_tpl){
            $("#load_tpl").append('<li><a id="'+ds_tpl[x]+'" href="#" >'+ds_tpl[x]+'</a></li>');
        }
        $.each($("#load_tpl a"),function(){
            $(this).on("click",function(e){
                alert(e.target.id);
            });
        });
    }




bind