4
votes

Si la liste de classes contient plus d'une classe spécifique

J'ai besoin d'une fonction à déclencher si l'élément recordplayerstick contient la classe pinplace ou pinsongplay . Le code que j'ai actuellement renvoie une erreur de syntaxe. Quelle est la bonne façon de procéder?

if (document.getElementById('recordplayerstick').classList.contains('pinplace pinsongplay')) {
    removepin();
}


7 commentaires

De plus, vous ne pouvez vérifier qu'une seule classe à la fois.


@Pointy des suggestions sur la façon de traiter plusieurs cours? if (document.getElementById ('recordplayerstick'). classList.cont‌ ains ('pinplace') || document.getElementById ('recordplayerstick'). classList.conta‌ ins ('pinsongplay')) ?


Vérifiez simplement qu'il contient l'un ou l'autre (deux appels à .contains () ).


const cl = document.getElementById ('recordplayerstick'). classList; if (cl.contains ('pinplace') || cl.contains ('pinsongplay')) ...


document.getElementById ('recordplayerstick'). matches (". pinpl‌ ace, .pinsongplay")


OP a dit OU et un tas de commentaires sont ET


querySelector ('# recordplayerstick.pinplace, # recordplayerstick.pinsongplay') ne renverrait également l'élément que s'il avait le sélecteur d'id et au moins une des classes. Fixé selon la note d'Epascarello


5 Réponses :


9
votes

Vous allez devoir faire deux vérifications si vous comptez utiliser classList.

<div id="recordplayerstick" class="pinplace pinsongplay"></div>
function removepin() {
  console.log("yep");
}
var cList = document.getElementById('recordplayerstick').classList;
if (
  cList.contains('pinplace') ||
  cList.contains('pinsongplay')) {
  removepin();
}


0 commentaires

19
votes

Depuis Element.classList.contains n'accepte qu'un seul nom de classe, vous devez les vérifier séparément.

Vous pouvez utiliser Array.prototype.some () pour éviter d'écrire un tas de ou conditions

const el = document.getElementById('recordplayerstick')
const classNames = ['pinplace', 'pinsongplay']
if (classNames.some(className => el.classList.contains(className))) {
  removeping()
}


0 commentaires

0
votes

DOMTokenList

Il existe un moyen direct de accéder à une classList en utilisant l'interface DOMTokenList . Il a plusieurs méthodes et propriétés. La démo ci-dessous utilise la propriété .value pour extraire la liste, puis find () ou filter () pour gérer plusieurs paramètres et includes () pour renvoyer le premier des paramètres trouvés ou un tableau de tous les paramètres trouvés.
Utilisation

<div class='one two three four five'></div>


Démo

const findClass = (selector, array, all) => {

  let DTL = document.querySelector(selector).classList.value;
  console.log(`DOMTokenList: ${DTL}`);

  if (all) {
    return array.filter((tok) => DTL.includes(tok));
  } else {
    return array.find((tok) => DTL.includes(tok));
  }
};

console.log(findClass('div', ['two', 'four']));

console.log(findClass('div', ['two', 'four'], true));
findClass(selector, array, all)
/*
CSS selector string of tag. ex. "#target"
Array of classes            ex. ["bullseye", "miss"]
Optional: default false: 
                  Returns the first class found.         ex. "bullseye"
                  true: 
                  Returns all classes found as an array. ex. ["bullseye", "miss"]*/

0 commentaires

1
votes

Utilisez ... ( Spread syntax )

Exemple

/**
 * @description determine if an array contains one or more items from another array.
 * @param {array} haystack the array to search.
 * @param {array} arr the array providing items to check for in the haystack.
 * @return {boolean} true|false if haystack contains at least one item from arr.
 */
var findOne = function (haystack, arr) {
    return arr.some(function (v) {
        return haystack.indexOf(v) !== -1;
    });
};

/**
 * @description determine if element has one or more className.
 * @param {HTMLElement} element element where is going to search classNames.
 * @param {array} arrayClassNames Array of Strings, provide to search ClassName in the element
 * @return {boolean} true|false if element.classList contains at least one item from arrayClassNames.
 */
var checkElementHasSomeClassName = function (element, arrayClassNames) {
    // uncoment and use this return if you don't want the findOne function
    // return [...element.classList].some(className => arrayClassNames.indexOf(className) !== -1);
    return findOne([...element.classList], arrayClassNames);
};

fonctions complètes

XXX

Extras de liens:

Syntaxe de diffusion - compatibilité du navigateur

Vérifiez s'il existe un élément du tableau dans un autre tableau


1 commentaires

cela ne fonctionne pas semble-t-il, il ne recherche que le premier élément du tableau. Faites de la liste de classes un tableau à la place, par exemple [... element.classlist] .includes ('a', 'b', etc) ?



0
votes

Vous pouvez utiliser des expressions régulières:

<div class="btn btn-default bubu"></div>
let div = document.querySelector("div");

if ( /bubu|moo|bar/i.test(div.className) ) {
  console.log("ok (simple test)");
}

if ( /default|bar/i.test(div.className) ) {
  console.log("not-ok (partial match of `btn-default`)");
}

if ( /(?:^|\s)default|bar(?:\s|$)/i.test(div.className) ) {
  console.log("ok (not logging)");
  // ^ - the beginning of line | or \s space character.
  // space char | or $ - line ending
}

/***/

let names = ["btn", "bar", "bubu"];
let regex = new RegExp( "(?:^|\\s)" + names.join("|") + "(?:\\s|$)", "i");

if ( regex.test(div.className) ) {
  console.log("ok (new RegExp)");
}


0 commentaires