2013-08-04 88 views
0

我有一個click事件打破JavaScript函數

$('#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 ove,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將剛剛結束的單擊事件在那個事件裏面。我的意思是 - 如果你交換上述註釋行//如果新船用下面的代碼:

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

此代碼只會結束這個點擊事件,但不是moveShip功能。

我希望自己明白了... 謝謝!

+0

您是否嘗試輸入Konami代碼來查看會發生什麼? – adeneo

回答

3

你可以取消綁定現有click事件處理程序事先:

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

如果有應保持其他click事件處理程序,我建議使用命名空間的事件

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

雖然在思考之後,不是一遍又一遍地綁定事件處理程序,而是可以j烏斯季綁定他們一次,並通過共享變量所需的數據:

$(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變化。當然這是一個簡化的例子,因爲我不知道你的代碼,但也許它有幫助。

+0

是的!謝謝! –