Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止单击事件在使用jQuery将其重新“打开”时触发?_Jquery - Fatal编程技术网

如何防止单击事件在使用jQuery将其重新“打开”时触发?

如何防止单击事件在使用jQuery将其重新“打开”时触发?,jquery,Jquery,我有一个邮件主题表,我已经使每个tr都可以点击导航到邮件详细信息页面。但是,还有一个垃圾箱图标,用户可以通过$.ajax单击该图标来标记要删除的消息,这是通过首先关闭tr事件处理程序来完成的。问题在于,当将tr click事件处理程序重新打开时,将处理click,并将用户导航到details页面 我试图添加e.stopPropogation;在$.ajax调用之后和tr的on设置之前,但这会阻止事件被打开。在之后添加它不会阻止所需的行为 所以我的问题是,在关闭tr之后,如何为tr重新打开clic

我有一个邮件主题表,我已经使每个tr都可以点击导航到邮件详细信息页面。但是,还有一个垃圾箱图标,用户可以通过$.ajax单击该图标来标记要删除的消息,这是通过首先关闭tr事件处理程序来完成的。问题在于,当将tr click事件处理程序重新打开时,将处理click,并将用户导航到details页面

我试图添加e.stopPropogation;在$.ajax调用之后和tr的on设置之前,但这会阻止事件被打开。在之后添加它不会阻止所需的行为

所以我的问题是,在关闭tr之后,如何为tr重新打开click事件,而不是在过程中关闭事件

代码:


由于垃圾箱图标是tr的后代,因此无需关闭行上的事件处理程序。简单地说就是拼写,也许这就是为什么它不适合你?从垃圾箱图标单击处理程序

$("#messageTable tbody tr").on("click", function () {
    var id = $(this).find('td:first').find('input').val();
    window.location.replace('/Messages/Read/'+id);
});

$('.icon-trash').on("click", function (e) {

    // prevent the click reaching the row
    e.stopPropagation();

    // grab the message Id from the hidden input
    var messageId = $(this).parent().find('input').val();
    var tr = $(this).parent().parent();

    var request = $.ajax({
        url: "MarkMessageForDeletion"
        , type: "GET"
        , data: { id: messageId }
        , dataType: "json"
        , async: true
        , success: function (data) {
            if (data === "1") {
                tr.remove();
            }
        }
    });
});
值得一提的是,您可以通过使用var tr=$this.closest'tr'使代码更加健壮;而不是.parent.parent。查找最接近的匹配祖先。

我假设您在messageTable tbody trs中有.icon垃圾桶元素,您可能要做的是阻止它们冒泡并忘记offclick调用:


所发生的事情是,点击在按钮上被处理,冒出气泡,它也在tr元素上被处理。e.stopPropagation;返回值为假;声明阻止了这种情况的发生,它不会冒泡。off和on调用没有改变此行为,因为它们实际上没有停止冒泡,冒泡在返回此函数后开始。

是否尝试添加“return false;”?return false的作用不仅仅是停止播放,它还可以防止默认播放。在这种情况下可能不重要。但是,如果您调用了StopRoPagation,则返回false没有任何意义,除非您还想防止默认值。这是我很久以前的一个老习惯,但感谢您澄清这一点,我忘记了。感谢您的回答和关于最近的提示。@user1194094:不用担心,很高兴这有所帮助。另一件你可能会觉得方便的事情是事件委派。请注意,我可以添加一行,而不必做任何事情来连接处理程序,因为它们实际上连接在tbody上,而不是单个tr或.icon垃圾元素上。最好的,谈谈如何超越,感谢您的示例,它将帮助我将代码从功能性转换为最佳。
$("#messageTable tbody tr").on("click", function () {
    var id = $(this).find('td:first').find('input').val();
    window.location.replace('/Messages/Read/'+id);
});

$('.icon-trash').on("click", function (e) {

    // prevent the click reaching the row
    e.stopPropagation();

    // grab the message Id from the hidden input
    var messageId = $(this).parent().find('input').val();
    var tr = $(this).parent().parent();

    var request = $.ajax({
        url: "MarkMessageForDeletion"
        , type: "GET"
        , data: { id: messageId }
        , dataType: "json"
        , async: true
        , success: function (data) {
            if (data === "1") {
                tr.remove();
            }
        }
    });
});
$("#messageTable tbody tr").on("click", function () {
    var id = $(this).find('td:first').find('input').val();
    window.location.replace('/Messages/Read/'+id);
});

$('.icon-trash').on("click", function (e) {
    e.stopPropagation(); 

    // grab the message Id from the hidden input
    var messageId = $(this).parent().find('input').val();
    var tr = $(this).parent().parent();

    var request = $.ajax({
        url: "MarkMessageForDeletion"
        , type: "GET"
        , data: { id: messageId }
        , dataType: "json"
        , async: true
        , success: function (data) {
            if (data === "1") {
                tr.remove();
            }
        }
    });

    // I also like to return false from the handler,
    // which is an old-school way of e.stopPropagation()
    return false;
});