2010-10-23 122 views
1

我的網頁上的某些超鏈接只有在網格控件中選擇元素時才能啓用。禁用超鏈接

我有機會注入一些代碼,當頁面上選擇一行,我想啓用/禁用這些超鏈接使用jQuery代碼。

有什麼建議嗎?

+0

這些超鏈接是什麼樣的?他們只有hrefs或者onclick事件嗎? – 2010-10-23 14:26:34

+0

他們有hrefs,但也有jQuery的功能,使用這些hrefs綁定點擊事件給他們,並防止冒泡。所以,絕對的答案是,他們只有點擊事件 – Lorenzo 2010-10-23 14:30:03

回答

6

不禁用它們會更容易,但僅僅是爲了防止它們做他們自動執行的操作。我會用$().delegate做到這一點:

$(document.body).delegate('a', 'click', function(e) { 
    if ($(this).is('.disabled')) { // or whatever logic here 
     e.preventDefault(); 
    } 
}); 

您可以在有條件的條款,例如,在使用任何邏輯檢查頁面上的其他元件的存在,檢查配置變量等

編輯此,如果有越往上樹停止傳播的處理程序將不能可靠地工作。如果你擁有的處事傳播功能的負荷,你的最簡單的辦法是做條件檢查每個函數的開始:

$('#your_link').click(function(e) { 
    if (logic) { 
     e.stopPropagation(); 
     e.preventDefault(); 
    }; 

    // the rest of your function here 
}); 
+1

lonesomeday - 如果你打算在''上放置'.delegate()',你可能只需要使用'.live()',因爲你是沒有真正獲得任何效率。 – user113716 2010-10-23 15:05:36

+1

@Patrick(1)'live'總是效率不高,因爲它做了不必要的原始選擇; (2)'delegate'具有更多的邏輯語法,IMO。 – lonesomeday 2010-10-23 16:55:40

+0

+1關於邏輯語法,我完全同意。我想我可以認爲這是一個引人注目的理由,就像你所做的那樣使用'.delegate()'。關於原始選擇,這是我沒有考慮過的一個很好的觀點。我完全改正了。 :O) – user113716 2010-10-23 17:09:38

1

這將取決於一點點行是如何選擇。

這個例子假設與類.select<tr><a>點擊將禁用行(除了.select鏈接)中有一個href屬性的所有鏈接。

$('#myTable tr a.select').click(function() { 
    $(this).closest('tr').find('a:not(.select)[href]').addClass('disabled'); 
}); 

因此,每個在具有.click()處理行的鏈接應該首先檢查,看它是否發射其代碼之前有.disabled類。

$('#myTable tr a.someClass').click(function(e) { 
     // sounds like you want these either way? 
    e.preventDefault(); 
    e.stopPropagation(); 
    if(!$(this).hasClass('disabled')) { 
     // run code when not disabled 
    } 
}); 

有關使用類這個好處是,你可以爲了給視覺線索的鏈路被禁用的用戶添加CSS到該類。