1

当用户单击链接时,它会运行$.post以检索一些数据并显示它。其中一个链接会拉出一个会话表,每个会话旁边都有一个按钮。这是其中一个按钮的代码:

<button class="view_session btn btn-info" id="3f87d50493698d06b9b48abe36cd8fc8">Details</button>

这是我的 jQuery 函数:

$('.view_session').click(function(){
    $('#blanket').show();
    $('#load').show();
    $.post("admin/session.php", { id: $(this).attr('id') }, function(data){
        $('#sort').html(data);
        $('#first').hide();
        $('#load').hide();
        $('#blanket').hide();
    }); 
});

但什么也没有发生。我进行了Console.log测试,没有任何触发。有什么我必须做的,因为按钮是在页面最初加载后创建的?

4

2 回答 2

4

如果您正在动态添加按钮,.click除非它已经存在,否则不会绑定到它。您要么需要在按钮添加到 DOM后进行绑定,要么使用委托,如下所示:

$(document).on('click', '.view_session', function () {

(一个比更好的选择器更具体的选择器document)。

除此之外,作为函数的第三个参数$.post仅在成功时出现。您也可以使用延迟接口方法来检查失败和完成:

$.post(...).then(success).fail(failure).done(complete);
于 2012-12-14T14:50:57.090 回答
1

有什么我必须做的,因为按钮是在页面最初加载后创建的?

是的。

这样做的原因是处理程序附加到 jQuery 对象中当前选定的元素,因此这些元素必须存在于绑定发生的点。

解决方案是您要么必须手动将事件重新绑定到已添加的元素,要么使用委托绑定事件。

对于 jQuery 1.7 或更高版本on()与委托一起使用:

$("#YourclosestStaticElement").on("click", ".view_session", function () {
   //... same code as before
}

对于 jQuery 1.4.3 到/包括 1.6 使用delegate()

$("#YourclosestStaticElement").delegate(".view_session", "click", function () {
   //... same code as before
}

对于 jQuery 1.3 到/包括 1.4.3live()将是唯一的方法,除了手动重新绑定:

$(".view_session").live("click", function () {
   //... same code as before
}

此外,被弃用的原因有很多live(),例如它总是在触发事件之前冒泡到文档中,stopPropogation()例如,含义可能会成为一个问题。

完整的原因列表也在live()文档中。

文档中引用:

  • $(选择器).live(事件、数据、处理程序); // jQuery 1.3+
  • $(document).delegate(selector, events, data, handler); // jQuery 1.4.3+
  • $(document).on(事件、选择器、数据、处理程序); // jQuery 1.7+
于 2012-12-14T15:05:56.387 回答