jquery addClass не работает: свойство или метод addClass не поддерживается

У меня работает этот javascript

$(".mail-tile").click(function () {
    var idMessage = $(this).attr('data-message-id');
    $('.mail-tile').removeClass(classeEvidenzaRigaSelezionata);
    $(this).addClass(classeEvidenzaRigaSelezionata);
    previewMail(this);        
});

затем, на той же странице, в том же файле js, у меня есть этот javascript:

function selectMail(idMail) {
    var mailTile = $('.mail-tile[data-message-id="' + idMail + '"]')[0];    
    $('.mail-tile').removeClass(classeEvidenzaRigaSelezionata);
    mailTile.addClass(classeEvidenzaRigaSelezionata);
    previewMail(mailTile);
}

В этом случае функция addClass не работает: «свойство или метод addClass не поддерживается».

classeEvidenzaRigaSelezionata - глобальная переменная.

Я не могу понять, в чем разница между двумя фрагментами. В обоих случаях у меня есть HtmlDivElement для работы (объект не нулевой). Что тут происходит?


person themarcuz    schedule 27.04.2012    source источник
comment
Вам не хватает кавычек до и после названий классов:   -  person kayen    schedule 27.04.2012
comment
у вас отсутствует точка с запятой после mailTile.addClass(classeEvidenzaRigaSelezionata)   -  person Elen    schedule 27.04.2012
comment
@kayen: нет, classeEvidenzaRigaSelezionata - глобальная строковая переменная, которая содержит фактическое имя класса. Спасибо, что вышли. Вопрос обновлен, чтобы быть более точным   -  person themarcuz    schedule 27.04.2012
comment
@Elen: отсутствует точка с запятой из-за ошибки копирования / вставки. Это не ошибка   -  person themarcuz    schedule 27.04.2012


Ответы (1)


Вам необходимо удалить [0] после селектора идентификатора. Это не даст вам jQuery element, который вы используете addClass(classeEvidenzaRigaSelezionata) позже.

Используйте вместо этого: var mailTile = $('.mail-tile[data-message-id="' + idMail + '"]');

person kayen    schedule 27.04.2012
comment
Ты прав. Но в этом случае он не возвращает массив элементов? - person themarcuz; 27.04.2012
comment
Да, это так, поэтому, если вам нужно получить доступ к первому элементу, вам нужно сделать что-то вроде: var mailTile = $ ('. Mail-tile [data-message-id =' + idMail + ']: first') ; - person kayen; 27.04.2012
comment
@kayen или еще лучше .first(), хотя, если в массиве гарантированно будет только один элемент, в этом нет необходимости. - person Alnitak; 27.04.2012
comment
@Alnitak - Да, .first () - альтернатива, но в этом случае вы создаете новый объект jQuery. Ref. stackoverflow.com/questions/2312761/jquery-first-vs-first - person kayen; 27.04.2012
comment
@kayen да, но создание нового объекта jQuery происходит быстрее, чем использование нестандартного селектора :first, который предотвращает использование встроенной функции браузера querySelectorAll(). См. api.jquery.com/first-selector. - person Alnitak; 27.04.2012
comment
@Alnitak спасибо за информацию! Итак, я думаю, мы можем объединить наши два случая и придумать самый быстрый и оптимальный селектор, используя .filter (: first). Кто-то действительно проверил эти: jsperf.com/first-v-first/2 - person kayen; 27.04.2012
comment
@kayen нет, поскольку .filter(':first') по-прежнему медленнее, чем .first() - для первого требуется синтаксический анализ селектора, а для второго просто требуется тривиальная операция с массивом. - person Alnitak; 27.04.2012
comment
@Alnitak - Спасибо за создание теста! .first () действительно быстрый! - person kayen; 27.04.2012