使用preventDefault()& amp;禁用锚点事件排序

时间:2011-05-27 12:45:34

标签: jquery html events

在我的应用程序中,我使用样式锚标签与按钮一样。我需要能够禁用按钮,但锚标签没有禁用属性。我尝试过的方法是在锚点击事件中使用preventDefault(),如下所示:

$('a.disabled').click(function (e) {
    e.preventDefault();
});

这不会禁用该链接。但是,如果我只使用'a'选择器$('a').click(function()...,它会禁用链接。我认为这与事件的优先级或基于选择器的事件排序有关。

任何人都知道解决这个问题吗?

更新

我刚刚意识到上面的代码在引用选择器中的锚点id时有效,这再次让我相信它与CSS选择器优先级有关,即id引用样式覆盖类样式等。

3 个答案:

答案 0 :(得分:4)

我猜你在绑定click事件处理程序之后设置了disabled类。如果您的元素与绑定时的选择器不匹配,则无效。如果您希望运行处理程序,以防您的元素将来与匹配,则需要使用live()

$('a.disabled').live("click", function(e){
    e.preventDefault();
});

答案 1 :(得分:1)

似乎你没有将disabled类设置为锚点。你确定它们看起来像

<a href="" class="disabled"></a>

答案 2 :(得分:0)

即使您在同一个链接上有多个事件,但这个事件并不是第一个执行的,因此preventDefault()应该可以正常工作;因为默认操作是在整个事件队列完成运行后完成的。

我认为发生的事情是你的事件永远不会发生;确保您已将禁用的课程影响到您的链接

<a href="..." class="disabled"></a>

并且您没有任何事件在其运行期间取消队列。这是你应该寻找的:

event.stopPropagation() // stop event bubbling, prevent the event to apply on his parent eg if your <a> is in a div, prevent the div click event queue to run -- SHOULDN'T BE YOUR PROBLEM
event.stopImmediatePropagation() // same as stopPropagation() and in addition stop the event queue on this element (so if you have 3 clicks event on your link and the first calls this, the other two won't run)
return false; // fully cancel the event, has the effect to also stop the event queue, similar to calling preventDefault() AND stopImmediatePropagation() -- SHOULDN'T BE YOUR PROBLEM

要100%确定您可以通过将链接更改为<a href="#" class="disabled>(以便页面不会重新加载)并在活动期间执行console.log('test')来确认您的活动是否正在运行。如果未调用,则不会受到影响或已被取消。