奇怪的是,使用jquery inArray的行为

时间:2013-03-19 19:31:37

标签: javascript internet-explorer internet-explorer-8

你好,这似乎是在IE8上工作:

var clsName = link.parents("div.fixed_column").attr("class").split(" ");

if($.inArray("column_one", clsName)

虽然这个报告错误(在jquery中对象期望错误)。

var clsName = link.parents("div.fixed_column").attr("class");

这样做的正确方法是什么?我认为inArray的目的是jquery将处理跨浏览器问题。

2 个答案:

答案 0 :(得分:4)

不幸的是,这是间接回答你的问题,但是......你似乎想要检测一个元素是否有一个类,并且因为你已经在使用jQuery,所以只需使用hasClass方法 - { {3}}

有关您的特定代码,请尝试:

if (link.parents("div.fixed_column").hasClass("column_one")) {
    // It has the "column_one" class
}

您问题的最直接答案是link.parents("div.fixed_column").attr("class")返回单个字符串。当jQuery选择器(div.fixed_column)返回多个元素时,这在使用类时很有可能,使用获取信息的jQuery方法(如.attr),使用一个参数...来“获取”值)仅返回第一个匹配元素的值。

所以说选择器匹配3个元素:

["<div id='div30' class='fixed_column div30_class'></div>",
 "<div id='div2' class='fixed_column div2_class'></div>",
 "<div id='div17' class='fixed_column div17_class'></div>"]

然后.attr("class")返回的值为:fixed_column div30_class,因为它是第一个匹配的元素。

我不确定,但我认为你期望jQuery返回所有匹配元素值的数组,但事实并非如此。所以这并不意味着jQuery不会处理跨浏览器问题,只是意味着你需要查找方法所做/返回的内容。

我可以发誓jQuery 2.0可以选择做你想要的 - 直接来自调用getters(或类似的东西),但我再也找不到它了:(也许我记错了。不管怎么说,你可以轻松地使用$.each和/或$.map来查看每个匹配的元素,但这取决于您真正尝试使用它的内容。

答案 1 :(得分:1)

您无法使用.attr("class")将多个元素的属性读入数组。但是你为什么不直接在选择器中定位所需的类?

var cols = link.parents("div.fixed_column.column_one");

然后更改条件以检查空集:

if(cols.length) { ...