2012-01-08 7 views
0

Какой jquery я могу использовать для изменения класса, который используется в следующем: от indent_1 до indent_2 или indent_4 до indent_2? Я знаю об удалении класса, но как я могу это сделать, когда классы являются именами, которые меняются?Как заменить класс другим с помощью jQuery?

<div class="rep_td0 indent_1" id="title_1">Menu two</div> 
or 
<div class="rep_td0 indent_4" id="title_1">Menu two</div> 
+0

Что вы подразумеваете под именами, которые различаются? –

+0

Число после «indent_» может быть 0,1,2 или 3 –

+1

Если у вас есть два элемента на странице с тем же идентификатором, вы столкнетесь с проблемами, выбрав их по идентификатору. Некоторые браузеры вообще не работают, а другие могут возвращать только первый элемент, который соответствует. – kasdega

ответ

2

Поскольку вы не очень точно знаете, какой класс вы хотите изменить на другой, и вы сказали, что хотите иметь дело с тем случаем, когда вы точно не знаете, что такое класс, вот некоторые идеи :

вы можете найти все объекты, которые имеют класс, который начинается с «indent_» с этим селектором:

$('[className^="indent_"]') 

Если вы хотите, чтобы изучить класс по каждому из этих объектов, вы можете выполнить пошаговые jQuery с .each() и решить, что делать с каждым объектом, или вы можете использовать removeClass() с пользовательской функцией и экзаменом ne имя класса и решить, что с ним делать.

Если вы просто хотите изменить все отступы имен классов indent_2, то вы могли бы использовать это:

$('[className^="indent_"]').removeClass("indent_1 indent_3 indent_4").addClass("indent_2"); 

или, используя пользовательскую функцию, которая может исследовать имя класса с регулярным выражением:

$('[className^="indent_"]').removeClass(function(index, name) { 
    var match = name.match(/\bindent_\d+\b/); 
    if (match) { 
     return(match[0]); 
    } else { 
     return(""); 
    } 
}).addClass("indent_2"); 

Или, если все, что вам нужно сделать, это найти объект с идентификатором = «TITLE_1» и исправить это имя_класса, вы можете сделать это так:

var o = document.getElementById("title_1"); 
o.className = o.className.replace(/\bindent_\d+\b/, "indent_2"); 

Вы можете увидеть эту последнюю одну работу здесь: http://jsfiddle.net/jfriend00/tF8Lw/

Если вы пытаетесь сделать это в функцию, которая может принимать различные номера, вы могли бы использовать это:

function changeIndentClass(id, indentNum) { 
    var item = document.getElementById(id); 
    item.className = item.className(/\bindent_\d+\b/, "indent_" + indentNum); 
} 
+0

Спасибо. как я могу объединить это с проверкой того, что у объекта есть идентификатор title_1? –

+0

Возможно, я мог бы сделать это: $ ('# title_1'). RemoveClass ("indent_1 indent_3 indent_4"). AddClass ("indent_2"); –

+0

@Melissa - Я добавил параметр в самом конце моего ответа, который меняет только объект id = "title_1". Если бы вы объяснили, что это все, что вы хотели сделать с самого начала, это путь, проще говоря. – jfriend00

3

попробуйте этот код,

$("#title_1").removeClass("indent_1").addClass("indent_2"); 

, если вы не уверены, есть в наличии, попробуйте это

$("#title_1").removeClass("indent_1").removeClass("indent_4").addClass("indent_2"); 

Обновлено:

$("#title_1").removeClass(function() { 
    var match = $(this).attr('class').match(/\bindent_\d+\b/); 
    if (match) { 
     return (match[0]); 
    } else { 
     return (""); 
    } 
}).addClass("indent_2"); 
+0

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

+0

@Melissa: попробуйте обновленный ответ. –

1

Попробуйте ниже:

$('#title_1').removeClass('indent_1').addClass('indent_2'); 

Здесь indent_1 классы будут заменены indent_2.

+0

Извините, но, может быть, я не очень хорошо объяснил. Я не могу быть уверен в точном имени класса отступа. Число после _ может отличаться. Мне нужен шаблон для проверки класса, который выглядит как «indent_x», а затем удаляет этот класс. –

0

Может быть, это ?: Remove all classes that begin with a certain string

Ответ на вопрос, как заменить имя класса на элемент jQuery, который имеет определенный префикс, например, «indent_».

Хотя этот ответ конкретно не замены, вы можете добиться того, что путем изменения одного из их ответов слегка:

$("selector").className = $("selector").className.replace(/\bindent.*?\b/g, 'indent_2');

или аналогичный ...

+0

Приятная находка (как мне сообщалось некоторое время назад), если вы знаете, что что-то дубликат, лучше оставить комментарий по этому вопросу и сказать: Возможный дубликат ... Вставить ссылку здесь ... Но спасибо за то, что нашли ответ , – kasdega

+0

@kasdega Достаточно честно, будет делать в будущем. Не было совершенного обмана, поэтому я просто пошел с ним. – digitlworld

+0

Возможно, у вашей ссылки есть ответ. Что-то вроде: $ ('# title_1'). ClassName = $ ('# title_1'). ClassName.replace (/ \ bbg. *? \ B/g, ''); кроме того, я не уверен, как закодировать регулярное выражение. –

0

Первые вещи в первую очередь. .. Если на вашей странице есть несколько элементов с одинаковым идентификатором, у вас будут проблемы с выбором их по идентификатору. Некоторые браузеры вообще не работают, а другие могут возвращать только первый элемент, который соответствует.

Итак, сначала вам нужно очистить идентификационную информацию.

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

$('[class^="indent_"]').each(function() { 
    var me = $(this); 
    if(me.hasClass("indent_1").removeClass("indent_1").addClass("indent_2"); 
}); 
+0

У меня есть несколько строк, но элементы в каждой строке отмечены другим заголовком. Таким образом, будет первая строка с title_1 и вторая строка с title_2 и т. Д. Номер строки известен мне, поэтому я мог бы выбрать эту строку, выполнив проверку элемента с этим идентификатором. –

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