Нет простого способа сделать это просто потому, что в браузере не реализованы подстановочные селекторы для имени / ключа атрибута (только для его значения).Что вы можете сделать, это просто выполнить итерацию по вашему набору элементов (в этом случае их общий знаменатель равен div
), а затем отфильтровать их.
Вы можете получить доступ к списку атрибутов каждого узла DOM с помощьювызов <Node>.attributes
, а затем преобразование этого в массив и проверка, соответствует ли один или несколько name
каждого атрибута шаблону регулярных выражений /^data-namespace-.*/gi
:
var els = document.querySelectorAll("div");
var filteredEls = Array.prototype.slice.call(els).filter(function(el) {
var attributes = Array.prototype.slice.call(el.attributes);
// Determine if attributes matches 'data-namespace-*'
// We can break the loop once we encounter the first attribute that matches
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
// Return the element if it contains a match, and break the loop
if (attribute.name.match(/^data-namespace-.*/gi))
return el;
}
});
console.log(filteredEls);
<div data-namespace-title="foo">title</div>
<div data-namespace-description="bar">description</div>
<div data-namespace-button="foobar">button</div>
<div data-dummy>dummy</div>
Обновление: если вы знакомы с ES6, он станет намного чище, потому что:
- Мы можемиспользуйте
Array.from
вместо громоздких Array.prototype.slice.call(...)
.Совет: вы также можете использовать оператор распространения, то есть const els = [...document.querySelectorAll("div")]
. - . Мы можем использовать
Array.some
вместо того, чтобы вручную создавать цикл for
с логикой возврата
const els = Array.from(document.querySelectorAll("div"));
const filteredEls = els.filter(el => {
const attributes = Array.from(el.attributes);
return attributes.some(attribute => attribute.name.match(/^data-namespace-.*/gi));
});
console.log(filteredEls);
<div data-namespace-title="foo">title</div>
<div data-namespace-description="bar">description</div>
<div data-namespace-button="foobar">button</div>
<div data-dummy>dummy</div>