Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to query elements by attribute value instead of attribute name

So this is an interesting one and may very well be impossible to do efficiently. But I'm interested in finding an efficient way to query all html elements in the document that have a particular value set for any attribute. So, for example, instead of this:

document.querySelectorAll('[attrName]');

I'm looking for the equivalent of the following pseudo-code:

document.querySelectorAll('[*=specificValue]');

So essentially the result would be all elements that have any attribute whose value matches "specificValue". I know there are gross ways to do this such as:

var all = document.querySelectorAll('*');
var matches = [];
var attrs;
for (var i = 0; i < all.length; i += 1) {
  attrs = Array.prototype.slice.call(all[i].attributes);
  for (var j = 0; j < attrs.length; j += 1) {
    if (attrs[j].value === 'specificValue') {
      matches.push(all[i]);
      break;
    }
  }
}

However, I would really love to avoid analyzing every single html element like this. Any ideas?

Edit:

Thanks for all the help so far. Before too many people give alternate suggestions I should explain what this is for. Basically, it's an experiment. The idea was that I might be able to create live object-to-dom databindings like what you get in Ember.js but instead of having to compile templates, you could just use regular html attributes and have a syntax marker in the value itself that a binding should be created. For example: <a href="{{linkLocation}}"></a>. I figured this might be fun if there was an efficient way to select relevant elements on the fly. Clearly I know a loop has to happen somewhere. However, if the browser is running a native iteration, I'd prefer that over my own JavaScript loop. I just wasn't sure if there was some "secret" selector syntax I wasn't aware of or if anyone could think of any other cool tricks.

like image 730
rescuecreative Avatar asked Dec 24 '13 05:12

rescuecreative


People also ask

How do you select an element based on attributes and values?

CSS [attribute|="value"] Selector The [attribute|="value"] selector is used to select elements with the specified attribute, whose value can be exactly the specified value, or the specified value followed by a hyphen (-).

How do I select an element by attribute name?

To select elements by an attribute name, pass a selector with the attribute's name to the querySelectorAll() method, e.g. document. querySelectorAll('[title]') . The querySelectorAll method will return a collection of the elements that have the provided attribute set.

How can you retrieve the value of an element's attribute?

Element.getAttribute() The getAttribute() method of the Element interface returns the value of a specified attribute on the element.

What is attribute name and attribute value?

The attribute identifier, also called attribute name, is a string that identifies an attribute. An attribute value is the content of the attribute and its type is not restricted to that of string. You use an attribute name when you want to specify a particular attribute for either retrieval, searches, or modification.


1 Answers

I wouldn't worry too much about performance at this point, but focus on code efficiency. If you don't want to incooporate any jQuery, and just use vanilla JS, then I would just store your attributes values in a class name. For example, if you have a following HTML element:

<div class="something" yo="1"></div>

I'd put entire attributes and values in a class name like

<div class="something yo1"></div>

Then you can simply use already built-in method to select every elements with the class name specified above.

var elems = document.getElementsByClassName("yo1");  //make sure to cache these selected elems in a variable. 

console.log(elems);

If you want to use jQuery, things get easier, because you can simply select element by attribute selector and it works across all browsers.

http://api.jquery.com/attribute-equals-selector/

like image 72
Jason Avatar answered Oct 14 '22 21:10

Jason