【问题标题】:How to bind Jquery event dynamicaly如何动态绑定Jquery事件
【发布时间】:2014-07-23 16:31:55
【问题描述】:

我已经动态生成了表格,

<c:forEach var="user" items="${usermap}">
  <tr>
    <td>${user.getUserName()}</td>
    <td>${user.getIsActive()}</td>
    <td class="status">${user.getBadLoginAttempts()}</td>
    <c:choose>
    <c:when test="${user.getBadLoginAttempts()=='Active'}">
    <td><a href="#" class="btn btn-sm btn-primary unlockBtn" id="togBtn_${user.getUserName()}" >Lock</a></td>
    </c:when>
    <c:otherwise>
    <td><a href="#" class="btn btn-sm btn-primary unlockBtn" id="togBtn_${user.getUserName()}" >UnLock</a></td>
    </c:otherwise>
    </c:choose>
  </tr>
</c:forEach>

我在点击链接时做一些数据库操作,它工作正常。所以脚本是,

 $(document).ready(function(){
$(document).on('click','.unlockBtn',(function (e) {
   //get the user id
   var $this = $(this);
   var userStatus=$(this).closest('tr').find('td:eq(2)').text();
   if(userStatus=='Active'){
       alert("Active in if");
       alert(userStatus);
       $.post('<%=request.getContextPath()%>/controller/UserLockController',{'userName':$(this).closest('tr').find('td:eq(0)').text()},
                function(data)
                {
                  $this.closest('tr').find('.status').html(data);
                  $this.closest('tr').find('td:eq(3)').replaceWith("<td><a href='#' class='btn btn-sm btn-primary unlockBtn' >Unlock</a></td>");

                });
   }
   else{
       alert(userStatus);
       $.post('<%=request.getContextPath()%>/controller/UserUnlockController',{'userName':$(this).closest('tr').find('td:eq(0)').text()},
                function(data)
                {
                  $this.closest('tr').find('.status').html(data);
                  $this.closest('tr').find('td:eq(3)').replaceWith("<td><a href='#' class='btn btn-sm btn-primary unlockBtn' >Lock</a></td>");

                });
   }
}));
 });

所以每个功能都很好。我面临的问题是每一行我只能锁定或解锁一次。我一直想知道如何实现它。请帮帮我。

【问题讨论】:

  • 而不是使用 document.ready 尝试使用类似的东西 $(document).bind('DOMSubtreeModified', function () {}
  • 请注意您使用的 jQuery 版本。弃用在这里:api.jquery.com/on

标签: jquery html jstl


【解决方案1】:

试试这个:

$(document).on("click", ".generateTable tr", function () {

 // Your code

});

Click 事件可以替换为任何你想要的 jquery 事件。

【讨论】:

    【解决方案2】:

    事件委托工作正常。所以,我唯一能想到的就是:

    1. 从您的帖子返回并替换“状态”列的 html 的数据并未将该列的值设置为“活动”,因此 if 语句不运行 (这是我会开始寻找)
    2. 在某些奇怪的浏览器中发生了一些奇怪的事情,导致在您替换整个表格列时事件委托失败。我无法想象这确实是这种情况,但我突然想到您可以大大简化您的代码,但只需更新链接的文本而不是替换整个&lt;td&gt;

    所以,我建议更改这一行:

    $this.closest('tr').find('td:eq(3)').replaceWith("<td><a href='#' class='btn btn-sm btn-primary unlockBtn' >Unlock</a></td>");
    

    这一行:

    $this.closest('tr').find('td:eq(3)').replaceWith("<td><a href='#' class='btn btn-sm btn-primary unlockBtn' >Lock</a></td>");
    

    到:

    $this.text("Unlock");
    

    和:

    $this.text("Lock");
    

    这种方式更具可读性。这是fiddle 的示例。

    【讨论】:

    • K 。 .问题是我只能在每一行中锁定或解锁一次,
    • 在 fiddel 中它是静态选项卡,它工作正常,我认为在我的情况下动态表提供了一些 pbm。
    • 我知道,因此我建议查看您在帖子数据中返回的内容并将其设置为在 if 语句中用作条件的列的 html。如果它第一次有效,但随后无效,那么这会让我看看您第一次和第二次点击之间有什么不同。这不是事件委托,因为其他一切都在可测试的范围内工作,所以我会先看看。
    • 我想它可能是您的动态表,但由于您的事件委托正在等待事件一直冒泡到文档(并且它至少工作一次),我已经排除了这一点。你为什么不用静态表测试一下,看看它是否有效,那么你肯定会知道。
    • 实际上,这给了我另一个测试的想法......看看当你的处理程序附加到某些祖先元素时是否有不同的结果,当 DOM 准备好时,这些元素肯定在页面上,例如 $( 'body').on('click', '.unlockBtn' ...
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2014-09-17
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多