Why does JS code “var a = document.querySelector('a[data-a=1]');” cause error?

Multi tool use
Multi tool use
The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP


Why does JS code “var a = document.querySelector('a[data-a=1]');” cause error?



I've an element in the DOM:



<a href="#" data-a="1">Link</a>


<a href="#" data-a="1">Link</a>



I want to get this element via its HTML5 custom data attribute data-a. So I write JS codes:


data-a



var a = document.querySelector('a[data-a=1]');


var a = document.querySelector('a[data-a=1]');



But this code doesn't work and I get an error in browser's console. (I tested Chrome and Firefox.)



JS code var a = document.querySelector('a[data-a=a]'); doesn't cause error. So I think the problem is that HTML5's JS API document.querySelector doesn't support to look for the number value in HTML5 custom data attribute.


var a = document.querySelector('a[data-a=a]');


document.querySelector



Is this a problem of browser implementation bug or a problem of HTML5's spec relevant to document.querySelector?


document.querySelector



Then I tested codes below on http://validator.w3.org/:


<!DOCTYPE html>
<meta charset="utf-8">
<title>An HTML Document</title>
<a href="#" data-a="1">Link</a>



They're validated. Since these HTML5 codes are validated. We should can use HTML5's JS API document.querySelector to look for this anchor element via its custom data attribute. But tha fact is that I get error.


document.querySelector



Does HTML5's spec to HTML5 JS API document.querySelector say that this method can not look for an HTML5 data custom attribute with a number value? (An HTML5 spec source is wanted.)


document.querySelector





when using CSS attribute selectors, the value should be wrapped in quotes, e.g. a[data-a="1"].
– Eliran Malka
Feb 11 '13 at 9:53




a[data-a="1"]





querySelectorAll() is not an "HTML5 JS API". It has absolutely nothing to do with HTML5 whatsoever.
– BoltClock
Jul 20 '13 at 12:24


querySelectorAll()




4 Answers
4



From the selectors specification:



Attribute values must be CSS identifiers or strings.



Identifiers cannot start with a number. Strings must be quoted.



1 is therefore neither a valid identifier nor a string.


1



Use "1" (which is a string) instead.


"1"


var a = document.querySelector('a[data-a="1"]');





and if your number is stored in a variable eg var dataId = 5; then it should be written out this way document.querySelector("a[data-a='"+dataId+"']"); this answer helped but I had trouble with the quotes for a bit hope this helps someone
– James Daly
Jul 28 '14 at 22:45



You could use


var a = document.querySelector('a[data-a="1"]');



instead of


var a = document.querySelector('a[data-a=1]');



Took me a while to find this out but if you a number stored in a variable, say x and you want to select it, use


document.querySelector('a[data-a= + CSS.escape(x) + ']').



This is due to some attribute naming specifications that I'm not yet very familiar with. Hope this will help someone.



Yes strings must be quoted and in some cases like in applescript, quotes must be escaped


do JavaScript "document.querySelector('span[" & attrName & "="" & attrValue & ""]').click();"






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

RPMFLoVD7,6UpNxSYHytk7 cx QFI
mJA,M2HWkdRICa2rdN4

Popular posts from this blog

Makefile test if variable is not empty

Visual Studio Code: How to configure includePath for better IntelliSense results

Will Oldham