Получить список классов для элемента с помощью jQuery
Есть ли способ в jQuery перебрать или назначить массиву все классы, которые назначены элементу?
ех.
<div class="Lorem ipsum dolor_spec sit amet">Hello World!</div>
Я буду искать "специальный" класс, как в "dolor_spec" выше. Я знаю, что я мог бы использовать hasClass(), но фактическое имя класса может не обязательно быть известно в то время.
Ответы
Ответ 1
Вы можете использовать document.getElementById('divId').className.split(/\s+/);
, чтобы получить массив имен классов.
Затем вы можете перебирать и находить тот, который вам нужен.
var classList = document.getElementById('divId').className.split(/\s+/);
for (var i = 0; i < classList.length; i++) {
if (classList[i] === 'someClass') {
//do something
}
}
jQuery вам действительно не помогает...
var classList = $('#divId').attr('class').split(/\s+/);
$.each(classList, function(index, item) {
if (item === 'someClass') {
//do something
}
});
Ответ 2
Почему никто не просто перечислил.
$(element).attr("class").split(/\s+/);
ОБНОВЛЕНИЕ: Как указывает @MarkAmery, вы не можете просто .split(' ')
, потому что имена классов могут быть разделены любым пробелом.
Ответ 3
Вот плагин jQuery, который будет возвращать массив всех классов, в которых сопоставленный элемент имеет
;!(function ($) {
$.fn.classes = function (callback) {
var classes = [];
$.each(this, function (i, v) {
var splitClassName = v.className.split(/\s+/);
for (var j = 0; j < splitClassName.length; j++) {
var className = splitClassName[j];
if (-1 === classes.indexOf(className)) {
classes.push(className);
}
}
});
if ('function' === typeof callback) {
for (var i in classes) {
callback(classes[i]);
}
}
return classes;
};
})(jQuery);
Используйте его как
$('div').classes();
В вашем случае возвращает
["Lorem", "ipsum", "dolor_spec", "sit", "amet"]
Вы также можете передать функцию методу, который будет вызываться для каждого класса
$('div').classes(
function(c) {
// do something with each class
}
);
Вот jsFiddle, который я установил для демонстрации и тестирования http://jsfiddle.net/GD8Qn/8/
Миниатюрный Javascript
;!function(e){e.fn.classes=function(t){var n=[];e.each(this,function(e,t){var r=t.className.split(/\s+/);for(var i in r){var s=r[i];if(-1===n.indexOf(s)){n.push(s)}}});if("function"===typeof t){for(var r in n){t(n[r])}}return n}}(jQuery);
Ответ 4
В поддерживающих браузерах вы можете использовать элементы DOM classList
.
$(element)[0].classList
Это массивный объект, перечисляющий все классы, которые имеет этот элемент.
Если вам нужно поддерживать старые версии браузера, которые не поддерживают свойство classList
, связанная страница MDN также включает в себя прокладку для нее - хотя даже прокладка не будет работать в версиях Internet Explorer ниже IE 8.
Ответ 5
Вы должны попробовать следующее:
$("selector").prop("classList")
Он возвращает массив всех текущих классов элемента.
Ответ 6
var classList = $(element).attr('class').split(/\s+/);
$(classList).each(function(index){
//do something
});
Ответ 7
$('div').attr('class').split(' ').map(function(cls){ console.log(cls);})
Ответ 8
Update:
Как правильно заметил @Ryan Leonard, мой ответ на самом деле не исправляет то, что я сделал сам... Вам нужно как обрезать, так и удалить двойные пробелы с (например) string.replace(/+/g, "").. Или вы можете разделить имя el.className, а затем удалить пустые значения с помощью (например) arr.filter(Boolean).
const classes = element.className.split(' ').filter(Boolean);
или более современный
const classes = element.classList;
Старый:
Со всеми данными ответами вы никогда не должны забывать пользователя .trim() (или $.trim())
Поскольку классы добавляются и удаляются, может случиться, что между строкой класса существует несколько пробелов. 'class1 class2 class3 '..
Это превратилось бы в ['class1', 'class2', '', '', '', 'class3']..
При использовании обрезки удаляются все несколько пробелов.
Ответ 9
Возможно, это тоже поможет. Я использовал эту функцию для получения классов элемента childern.
function getClickClicked(){
var clickedElement=null;
var classes = null;<--- this is array
ELEMENT.on("click",function(e){//<-- where element can div,p span, or any id also a class
clickedElement = $(e.target);
classes = clickedElement.attr("class").split(" ");
for(var i = 0; i<classes.length;i++){
console.log(classes[i]);
}
e.preventDefault();
});
}
В вашем случае вы хотите, чтобы класс doler_ipsum u мог сделать это сейчас calsses[2];
.
Ответ 10
Спасибо за это - у меня была аналогичная проблема, так как я пытаюсь программно связать объекты с иерархическими именами классов, даже если эти имена могут не быть известны моему script.
В моем script мне нужен тег <a>
, чтобы включить/отключить текст справки, указав тег <a>
[some_class]
плюс класс toggle
, а затем предоставив ему текст помощи классу [some_class]_toggle
. Этот код успешно находит связанные элементы с помощью jQuery:
$("a.toggle").toggle(function(){toggleHelp($(this), false);}, function(){toggleHelp($(this), true);});
function toggleHelp(obj, mode){
var classList = obj.attr('class').split(/\s+/);
$.each( classList, function(index, item){
if (item.indexOf("_toggle") > 0) {
var targetClass = "." + item.replace("_toggle", "");
if(mode===false){$(targetClass).removeClass("off");}
else{$(targetClass).addClass("off");}
}
});
}
Ответ 11
Попробуйте это. Это даст вам имена всех классов из всех элементов документа.
$(document).ready(function() {
var currentHtml="";
$('*').each(function() {
if ($(this).hasClass('') === false) {
var class_name = $(this).attr('class');
if (class_name.match(/\s/g)){
var newClasses= class_name.split(' ');
for (var i = 0; i <= newClasses.length - 1; i++) {
if (currentHtml.indexOf(newClasses[i]) <0) {
currentHtml += "."+newClasses[i]+"<br>{<br><br>}<br>"
}
}
}
else
{
if (currentHtml.indexOf(class_name) <0) {
currentHtml += "."+class_name+"<br>{<br><br>}<br>"
}
}
}
else
{
console.log("none");
}
});
$("#Test").html(currentHtml);
});
Вот рабочий пример: https://jsfiddle.net/raju_sumit/2xu1ujoy/3/
Ответ 12
javascript предоставляет атрибут classList для элемента node в dom. Просто используя
element.classList
вернет объект формы
DOMTokenList {0: "class1", 1: "class2", 2: "class3", length: 3, item: function, contains: function, add: function, remove: function…}
Объект имеет функции, такие как contains, add, remove, которые вы можете использовать
Ответ 13
У меня была аналогичная проблема, для элемента изображения типа. Мне нужно было проверить, был ли элемент определенного класса. Сначала я попробовал:
$('<img>').hasClass("nameOfMyClass");
но я получил хороший "эта функция недоступна для этого элемента".
Затем я проверил свой элемент в DOM-проводнике, и я увидел очень хороший атрибут, который мог бы использовать: className. Он содержал имена всех классов моего элемента, разделенных пробелами.
$('img').className // it contains "class1 class2 class3"
Как только вы получите это, просто разделите строку как обычно.
В моем случае это сработало:
var listOfClassesOfMyElement= $('img').className.split(" ");
Я предполагаю, что это будет работать с другими типами элементов (кроме img).
Надеюсь, что это поможет.
Ответ 14
Немного поздно, но с помощью функции extend() вы можете вызвать "hasClass()" для любого элемента, например:
var hasClass = $('#divId').hasClass('someClass');
(function($) {
$.extend({
hasClass: new function(className) {
var classAttr = $J(this).attr('class');
if (classAttr != null && classAttr != undefined) {
var classList = classAttr.split(/\s+/);
for(var ix = 0, len = classList.length;ix < len;ix++) {
if (className === classList[ix]) {
return true;
}
}
}
return false;
}
}); })(jQuery);
Ответ 15
Вопрос в том, что Jquery предназначен для этого.
$('.dolor_spec').each(function(){ //do stuff
И почему никто не дал . find() в качестве ответа?
$('div').find('.dolor_spec').each(function(){
..
});
Существует также классList для браузеров, отличных от IE:
if element.classList.contains("dolor_spec") { //do stuff
Ответ 16
Здесь вы идете, просто измените readsquare ответ, чтобы вернуть массив всех классов:
function classList(elem){
var classList = elem.attr('class').split(/\s+/);
var classes = new Array(classList.length);
$.each( classList, function(index, item){
classes[index] = item;
});
return classes;
}
Передайте элемент jQuery функции, так что примерный вызов будет:
var myClasses = classList($('#myElement'));
Ответ 17
Я знаю, что это старый вопрос, но все же.
<div id="specId" class="Lorem ipsum dolor_spec sit amet">Hello World!</div>
var className=".dolor_spec" //dynamic
Если вы хотите управлять элементом
$("#specId"+className).addClass('whatever');
Если вы хотите проверить, имеет ли элемент класс
$("#specId"+className).length>0
если несколько классов
//if you want to select ONE of the classes
var classNames = ['.dolor_spec','.test','.test2']
$("#specId"+classNames).addClass('whatever');
$("#specId"+classNames).length>0
//if you want to select all of the classes
var result = {className: ""};
classNames.forEach(function(el){this.className+=el;},result);
var searchedElement= $("#specId"+result.className);
searchedElement.addClass('whatever');
searchedElement.length>0