2013-07-01 61 views
1

因此,我已经为Firebase数据库中的每个数据节点(“轮询”)动态添加了EDIT和REMOVE按钮。我有一个使用jQuery为onclick监听器分配函数的函数,但奇怪的是,事件仅在恰好是单个节点时触发,因此只有一对EDIT/REMOVE按钮。当有多个节点和多对按钮时,不会触发。下面是其中的活动添加到按钮的JavaScript ...当有多个动态添加的按钮时,onclick事件不会触发

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来附加事件。

+0

何时调用此函数displayCurrentPollsForEditing()? – Arunu

+0

当另一个按钮被点击。 – MassStrike

回答

1

你应该使用.on()动态添加按钮

+0

它在这种情况下是不正确的,因为OP是添加事件处理程序到每个创建的按钮 –

4

有两件事情我会检查。

首先,确保你没有两个具有相同ID的元素。如果你这样做,jquery可能只绑定到第一个,或者根本不绑定。

其次,确保将元素添加到dom 之前 jquery尝试绑定click事件。如果代码异步运行,如果使用ajax很容易发生,那么您可能会在创建元素之前尝试绑定事件。 Jquery将无法找到该元素,然后默默放弃。

+0

嗯好吧,它可以很容易地在我的情况。让我检查,谢谢。 – MassStrike

+0

你真的认为ID可能是问题吗?我实际上没有使用id来将事件或按钮绑定到文档。实际上,我没有为这些按钮设置id,这使我倾向于其他潜在问题,因为click事件是在异步函数调用中设置的。我想知道的是,如何以编程方式测试一个元素是否加载到DOM中,然后只在其中设置事件?一个例子是可能的,还是链接?谢啦。 – MassStrike

相关问题