2011-05-18 67 views
2

我有一个select元素,有几个自定义属性用于在运行中验证它并显示相应的消息。属性的名称是骆驼套管在jQuery .attr()似乎是区分大小写的

<select validationMessage="Must select something" ... >... 

的问题是,在jQuery的版本低于1.6 .attr()似乎是区分大小写。更有问题的是,它不会获取原来的套管属性。在Chrome浏览器中,这与Firefox中的工作方式相同,但在Internet Explorer中按预期工作(因为它应该是不区分大小写)。有趣的是,任何套管(除了原装套管)都可以工作。这个是JSFiddle example这个问题。您可以更改左侧的jQuery lib版本并点击“运行”以检查它是如何与其他版本一起工作的。

我该如何缓解这个问题?

+0

看到这个http://stackoverflow.com/questions/3967869/writing-jquery-selector-case-insensitive-version – Tx3 2011-05-18 10:02:03

+1

这不是问题的欺骗,那问题是关于选择。 – 2011-05-18 10:22:16

回答

2

如果您将attr()替换为javascript等效的getAttribute(),它似乎不区分大小写。

唯一的缺点是,你必须get() JS的第一个对象:

sel.get(0).getAttribute("validationMessage")

See the result here

+0

我知道这个DOM函数,但我不确定它的浏览器支持和特性。反正jQuery不是在后台使用相同的函数吗? – 2011-05-18 10:05:15

+0

@罗伯特不在1.6之前。1.5.2中的方法是[elem[name]](https://github.com/jquery/jquery/blob/1.5.2/src/attributes.js#L351)。 – lonesomeday 2011-05-18 10:09:09

8

jQuery的改变了attr()作品1.6。在此版本之前,attr()大都直接映射到属性under the hood —不是人们可能认为的属性。由于DOM属性名称通常是单个单词,因此jQuery将大多数字符串转换为小写字母,并为骆驼式的少数属性名称设置了例外。 jQuery采用这种方式的原因是为了处理浏览器不一致和getAttribute()setAttribute()中的错误。

从jQuery 1.6开始,对于尚未设置的属性,.attr()方法返回undefined。另外,.attr()不应该用于普通对象,数组,窗口或文档。要检索和更改DOM属性,请使用.prop()方法。 source

在1.6,attr()映射到getAttribute()under the hood,而新prop()方法检索的属性值。

属性和属性之间的差异在特定情况下可能很重要。在jQuery 1.6之前,.attr()方法在检索某些属性时有时会考虑属性值,这可能会导致行为不一致。从jQuery 1.6开始,.prop()方法提供了显式检索属性值的方法,而.attr()只检索属性。 source

+2

+1感谢Andy的深度信息 – 2011-05-18 16:42:32