2013-03-19 2 views
0

Здравствуйте это, кажется, работает на IE8:Странно то поведение с JQuery inArray

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

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

Хотя это один сообщает об ошибке (Object ожидается errror в JQuery).

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

Каков правильный способ сделать это? Я думал, что цель inArray заключается в том, что jquery будет обрабатывать проблемы с перекрестным браузером.

+0

«Правильный» способ определить, имеет ли элемент класс, использовать '$ (" element "). hasClass (" className ");' - http://api.jquery.com/hasClass/ – Ian

+0

@ Кажется, это правда, я не знал об этом. Я использовал этот пока я догадываюсь, что отвечает на мой вопрос, если вы хотите ответить, я был бы умен и принимаю – London

+0

, каково значение для ссылки – blackhawk

ответ

4

К сожалению, это косвенно отвечает на ваш вопрос, но ... Вы, кажется, ищет, чтобы обнаружить, если элемент имеет класс, и так как вы уже используете JQuery, просто использовать hasClass метод - http://api.jquery.com/hasClass/

Для вашего конкретного кода, попробуйте:

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 есть варианты для того, чтобы делать то, что вы хотите - прямо от вызова геттеров (или чего-то подобного), но я больше не могу его найти :(Может быть, я помню неправильно. вы можете легко использовать $.each и/или $.map, чтобы посмотреть на каждый согласованный элемент, но это зависит от того, что вы на самом деле пытались сделать с ним.

1

Вы не можете прочитать атрибуты нескольких элементов в массиве с помощью .attr("class"). Но почему бы вам просто не настроить целевой класс в селекторе?

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

Затем измените ваш условный, чтобы проверить наличие пустого множества:

if(cols.length) { ... 
+0

«Вы не можете прочитать атрибуты нескольких элементов в массиве с' .attr ("class") '" - это не имеет значения ... когда вы используете какой-либо селектор и несколько элементов возвращаются, а затем используйте getter для '.attr', он вернет класс первого сопоставленного элемента. В любом случае, мне тоже нравится ваше решение. – Ian

+0

Я сказал это, потому что это то, что пытался сделать ОП. – bfavaretto

+0

Вау, да, извините ... Я думаю, что неправильно понял то, что пытался использовать OP, что привело к ошибке. – Ian

Смежные вопросы