1

そのため、Firebase データベースの各データ ノード (「ポーリング」) に動的に追加される EDIT ボタンと REMOVE ボタンがあります。jQuery を使用してこれらに onclick リスナーを割り当てる関数がありますが、奇妙なことに、ノードが 1 つしかない場合にのみイベントが発生し、そのため EDIT/REMOVE ボタンのペアが 1 つだけ発生します。複数のノードと複数のボタンのペアがある場合、どれも起動しません。イベントがボタンに追加されるJavaScriptは次のとおりです...

function displayCurrentPollsForEditing(pollsRef)
{
    var tbl = createTable();
    var th = ('<th>Polls</th>');
    $(th).attr('colspan', '3');
    $(th).appendTo($(tbl).children('thead'));
    pollsRef.once('value', function(pollsSnapshot) {
        pollsSnapshot.forEach(function(pollsChild) {
            var type = pollsChild.name();
            // If this is true if means we have a poll node
            if ($.trim(type) !== "NumPolls") 
            {
                // Create variables
                var pollRef = pollsRef.child(type);
                var pollName = pollsChild.val().Name;
                var btnEditPoll = $('<button>EDIT</button>');
                var btnRemovePoll = $('<button>REMOVE</button>');
                var tr = $('<tr></tr>');
                var voterColumn = $('<td></td>');
                var editColumn = $('<td></td>');
                var rmvColumn = $('<td></td>');
                // Append text and set attributes and listeners
                $(voterColumn).text(pollName);
                $(voterColumn).attr('width', '300px');
                $(btnEditPoll).attr({
                    'class': 'formee-table-button',
                    'font-size': '1.0em'
                });
                $(btnRemovePoll).attr({
                    'class': 'formee-table-remove-button',
                    'font-size': '1.0em'
                });
                $(btnEditPoll).appendTo($(editColumn));
                $(btnRemovePoll).appendTo($(rmvColumn));
                // Append to row and row to table body
                $(tr).append(voterColumn).append(editColumn).append(rmvColumn);
                $(tr).appendTo($(tbl).children('tbody'));
                // Append table to div to be displayed
                $('div#divEditPoll fieldset#selectPoll div#appendPolls').empty();
                $(tbl).appendTo('div#divEditPoll fieldset#selectPoll div#appendPolls');
                $(btnEditPoll).click(function() {
                    displayPollEditOptions(pollRef);
                    return false;
                });
                $(btnRemovePoll).click(function() {
                    deletePoll($(this), pollsRef);
                    return false;
                });

            }
        });
    });
}

マークアップは次のようなものになります...

<div id="divEditPoll">
            <form class="formee" action="">
                <fieldset id="selectPoll">
                    <legend>SELECT A POLL</legend>
                    <div class="formee-msg-success">
                    </div>
                    <div class="grid-12-12" id="appendPolls">
                    </div>
                </fieldset>
</div>

編集 - いくつかの行を入れ替えて、ボタンがドキュメントに追加されるまで click() イベントを設定しないようにしました。そのため、クリック イベントがアタッチされると、ボタン要素は確実に DOM に存在します。この問題は、これらのボタンに ID を設定していないことが原因でしょうか? イベントをアタッチするために ID ではなく変数参照を使用しているため、これは奇妙に思えます。

4

2 に答える 2

3

私が確認することは2つあります。

まず、同じ ID を持つ 2 つの要素がないことを確認します。その場合、jquery は最初のものにのみバインドするか、まったくバインドしない可能性があります。

次に、 jquery がクリック イベントのバインドを試行するに、要素が dom に追加されていることを確認します。コードが非同期で実行されている場合 (ajax を使用している場合に簡単に発生する可能性があります)、要素を作成する前にイベントをバインドしようとしている可能性があります。Jquery は要素を見つけられず、黙ってあきらめていました。

于 2013-07-01T02:56:00.287 に答える
0

動的に追加されたボタンには.on()を使用する必要があります

于 2013-07-01T02:50:41.790 に答える