2012-04-30 3 views
0

Я только что написал код ниже, чтобы добавить класс в внешний div, где он совпадает. Теперь я знаю, что должен быть более элегантный способ достижения ниже!jQuery добавить класс, если он существует в другом месте

if ($(".cur").hasClass("one")) { $("#outer").addClass("one"); } 
if ($(".cur").hasClass("two")) { $("#outer").addClass("two"); } 
if ($(".cur").hasClass("three")) { $("#outer").addClass("three"); } 
if ($(".cur").hasClass("four")) { $("#outer").addClass("four"); } 
if ($(".cur").hasClass("five")) { $("#outer").addClass("five"); } 
if ($(".cur").hasClass("six")) { $("#outer").addClass("six"); } 

Любые улучшения будут с удовольствием получил :)

+4

Существуют ли какие-либо другие классы, которые '.cur' могут иметь (кроме' cur')? Простейшим улучшением было бы поставить «один ... шесть» в массив и перебрать его. –

+0

OP Вы здесь? может ли элемент '.cur' иметь другие классы отдельно от этих шести? – gdoron

+0

@ Vega. Конечно, прочитайте [этот ответ] (http://stackoverflow.com/a/10390705/601179), чтобы понять, что я имел в виду. – gdoron

ответ

2
var classNames = '';  
$('.cur').each(function(){ 
    if (classNames.indexOf(this.className + ' ') === -1) 
     classNames += this.className + ' '; 
}); 

var classes = classNames.split​(" ");​​​ 
var $outer = $('#outer');  
$.each(classes, function(index, value){ 
    if (value !== 'cur') 
     $outer.addClass(value); 
}); 

Live DEMO

Примечания:

  • С помощью этого кода вы не должны "сжечь" классы .cur в коде, это делается автоматически ,
  • Он скопирует все классы .cur (кроме cur), поэтому вам решать, хорошо ли это для вас или нет.
1

Как об этом:

var classes = ['one', 'two', 'three'], 
    $cur = $('.cur'), 
    $outer = $("#outer"); 

$.each(classes, function(i, v) { 
    if ($cur.hasClass(v)) $outer.addClass(v); 
}) 

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

for (var i in classes) { 
    var v = classes[i]; 
    .... 
} 

или (лучше) использовать for вместо:

var len = classes.length; 
for (var i = 0; i < len; i++) { 
    var v = classes[i]; 
} 
+2

Не используйте 'for ... in' для перебора массивов;) –

+0

@Felix Kling: ... или использовать его с' hasOwnProperty() ' – zerkms

+0

Другим из написанных это может быть:' $ ('# outer') .addClass ($. grep (classes, function (cls) {return $ cur.hasClass (cls ');}). join (' ')) '. –

0
var classes = ['one', 'two', 'three', 'four', 'five', 'six']; 
$.each(classes, function(key, value){ 
    if($('.cur').hasClass(value)) $('.cur').closest('div').addClass(value); 
}); 

Должен сделать трюк, он использует ближайший ('div'), чтобы получить внешний div.

+2

Почему вы делаете «.cur» потомком '# outer'? –

+1

Почему вы запрашиваете DOM шесть раз (* 2) ...и есть уже такой ответ (но лучше ...) – gdoron

1

Это должно быть быстрее, так как он не вызывает .hasClass на каждой итерации:

// define which classes you want to match 
match_classes = ["one", "two", "three", "four"]; 
// grab all the classes on the inner element 
elm_classes = $(".cur").attr("class").split(" "); 
// cache the outer element for quick access 
$outer = $("#outer"); 

// iterate over the list of classes you want to match 
$.each(match_classes, function(i, val){ 
// if one of those classes exists on inner, add it to outer 
    if(elm_classes.indexOf(val) > -1) $outer.addClass(val); 
}); 
+0

Вы предполагаете, что существует только один элемент '.cur', который может быть неверным. и вы добавляете класс 'cur'. См. [Этот ответ] (http://stackoverflow.com/a/10390705/601179) – gdoron

+0

@gdoron Я зацикливаюсь над классами, пытающимися быть сопоставленными, а не со всеми классами на .cur, и да, это можно легко изменить для поддержки поиска классов по нескольким элементам. Ваш ответ и мой ответ решают разные проблемы, которые были слишком неоднозначными, чтобы отличить от вопроса оп. – greggreg

2

Вы можете найти класс соответствия с помощью Regex, а затем добавить класс соответствия для #outer. Смотрите ниже,

$(function() { 
    var regClasses = /(one|two|three|four|five|six)/g; 
    var $cur = $('.cur'), 
     $outer = $('#outer'); 

    $cur.each(function() {   
     $outer.addClass(this.className.match(regClasses).join(' ')); 
    }); 
}); 

DEMO

+0

И если в '.cur' есть 6 классов? Вы берете только первый класс. – gdoron

+0

@gdoron Я беру первый класс соответствия в regEx, который должен быть одним из шести. Не так ли? –

+0

Но 'cur' может иметь более одного класса. например '' – gdoron

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