2012-09-09 49 views
0

我有以下HTML:如何禁用jQuery的多個鏈接?

<a title="Login" data-href="/MyAccount/Access/Login" 
    data-title="Admin" data-entity="n/a" 
    id="loginLink" class="nav-button dialogLink"><b>Login</b></a> 

<a title="Register" 
    data-href="/MyAccount/Access/Register" 
    data-title="Admin" data-entity="n/a" 
    id="registerLink" class="nav-button dialogLink"><b>Register</b></a> 

當在#loginLink或#registerLink用戶點擊我想 禁用鏈接並調用對話腳本。我創建了以下 功能:

$("#loginLink, #registerLink") 
    .click(function() { 
     $('#loginLink').prop('disabled', true); 
     $('#registerLink').prop('disabled', true); 
     dialog(this); 
    }); 

它正確地調用對話,但不會禁用鏈接,如果我 點擊按鈕不止一次它調用了多個對話框 對話框。有什麼我做錯了嗎?我看不出爲什麼它不起作用。

+0

'e.preventDefault()' – elclanrs

回答

1

如果你要綁定並隨時取消綁定事件的代碼存儲在一個功能,那麼你可以使用命名空間的事件與該函數的事件相關聯。

function dlog(e) { 
    e.preventDefault(); 
    dialog(this); 
} 

var $els = $("#loginLink, #registerLink"); 

$els.on('click.dlog', function(e){ dlog(e) }); // bind 
$els.off('.dlog'); // unbind 

編輯: 另一種選擇是使用one()其高度的情況下只有一次,那麼你就可以在關閉對話框再次附上該事件。

$els 
    .one(function(e) { dlog(e) }) 
    .dialog({ 
    beforeClose: function() { 
     $els.one(function(e) { dlog(e) }); 
    } 
    }); 
+0

@clclanrs - 你的語法是否正確。對不起,我以前沒有看到過這種情況。我不確定我瞭解您爲綁定和解除綁定設置的函數參數。 'click.dlog'和'.dlog'是什麼意思? –

+0

這些是命名空間事件。你可以閱讀更多[這裏](http://api.jquery.com/on/)。 'dlog'是「對話框」的簡稱,你可以使用任何你想要的命名空間。 – elclanrs

+0

你可以舉個例子。對不起,但我仍然無法理解你在$ els.on(和$ els.off(後來的函數參數)意思是什麼(但我理解dlog函數是如何工作的,你能否像其他建議那樣做,謝謝。我詢問了很多questins –

0

你需要做的是這樣的

$("#loginLink, #registerLink").click(function(e) { 
    e.preventDefault(); 
    dialog(this); 
}); 
1

你必須使用jQuery的on()off()方法綁定/解除綁定事件。設置disabled屬性對鏈接沒有影響,點擊事件仍然會被觸發。

在這裏你可以找到一個描述和演示: http://api.jquery.com/off/

+0

如果OP使用開/關(jQuery的1.7或更高要求的),綁定/解除綁定或代表/ undelegate無關緊要。 OP不必使用on/off,但只要事件未被綁定或阻止傳播,任何關閉方法都會執行。 – Nope

0
$("#loginLink, #registerLink").on("click", function() { 
dialog(this); 
return false; 
}); 

return false在jQuery將執行這兩個,e.preventDefaulte.stopPropagation其中第二個將防止冒泡的事件,這就是你所追求的。

附加信息: event.preventDefault() vs. return false