<p data-foo="bar">
Как вы можете сделать эквивалент
document.querySelectorAll('[data-foo]')
где querySelectorAll недоступно?
Мне нужно собственное решение, которое работает хотя бы в IE7. Я не забочусь о IE6.
<p data-foo="bar">
Как вы можете сделать эквивалент
document.querySelectorAll('[data-foo]')
где querySelectorAll недоступно?
Мне нужно собственное решение, которое работает хотя бы в IE7. Я не забочусь о IE6.
Вы можете написать функцию, которая запускает getElementsByTagName ('*'), и возвращает только те элементы с атрибутом data-foo:
function getAllElementsWithAttribute(attribute)
{
var matchingElements = [];
var allElements = document.getElementsByTagName('*');
for (var i = 0, n = allElements.length; i < n; i++)
{
if (allElements[i].getAttribute(attribute) !== null)
{
// Element exists with attribute. Add to array.
matchingElements.push(allElements[i]);
}
}
return matchingElements;
}
Затем
getAllElementsWithAttribute('data-foo');
Используйте
//find first element with "someAttr" attribute
document.querySelector('[someAttr]')
или
//find all elements with "someAttr" attribute
document.querySelectorAll('[someAttr]')
чтобы найти элементы по атрибуту. Теперь он поддерживается во всех соответствующих браузерах (даже IE8): http://caniuse.com/#search=queryselector
Я немного поиграл и закончил с этим грубым решением:
function getElementsByAttribute(attribute, context) {
var nodeList = (context || document).getElementsByTagName('*');
var nodeArray = [];
var iterator = 0;
var node = null;
while (node = nodeList[iterator++]) {
if (node.hasAttribute(attribute)) nodeArray.push(node);
}
return nodeArray;
}
Использование довольно простое и работает даже в IE8:
getElementsByAttribute('data-foo');
// or with parentNode
getElementsByAttribute('data-foo', document);
http://fiddle.jshell.net/9xaxf6jr/
Но я рекомендую использовать querySelector
/All
для этого (и для поддержки старых браузеров используйте polyfill):
document.querySelectorAll('[data-foo]');
Это тоже работает:
document.querySelector([attribute="value"]);
Итак:
document.querySelector([data-foo="bar"]);
Попробуйте это - я немного изменил приведенные выше ответы:
var getAttributes = function(attribute) {
var allElements = document.getElementsByTagName('*'),
allElementsLen = allElements.length,
curElement,
i,
results = [];
for(i = 0; i < allElementsLen; i += 1) {
curElement = allElements[i];
if(curElement.getAttribute(attribute)) {
results.push(curElement);
}
}
return results;
};
Затем
getAttributes('data-foo');
Попробуйте это, он работает
document.querySelector( '[атрибут = "значение" ]')
пример:
document.querySelector( '[Роль = "button"]')
В браузере используйте document.querySelect('[attribute-name]')
.
Но если вы тестируете подразделение, а ваше издеваемое dom имеет ошибочную реализацию querySelector, это будет делать трюк.
Это ответ @kevinfahy, просто урезанный, чтобы немного поработать с функциями стрелок ES6, и, возможно, преобразовать HtmlCollection в массив по цене читаемости.
Таким образом, он будет работать только с транспилером ES6. Кроме того, я не уверен, насколько это будет с большим количеством элементов.
function getElementsWithAttribute(attribute) {
return [].slice.call(document.getElementsByTagName('*'))
.filter(elem => elem.getAttribute(attribute) !== null);
}
И вот вариант, который получит атрибут с определенным значением
function getElementsWithAttributeValue(attribute, value) {
return [].slice.call(document.getElementsByTagName('*'))
.filter(elem => elem.getAttribute(attribute) === value);
}
Небольшая модификация на @kevinfahy answer, чтобы при необходимости получить атрибут по значению:
function getElementsByAttributeValue(attribute, value){
var matchingElements = [];
var allElements = document.getElementsByTagName('*');
for (var i = 0, n = allElements.length; i < n; i++) {
if (allElements[i].getAttribute(attribute) !== null) {
if (!value || allElements[i].getAttribute(attribute) == value)
matchingElements.push(allElements[i]);
}
}
return matchingElements;
}
Это самый простой способ получить значение атрибута для меня
<p id="something" data-foo="your value">
<script type="text/javascript">
alert(document.getElementById('something').getAttribute('data-foo'));
</script>
Два года запоздалый ответ с надеждой помочь будущему последователю.