0

我有一个点击事件

$('#ship_Move').click(function (event) {                
        event.stopPropagation();
        $('.shipActionsList').remove();
        moveShip(shpID);
    });

调用函数 moveShip

function moveShip(shp_id) {
    $('.fieldDivs').click(function () {       
        $("#hello").append("Move "+ shp_id + "to " + $(this).attr('id')+"<br/>");
    });
}

调试给出了正确的结果——但有一个问题。如果我首先单击#ship_Move 元素 4 次,然后选择一个目的地 (.fieldDivs),我会得到:

将 162 移动到 FD455

将 162 移动到 FD455

将 162 移动到 FD455

将 162 移动到 FD455

因为 moveShip 函数已经被调用了 4 次,每个都在等待一个 .fieldDivs 元素被点击,当它被点击的时候,所有 4 个都追加了他们的结果(162 是我要移动的船 ID,FD455是它的目的地)。

我需要的是以下几行:

function moveShip(shp_id) {
    $('.fieldDivs').click(function () {       
        $("#hello").append("Move "+ shp_id + "to " + $(this).attr('id')+"<br/>");
        // IF A NEW #SHIP_MOVE IS CLICKED, END THIS FUNCTION AS IT WILL BE CALLED AGAIN
    });
}

我知道我可以返回 false 来中断函数,但是对于单击事件,我需要一个新函数,因此返回 false 只会结束该事件中的单击事件。我的意思是 - 如果你用下面的代码交换上面的注释行 //IF A NEW SHIP:

 $('.ship_Move').click(function () {       
         //   return false would break this function
        });

这段代码只会结束这个点击事件,而不是 moveShip 函数。

我希望我让自己足够清楚......谢谢!

4

1 回答 1

3

click您可以事先取消绑定现有的事件处理程序:

$('.fieldDivs').off('click').click(function() {
   // ...
});

如果还有其他click应该保留的事件处理程序,我建议使用命名空间事件

$('.fieldDivs').off('click.move').on('click.move', funciton() {
   // ...
});

但是,经过考虑,您可以只绑定一次并通过变量共享必要的数据,而不是一遍又一遍地绑定事件处理程序:

$(function() {
   var shpID = ...; // however this is set

    $('#ship_Move').click(function (event) {                
        event.stopPropagation();
        $('.shipActionsList').remove();
        // set shpID here somehow?
    });

    $('.fieldDivs').click(function () {       
        $("#hello").append("Move "+ shpID + "to " + $(this).attr('id')+"<br/>");
    });
});

看起来您不必仅仅因为shpID更改就绑定新的事件处理程序。当然这是一个简化的例子,因为我不知道你的代码,但也许它有帮助。

于 2013-08-04T22:30:36.390 回答