#javascript #jquery
#javascript #jquery
Вопрос:
Какой наиболее эффективный способ отфильтровать список классов для данного элемента?
<div class="foo bar"></div>
<div class="bim bar"></div>
$("div.bar").click(function(ev) {
alert("The non-bar class was:" ???);
});
Я знаю, что мог бы написать цикл for для просмотра ev.currentTarget.classList, но я хочу знать, есть ли способ получше.
РЕДАКТИРОВАТЬ: я хотел бы уточнить, что я хочу, чтобы предупреждение сообщало мне «foo» и «bim». Я не хочу заменять «bar», я просто хочу иметь возможность доступа к классам, которые НЕ являются bar. Спасибо.
Ответ №1:
Способа получить это с помощью jQuery нет, но я бы сделал:
$("div.bar").click(function(ev) {
var nonBarClasses = (' ' this.className ' ').replace(' bar ', ' ').split(/ /);
nonBarClasses.shift();
nonBarClasses.pop();
// nonBarClasses is now an array, with each element a class that isn't `bar`
alert("The non-bar class was: " nonBarClasses.join(" "));
});
Смотрите это в действии здесь: http://jsfiddle.net/PpUeX/2
Комментарии:
1. Я думаю, вы делаете это слишком сложным. Как насчет jsfiddle.net/ZkucZ/1 ?
2. @pimvdb: Я бы не сказал, что использовать
filter
функцию поверх String.replace проще; особенно когда вопрос касается эффективности. PlusArray.filter
не поддерживается в IE < 8.3. Туше, я упустил эффективность. Тем не менее, ваш в настоящее время включает посторонний элемент. jsfiddle.net/PpUeX/1
Ответ №2:
Вы можете получить всю строку класса из элемента с помощью jQuery.fn.attr()
, а затем split()
преобразовать ее в массив, с которым вы можете делать все, что захотите.
$("div.bar").click(function(ev) {
var classes = $(this).attr('class').split(' '); // [0:'foo', 1:'bar']
});
РЕДАКТИРОВАТЬ: Что касается предоставления «jQuery»-способа получения всех классов, отличных от «bar», вы могли бы создать временный clone()
из выбранного элемента и removeClass()
класса bar, прежде чем что-либо с ним делать:
$("div.bar").click(function(ev) {
var noBarClasses = $(this)
.clone().removeClass('bar') // <-- no more "bar"
.attr('class').split(' '); // [0:'foo']
});