Javascript: seleziona tutti gli attributi data-qa nella pagina HTML

Sep 30 2020

Utilizzando solo JavaScript, senza l'uso di JQuery ecc., Qual è il modo più efficiente per selezionare tutti i nomi degli attributi che hanno un determinato attributo di dati (diciamo data-qa).

<p data-foo="0"></p><br/><h6 data-qa="apple"></h6>
<p data-foo="0"></p><br/><h6 data-qa="book"></h6>
<p data-foo="0"></p><br/><h6 data-qa="car"></h6>

Il risultato atteso dovrebbe essere un elenco:

apple
book
car

Questa domanda ottiene gli elementi principali, voglio gli attributi stessi. Seleziona tutti gli elementi con l'attributo "data-" senza utilizzare jQuery

Risorse:

Selenio trova elemento tramite l'attributo Data-Qa

Attributo QA dei dati: un modo migliore per selezionare gli elementi per l'automazione dei test dell'interfaccia utente

Risposte

2 ElectricShadow Sep 30 2020 at 09:20

Il codice seguente funziona ottenendo tutti gli elementi utilizzando document.querySelectorAll, mappando gli elementi ai valori degli attributi dei dati e quindi filtrando quelli che sono falsi o '0'.

let getAllDataAttrs = name => Array.from(
    document.querySelectorAll(`[data-${name}]`) ).map(elem => elem.getAttribute(`data-${name}`))
  .filter(val => val && val !== '0');

console.log(getAllDataAttrs('foo'));
<p data-foo="0"></p><br/>
<h6 data-foo="apple"></h6>
<p data-foo="0"></p><br/>
<h6 data-foo="book"></h6>
<p data-foo="0"></p><br/>
<h6 data-foo="car"></h6>

farinspace Oct 10 2020 at 03:18

Per riferimento, di seguito è essenzialmente la funzionalità javascript vanilla principale necessaria ...

Usando querySelectorAll, querySelectore getElementByIddovrebbe iniziare.

// get "data-qa" value by "id"
var data = document.getElementById('id-test2').getAttribute('data-qa');
console.log(data);

// get "id" value by "data-qa"
var data = document.querySelector('[data-qa="data-qa-test2"]').id;
console.log(data);

// get all elements with attribute "data-qa"
var elems = document.querySelectorAll('[data-qa]');

// get all "ids"
var data = [];
elems.forEach(function(elem){
  data.push(elem.id);
});
console.log(data);

// get all "data-qa"
var data = [];
elems.forEach(function(elem){
  data.push(elem.getAttribute('data-qa'));
});
console.log(data);
<div id="id-test" data-qa="data-qa-test"></div>
<div id="id-test1" data-qa="data-qa-test1"></div>
<div id="id-test2" data-qa="data-qa-test2"></div>
<div id="id-test3" data-qa="data-qa-test3"></div>