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(); }
5 Réponses :
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(); }
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() }
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>
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"]*/
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
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)
?
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)"); }
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