jQuery 1.7选择器错误

时间:2011-11-08 16:11:47

标签: jquery ajax

这是我的第一个问题。

我正在使用jQuery开发一个完全Ajax系统,它在1.6.2下工作正常。当我尝试将其升级到1.7时,这段代码停止正常工作:

$("a[class!='']").live("click",function(e){
    e.preventDefault();
});

在1.6.2中,如果它们有一个类,它会阻止所有超链接标记作为链接工作,但是在1.7中,它阻止所有链接作为真实链接工作,即使是那些没有类的链接。

小提琴:http://jsfiddle.net/hBehg/

4 个答案:

答案 0 :(得分:6)

使用$('a[class]'),这将选择具有class属性的所有元素。 正如我在评论中所说,如果元素甚至没有class属性,则检查空值可能不起作用。

更新:正如@Sidnicious所指出的,文档描述了此选择器还将选择那些没有该属性的元素。如果它不是1.6,那么它实际上肯定是该版本中的一个错误,或者他们改变了描述而没有提到它。

当然,如果您确实有一个空的class属性,即<a class="">,则无效。

DEMO

更新2:正如@lonesomeday在评论中提到的那样,$('a[class][class!=""]')确实按照您的预期$(a[class!=""])工作。

正如其他人所说,您可以在jQuery 1.7中更改为on,它统一了事件处理方法,但它无法解决您的特定问题。

答案 1 :(得分:3)

jQuery docs describe the [name!=value] selector like this

  

选择既没有指定属性,也没有指定属性但没有特定值的元素。

在您的情况下,它将选择没有a或其类不等于空字符串的每个class<a></a><a class=""></a>不一样。

这实际上可能是jQuery 1.6中的一个错误!

答案 2 :(得分:1)

您可以使用.filter在jQuery 1.7中获得所需的结果:

$('a').filter('[class]').on("click",function(e){
    e.preventDefault();
});

http://jsfiddle.net/mblase75/hBehg/1/

如果您将.on替换为.live,则它不再有效:

http://jsfiddle.net/mblase75/hBehg/4/

尽管.bind工作正常:

http://jsfiddle.net/mblase75/hBehg/5/

答案 3 :(得分:1)

尝试以下

$("a").live("click",function(e){
    if ($(this).attr('class') === undefined) {
        e.preventDefault();
    }
});

我已经验证了这适用于1.7和1.6.4。它不如包含谓词的选择器理想,但它将完成工作。