2013-08-02 135 views
0

我有以下代碼:如何防止調用一個函數多次jQuery中

$('#main-button').click(function(){ 

    $('#button').click(function(){ 
     alert('something'); 
    }); 
}); 

每當我點擊#主按鈕,說3次,然後點擊#鍵,3個彈出對話框出現。我該如何防止這種情況,所以無論點擊多少次#按鈕,點擊#按鈕時只會出現1個彈出框?

+0

這就是你告訴它做的 - 每次點擊'主button'時間,_another_事件處理程序添加到'button' ... – Basic

+1

當你點擊'main-按鈕'你將一個事件處理程序附加到''按鈕'上。如果您單擊三次主按鈕,則會將三個處理程序附加到您的按鈕上。這就是爲什麼3警報出現。你可以通過聲明一個全局布爾值來防止這個。當點擊主按鈕時,檢查布爾值是否設置爲true。如果沒有,請附加處理程序並將布爾值設置爲true。下一步點擊主按鈕不會添加一個新的處理程序到您的按鈕 – TCHdvlp

回答

5

或者您可以使用此代碼:

$('#main-button').click(function(){ 

    $('#button').unbind("click").click(function(){ 
     alert('something'); 
    }); 
}); 

更新#1

unbind從jQuery 1.7開始已棄用。改用off方法。

5

使用jQuery one,或解釋你正在嘗試做什麼,可以有更好的解決方案。

$('#main-button').click(function(){ 

    $('#button').one('click',function(){ 
     alert('something'); 
    }); 
}); 

例如,如果你的問題是像#button只有當你點擊#main-button然後使用jQuery on()使用代表團在適當的水平出現。(我用的代表團從文檔作爲例子並不清楚)

$('#main-button').click(function(){ 

}); 


$(document).on('click','#button',function(){ 
    alert('something'); 
}); 
+0

好吧,我假設第一次點擊顯示一個彈出式窗口和secong點擊是在彈出式窗口,所以兩個點擊總是在工作流中完成。如果情況並非如此,我提供了第二種解決方案。 – sabithpocker

1

如果只想爲#button點擊顯示彈出窗口,爲什麼要在#主按鈕點擊函數中放置#button點擊函數?

你可以單獨使用它們;

$('#main-button').click(function(){ 

}); 


$('#button').click(function(){ 
    alert('something'); 
}); 
0

要麼寫:

$('#button').click(function(){ 
    alert('something'); 
    return false; 
}); 

或者,

$('#button').click(function(e){ 
    e.preventDefualt(); 
    alert('something'); 
}); 

我希望它能幫助。

0

一個簡單的解決辦法是設置一個變量的按鈕以外,然後改變該值在第一次被點擊

var clicked = 0; 
$('#button').click(function(){ 
    if(clicked === 0) { 
    alert('something'); 
    clicked = 1; 
    } 
}); 
0

的解決方案是在那裏。您的#main-button的事件處理程序會在您每次單擊它時爲其他按鈕分配一個點擊處理程序。因此,你會得到X警報。

兩種可能的快速修復,兩者不優雅,但只是告訴你哪裏出了問題:

var isAssigned = false; 
$('#main-button').click(function(){ 
    if (!isAssigned) { 
     $('#button').click(function(){ 
      alert('something'); 
     }); 
    } 
    isAssigned = true; 
}); 

function myHandler() { 
    $('#button').click(function(){ 
     alert('something'); 
    }); 
} 

$('#main-button').click(function(){ 
    $('#button').off('click', myHandler); 
    $('#button').on('click', myHandler); 
}); 
0

War10ck: 確實, 已更新代碼&小提琴。

最好的解決方案就是在鏈接被點擊時解除綁定點擊事件。

$(function() { 
    $('#link').on('click', function() { 
     if (!$(this).data('processing')) { 
      $(this).data('processing', true); 
      alert('A was clicked!!'); 
      $(this).data('processing', false); 
     } 
    }); 
}); 

http://jsfiddle.net/6jsgs/

+0

第一次點擊鏈接時,您只能操作。該警報僅出現一次,因爲您立即解除綁定。 – War10ck