2010-10-23 105 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到该类。