2016-06-16 3 views
0

Теперь я хочу установить разные классы для разных уровней масштабирования в google-maps. Теперь он только добавляет класс и не удаляет класс, который начинается с zoom-, что я делаю неправильно здесь? :jQuery - removeClass, начинающийся с

// setMarkerSize by different zoomLevels 
    if (z === 16) { $('.marker').removeClass("[className^='zoom-']").addClass('zoom-16'); } 
    if (z === 17) { $('.marker').removeClass("[className^='zoom-']").addClass('zoom-17'); } 
    if (z === 18) { $('.marker').removeClass("[className^='zoom-']").addClass('zoom-18'); } 
+0

Это работает. См. Https://jsfiddle.net/rnjgdspv/ – Mohammad

+0

@Mohammad - В вашем контексте класс не удаляется, он добавляется последним. Как правило, второй класс будет переопределять первый –

+0

@JqueryKing, что не так с моим кодом. Я не получаю его. – Sreinieren

ответ

3

removeClass() принимает только имена классов, а не селекторы.

Вы можете сделать это вместо того, чтобы:

var $el = $('.marker'); 
var classList = $el.attr('class').split(' '); 

$.each(classList, function(id, item) { 
    if (item.indexOf('zoom-') == 0) $el.removeClass(item); 
}); 

$el.addClass('zoom-' + z); // zoom-16, zoom-17, zoom-18 etc. 
+0

'startWith()' поддержка в верхней версии браузера. Например, версия 41 хром. См. [This] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith) – Mohammad

+0

Что вы имеете в виду, принимает только имена классов, а не селектора? – Sreinieren

+0

@Mohammad Спасибо! Изменено это на 'indexOf' :) – Midas

3

Это удаляет все существующие классы масштабирования. Добавьте новый класс в конец.

var z = 18; 
var items = [16, 17, 18]; 

$.each(items, function (ind, val) { 
    if (z === val) { 
     $(".marker").removeClass(function (index, css) { 
      return (css.match(/(^|\s)zoom-\S+/g) || []).join(' '); 
     }).addClass('zoom-' + val); 
    } 
}); 
+0

Это довольно умно +1 – Midas