Mam proste stwierdzenie if jako takie:
if ($('html').hasClass('m320')) {
// do stuff
}
Działa to zgodnie z oczekiwaniami. Chciałbym jednak dodać więcej klas do tagu, if statement
aby sprawdzić, czy którakolwiek z klas jest obecna w <html>
tagu. Potrzebuję tego, więc to nie wszystkie, ale obecność co najmniej jednej klasy, ale może być więcej.
Mój przypadek użycia jest, że mam zajęcia (np m320
, m768
) dodanego do różnych szerokościach rzutni więc chcę tylko, aby wykonać pewną Jquery jeśli jest to specyficzna szerokość (klasa).
Oto, czego próbowałem do tej pory:
1.
if ($('html').hasClass('m320', 'm768')) {
// do stuff
}
2.
if ($('html').hasClass('m320')) || ($('html').hasClass('m768')) {
// do stuff
}
3.
if ($('html').hasClass(['m320', 'm768'])) {
// do stuff
}
Jednak żaden z nich nie działa. Nie jestem pewien, co robię źle, ale najprawdopodobniej moja składnia lub struktura.
javascript
jquery
syntax
logic
Danny Englander
źródło
źródło
Odpowiedzi:
W drugiej próbie masz pomieszane nawiasy.
var $html = $("html"); if ($html.hasClass('m320') || $html.hasClass('m768')) { // do stuff }
źródło
$('html')
zmienną, zamiast szukać jej wielokrotnie.Możesz użyć
is()
zamiasthasClass()
:if ($('html').is('.m320, .m768')) { ... }
źródło
hasClass()
jest prawdopodobnie szybsze, aleis()
jest o wiele wygodniejsze w większości przypadkówis()
ihasClass()
Dla zabawy napisałem małą dodatkową metodę jQuery, która sprawdzi jedną z wielu nazw klas:
$.fn.hasAnyClass = function() { for (var i = 0; i < arguments.length; i++) { if (this.hasClass(arguments[i])) { return true; } } return false; }
Następnie w swoim przykładzie możesz użyć tego:
if ($('html').hasAnyClass('m320', 'm768')) { // do stuff }
Możesz przekazać dowolną liczbę nazw klas.
Oto ulepszona wersja, która umożliwia również przekazywanie wielu nazw klas oddzielonych spacją:
$.fn.hasAnyClass = function() { for (var i = 0; i < arguments.length; i++) { var classes = arguments[i].split(" "); for (var j = 0; j < classes.length; j++) { if (this.hasClass(classes[j])) { return true; } } } return false; } if ($('html').hasAnyClass('m320 m768')) { // do stuff }
Działające demo: http://jsfiddle.net/jfriend00/uvtSA/
źródło
Może to być inne rozwiązanie:
if ($('html').attr('class').match(/m320|m768/)) { // do stuff }
według jsperf.com jest też dość szybki.
źródło
Dla każdego, kto zastanawia się nad niektórymi różnymi aspektami wydajności ze wszystkimi tymi różnymi opcjami, utworzyłem tutaj przypadek jsperf : jsperf
Krótko mówiąc, używanie
element.hasClass('class')
jest najszybsze.Następny najlepszy zakład to użycie
elem.hasClass('classA') || elem.hasClass('classB')
. Uwaga na ten temat: porządek ma znaczenie! Jeśli istnieje większe prawdopodobieństwo znalezienia klasy „classA”, wymień ją najpierw! Instrukcje warunku OR są zwracane, gdy tylko jeden z nich zostanie spełniony.Zdecydowanie najgorsza wydajność
element.is('.class')
.W jsperf znajduje się również funkcja CyberMonk i rozwiązanie Kolji .
źródło
Oto niewielka odmiana odpowiedzi oferowanej przez jfriend00:
$.fn.hasAnyClass = function() { var classes = arguments[0].split(" "); for (var i = 0; i < classes.length; i++) { if (this.hasClass(classes[i])) { return true; } } return false; }
Pozwala na użycie tej samej składni co .addClass () i .removeClass (). np.
.hasAnyClass('m320 m768')
oczywiście wymaga kuloodporności, ponieważ zakłada co najmniej jeden argument.źródło
var classes = $('html')[0].className; if (classes.indexOf('m320') != -1 || classes.indexOf('m768') != -1) { //do something }
źródło
Metoda hasClass przyjmie tablicę nazw klas jako argument, możesz zrobić coś takiego:
$(document).ready(function() { function filterFilesList() { var rows = $('.file-row'); var checked = $("#filterControls :checkbox:checked"); if (checked.length) { var criteriaCollection = []; checked.each(function() { criteriaCollection.push($(this).val()); }); rows.each(function() { var row = $(this); var rowMatch = row.hasClass(criteriaCollection); if (rowMatch) { row.show(); } else { row.hide(200); } }); } else { rows.each(function() { $(this).show(); }); } } $("#filterControls :checkbox").click(filterFilesList); filterFilesList(); });
źródło
Dzieje się tak na wypadek, gdybyś potrzebował obu klas. Dla logiki albo albo po prostu użyj ||
$('el').hasClass('first-class') || $('el').hasClass('second-class')
W razie potrzeby możesz zoptymalizować
źródło
Spróbuj tego:
if ($('html').hasClass('class1 class2')) { // do stuff }
źródło