Annotation of 2006/webapi/selectors-api/Overview.html, revision 1.98
1.1 avankest 1: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
2:
1.11 avankest 3: <html lang=en-US>
1.20 lhunt 4: <head><meta content="text/html;charset=UTF-8" http-equiv=Content-Type>
5:
1.1 avankest 6: <title>Selectors API</title>
7:
8: <style type="text/css">
1.36 lhunt 9: pre.idl { border:solid thin; background:#eee; color:#000; padding:0.5em }
1.50 lhunt 10: pre.idl :link, pre.idl :visited { color:inherit; background:transparent }
1.20 lhunt 11:
1.36 lhunt 12: div.example { border-left:double; padding-left:1em }
13: dfn { font-style:normal; font-weight:bolder }
14: em.ct { font-style:normal; font-weight:normal; font-variant:small-caps }
15: p.note { margin-left:2em; color:green; font-style:italic; font-weight:bold }
16: p.note:before { content:"Note: " }
17: .issue { padding:.5em; border:solid red }
18: .issue:before { content:"Issue: " }
19: code { color:#FF4500; }
20: code :link, code :visited { color:inherit }
21: </style>
1.79 lhunt 22: <link href="http://www.w3.org/StyleSheets/TR/W3C-ED" rel=stylesheet
1.29 lhunt 23: type="text/css">
1.1 avankest 24:
25: <body>
1.11 avankest 26: <div class=head>
1.31 lhunt 27: <p><a href="http://www.w3.org/"><img alt=W3C height=48
28: src="http://www.w3.org/Icons/w3c_home" width=72></a></p>
1.1 avankest 29:
1.46 lhunt 30: <h1 id=title>Selectors API</h1>
1.12 avankest 31: <!-- "DOM Selectors" was not acceptable. "DOM Level 4 Selectors" and
1.36 lhunt 32: conforming to the DOM specification template (if there is such a thing) is
33: just silly so we got stuck with this weird name. -->
1.12 avankest 34:
1.98 ! lhunt 35: <h2 class="no-num no-toc" id=W3C-doctype>W3C Working Draft 4 March 2009</h2>
1.1 avankest 36:
37: <dl>
1.5 avankest 38: <dt>This Version:
1.1 avankest 39:
1.11 avankest 40: <dd><a
1.98 ! lhunt 41: href="http://www.w3.org/TR/2009/ED-selectors-api-20090304/">http://www.w3.org/TR/2009/ED-selectors-api-20090304/</a>
1.1 avankest 42:
1.5 avankest 43: <dt>Latest Version:
1.1 avankest 44:
45: <dd><a
46: href="http://www.w3.org/TR/selectors-api/">http://www.w3.org/TR/selectors-api/</a>
47:
1.12 avankest 48: <dt>Previous Versions:
49:
50: <dd><a
1.44 lhunt 51: href="http://www.w3.org/TR/2007/WD-selectors-api-20071221/">http://www.w3.org/TR/2007/WD-selectors-api-20071221/</a>
52:
53: <dd><a
1.31 lhunt 54: href="http://www.w3.org/TR/2007/WD-selectors-api-20071019/">http://www.w3.org/TR/2007/WD-selectors-api-20071019/</a>
1.29 lhunt 55:
56: <dd><a
1.12 avankest 57: href="http://www.w3.org/TR/2006/WD-selectors-api-20060926/">http://www.w3.org/TR/2006/WD-selectors-api-20060926/</a>
1.1 avankest 58:
59: <dd><a
60: href="http://www.w3.org/TR/2006/WD-selectors-api-20060525/">http://www.w3.org/TR/2006/WD-selectors-api-20060525/</a>
61:
1.20 lhunt 62: <dt>Editors:
63:
1.46 lhunt 64: <dd><a href="http://annevankesteren.nl/">Anne van Kesteren</a> (<a
65: href="http://www.opera.com/">Opera Software ASA</a>) <<a
66: href="mailto:annevk@opera.com">annevk@opera.com</a>>
67:
1.29 lhunt 68: <dd><a href="http://lachy.id.au/">Lachlan Hunt</a> (<a
69: href="http://www.opera.com/">Opera Software ASA</a>) <<a
1.20 lhunt 70: href="mailto:lachlan.hunt@lachy.id.au">lachlan.hunt@lachy.id.au</a>>
1.1 avankest 71: </dl>
72:
1.11 avankest 73: <p class=copyright><a
1.1 avankest 74: href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a>
1.44 lhunt 75: © 2006-2007 <a href="http://www.w3.org/"><acronym title="World Wide Web
76: Consortium">W3C</acronym></a><sup>®</sup> (<a
1.31 lhunt 77: href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute
78: of Technology">MIT</acronym></a>, <a
79: href="http://www.ercim.org/"><acronym title="European Research Consortium
80: for Informatics and Mathematics">ERCIM</acronym></a>, <a
81: href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a
82: href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>,
83: <a
84: href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a>
85: and <a
86: href="http://www.w3.org/Consortium/Legal/copyright-documents">document
87: use</a> rules apply.</p>
1.33 lhunt 88: </div>
1.1 avankest 89:
90: <hr>
91:
1.11 avankest 92: <h2 class="no-num no-toc" id=abstract>Abstract</h2>
1.1 avankest 93:
1.23 lhunt 94: <p>Selectors, which are widely used in CSS, are patterns that match against
1.54 lhunt 95: elements in a tree structure <a href="#SELECT"
96: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a><a href="#CSS21"
1.69 lhunt 97: rel=biblioentry>[CSS21]<!--{{CSS21}}--></a>. The Selectors API
1.54 lhunt 98: specification defines methods for retrieving <code>Element</code> nodes
99: from the <abbr title="Document Object Model">DOM</abbr> by matching
100: against a group of selectors. It is often desirable to perform DOM
101: operations on a specific set of elements in a document. These methods
102: simplify the process of acquiring specific elements, especially compared
103: with the more verbose techniques defined and used in the past.
1.1 avankest 104:
1.11 avankest 105: <h2 class="no-num no-toc" id=sotd>Status of this Document</h2>
1.1 avankest 106:
107: <p><em>This section describes the status of this document at the time of
108: its publication. Other documents may supersede this document. A list of
109: current W3C publications and the latest revision of this technical report
110: can be found in the <a href="http://www.w3.org/TR/">W3C technical reports
111: index</a> at http://www.w3.org/TR/.</em>
112:
1.79 lhunt 113: <p>This is an Editor's Draft of "Selectors API". The W3C Membership and
114: other interested parties are invited to review the document and send
1.57 lhunt 115: comments to <a
116: href="mailto:public-webapps@w3.org">public-webapps@w3.org</a> (<a
117: href="http://lists.w3.org/Archives/Public/public-webapps/">public
1.95 lhunt 118: archive</a>) with <kbd>[selectors-api]</kbd> in the subject.
119:
120: <p>This document has been approved for publication as a Candidate
121: Recommendation by the working group. However, in light of existing
122: interoperable implementations, the group is considering requesting
123: publication as a Proposed Recommendation.</p>
1.79 lhunt 124: <!--
125: <p>This is a Last Call Working Draft of "Selectors API". The W3C Membership
126: and other interested parties are invited to review the document and send
127: comments to <a href="mailto:public-webapps@w3.org">public-webapps@w3.org</a>
128: (<a href="http://lists.w3.org/Archives/Public/public-webapps/">public
129: archive</a>) with <kbd>[selectors-api]</kbd> in the subject, through 12
130: December 2008.</p>
131: -->
1.29 lhunt 132:
133: <p><span class=notetoeditor>Web content and browser developers are
134: encouraged to review this draft. This draft is considered relatively
1.95 lhunt 135: stable and is expected to progress to Proposed Recommendation after the
1.44 lhunt 136: review period.</span> The editor’s copy of this specification is <a
1.30 lhunt 137: href="http://dev.w3.org/2006/webapi/selectors-api/">available in W3C
138: CVS</a>. A detailed list of changes is also available <a
1.1 avankest 139: href="http://dev.w3.org/cvsweb/2006/webapi/selectors-api/">from the CVS
1.29 lhunt 140: server</a>.
1.1 avankest 141:
1.29 lhunt 142: <p>This document was developed by the <a
1.57 lhunt 143: href="http://www.w3.org/2008/webapps/">Web Applications Working Group</a>.
144: The Working Group expects to advance this Working Draft to Recommendation
1.29 lhunt 145: Status.
146:
147: <p>Publication as a Working Draft does not imply endorsement by the W3C
148: Membership. This is a draft document and may be updated, replaced or
149: obsoleted by other documents at any time. It is inappropriate to cite this
150: document as other than work in progress.
1.1 avankest 151:
152: <p>This document was produced by a group operating under the <a
153: href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February
154: 2004 W3C Patent Policy</a>. W3C maintains a <a
1.77 lhunt 155: href="http://www.w3.org/2004/01/pp-impl/42538/status"
1.11 avankest 156: rel=disclosure>public list of any patent disclosures</a> made in
1.1 avankest 157: connection with the deliverables of the group; that page also includes
158: instructions for disclosing a patent. An individual who has actual
159: knowledge of a patent which the individual believes contains <a
160: href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential
1.31 lhunt 161: Claim(s)</a> must disclose the information in accordance with <a
1.1 avankest 162: href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section
163: 6 of the W3C Patent Policy</a>.
164:
1.11 avankest 165: <h2 class="no-num no-toc" id=toc>Table of Contents</h2>
1.1 avankest 166: <!--begin-toc-->
167:
1.11 avankest 168: <ul class=toc>
1.87 lhunt 169: <li><a href="#introduction"><span class=secno>1 </span>Introduction</a>
1.11 avankest 170: <ul class=toc>
1.36 lhunt 171: <li><a href="#examples"><span class=secno>1.1 </span>Examples</a>
1.49 lhunt 172: </ul>
1.1 avankest 173:
1.87 lhunt 174: <li><a href="#conformance"><span class=secno>2 </span>Conformance
1.49 lhunt 175: Requirements</a>
176: <ul class=toc>
177: <li><a href="#terminology"><span class=secno>2.1 </span>Terminology and
178: Conventions</a>
179: </ul>
1.1 avankest 180:
1.87 lhunt 181: <li><a href="#interoperability"><span class=secno>3
1.49 lhunt 182: </span>Interoperability Considerations</a>
183: <ul class=toc>
184: <li><a href="#extensibility"><span class=secno>3.1
185: </span>Extensibility</a>
186: </ul>
187:
1.87 lhunt 188: <li><a href="#security"><span class=secno>4 </span>Security
1.49 lhunt 189: Considerations</a>
1.21 lhunt 190:
1.87 lhunt 191: <li><a href="#privacy"><span class=secno>5 </span>Privacy Considerations
1.49 lhunt 192: </a>
1.1 avankest 193:
1.87 lhunt 194: <li><a href="#nodeselector"><span class=secno>6 </span>The <code
1.55 lhunt 195: title="">NodeSelector</code> Interface</a>
1.16 avankest 196: <ul class=toc>
1.87 lhunt 197: <li><a href="#resolving-namespaces"><span class=secno>6.1
198: </span>Resolving Namespaces</a>
1.51 lhunt 199: </ul>
1.50 lhunt 200:
1.87 lhunt 201: <li><a href="#dom-feature-string"><span class=secno>7 </span>DOM Feature
1.64 lhunt 202: String</a>
203:
1.87 lhunt 204: <li><a href="#examples0"><span class=secno>8 </span>Examples</a>
1.64 lhunt 205:
1.11 avankest 206: <li class=no-num><a href="#references">References</a>
1.54 lhunt 207: <ul class=toc>
208: <li class=no-num><a href="#normative-references">Normative
209: references</a>
210:
1.84 lhunt 211: <li class=no-num><a href="#informative-references">Informative
212: references</a>
1.54 lhunt 213: </ul>
1.1 avankest 214:
1.11 avankest 215: <li class=no-num><a href="#acknowledgements">Acknowledgements</a>
1.1 avankest 216: </ul>
217: <!--end-toc-->
218:
1.87 lhunt 219: <h2 id=introduction><span class=secno>1 </span>Introduction</h2>
1.1 avankest 220:
221: <p><em>This section is non-normative.</em>
222:
1.20 lhunt 223: <p>This specification introduces two methods that take a group of selectors
1.24 lhunt 224: (often simply referred to as a selector) as an argument and return the
1.54 lhunt 225: matching elements <a href="#SELECT"
226: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>. With these methods, it is
227: easier to match a set of <code>Element</code> nodes based on specific
1.94 lhunt 228: criteria, than having to subsequently filter the result of calling other
229: methods like <code>getElementsByTagName()</code>.
1.10 avankest 230:
1.36 lhunt 231: <h3 id=examples><span class=secno>1.1 </span>Examples</h3>
1.1 avankest 232:
233: <p><em>This section is non-normative.</em>
234:
1.54 lhunt 235: <p>Some ECMAScript <a href="#ECMA-262"
236: rel=biblioentry>[ECMA-262]<!--{{ECMA-262}}--></a> examples:
1.1 avankest 237:
1.14 avankest 238: <div class=example>
1.41 lhunt 239: <p>This is an example table written in HTML 4.01.</p>
1.22 lhunt 240:
1.20 lhunt 241: <pre><table id="score">
242: <thead>
243: <tr>
244: <th>Test
245: <th>Result
246: <tfoot>
247: <tr>
248: <th>Average
249: <td>82%
250: <tbody>
251: <tr>
252: <td>A
253: <td>87%
254: <tr>
255: <td>B
256: <td>78%
257: <tr>
258: <td>C
259: <td>81%
260: </table></pre>
261:
262: <p>In order to obtain the cells containing the results in the table, which
263: might be done, for example, to plot the values on a graph, there are at
264: least two approaches that may be taken. Using only the APIs from DOM
265: Level 2, it requires a script like the following that iterates through
266: each <code>tr</code> within each <code>tbody</code> in the
267: <code>table</code> to find the second cell of each row.</p>
268:
269: <pre>var table = document.getElementById("score");
1.23 lhunt 270: var groups = table.tBodies;
271: var rows = null;
1.24 lhunt 272: var cells = [];
1.20 lhunt 273:
1.23 lhunt 274: for (var i = 0; i < groups.length; i++) {
275: rows = groups[i].rows;
276: for (var j = 0; j < rows.length; j++) {
277: cells.push(rows[j].cells[1]);
1.20 lhunt 278: }
1.36 lhunt 279: }</pre>
1.20 lhunt 280:
1.46 lhunt 281: <p>Alternatively, using the <code
282: title=document-selectallelements>querySelectorAll()</code> method, that
283: script becomes much more concise.</p>
1.20 lhunt 284:
1.36 lhunt 285: <pre>var cells = document.querySelectorAll("#score>tbody>tr>td:nth-of-type(2)");</pre>
1.41 lhunt 286:
1.84 lhunt 287: <p>Note that the script operates on the DOM and works independently from
288: the syntax used to create the document. Thus this script will also work
289: correctly for an equivalent table created from well-formed XHTML instead
290: of HTML, or dynamically created and inserted into a document using DOM
291: APIs.</p>
1.20 lhunt 292: </div>
293:
1.87 lhunt 294: <h2 id=conformance><span class=secno>2 </span>Conformance Requirements</h2>
1.1 avankest 295:
1.21 lhunt 296: <p>All diagrams, examples and notes in this specification are
1.20 lhunt 297: non-normative, as are all sections explicitly marked non-normative.
298: Everything else in this specification is normative.
1.1 avankest 299:
1.73 lhunt 300: <p>The key words <em class=ct>must</em>, <em class=ct>must not</em>, <em
301: class=ct>should</em>, <em class=ct>may</em> and <em
302: class=ct>recommended</em> in the normative parts of this document are to
303: be interpreted as described in RFC 2119 <a href="#RFC2119"
1.54 lhunt 304: rel=biblioentry>[RFC2119]<!--{{!RFC2119}}--></a>.
1.1 avankest 305:
1.11 avankest 306: <p>The following conformance classes are defined (and considered) by this
307: specification:
1.1 avankest 308:
309: <dl>
1.87 lhunt 310: <dt><dfn id=conforming-user-agent>conforming user agent</dfn>
1.1 avankest 311:
1.48 lhunt 312: <dd>A user agent that implements the <code><a
1.65 lhunt 313: href="#dom-document-selector">NodeSelector</a></code> interface described
314: in this specification and conforms to all <em class=ct>must</em>-level
315: criteria that apply to implementations.
1.22 lhunt 316:
1.87 lhunt 317: <dt><dfn id=conforming-application>conforming application</dfn>
1.22 lhunt 318:
319: <dd>An application that uses the interfaces defined in this specification
1.36 lhunt 320: and conforms to all <em class=ct>must</em>-level criteria that apply to
321: applications.
1.1 avankest 322: </dl>
323:
1.49 lhunt 324: <h3 id=terminology><span class=secno>2.1 </span>Terminology and Conventions</h3>
1.16 avankest 325:
1.54 lhunt 326: <p>The terminology used in this specification is that from Selectors <a
327: href="#SELECT" rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>.
1.16 avankest 328:
1.73 lhunt 329: <p>Conformance requirements phrased as algorithms or specific steps <em
330: class=ct>may</em> be implemented in any manner, so long as the end result
331: is equivalent.
1.16 avankest 332:
1.90 lhunt 333: <p>The IDL used in this specification uses the syntax defined in Web IDL <a
334: href="#WEBIDL" rel=biblioentry>[WEBIDL]<!--{{!WEBIDL}}--></a>.
335:
1.23 lhunt 336: <p>The construction "<code>Foo</code> object", where <code>Foo</code> is
337: actually an interface, is sometimes used instead of the more accurate
1.24 lhunt 338: "object implementing the <code>Foo</code> interface".
1.23 lhunt 339:
1.90 lhunt 340: <p>The interfaces used within, but not defined by, this specification,
341: including <code>Document</code>, <code>DocumentFragment</code>,
342: <code>Node</code> and <code>Element</code> are defined in DOM Level 3 Core
343: <a href="#DOM-LEVEL-3-CORE"
344: rel=biblioentry>[DOM-LEVEL-3-CORE]<!--{{!DOM-LEVEL-3-CORE}}--></a>.
1.46 lhunt 345:
1.87 lhunt 346: <h2 id=interoperability><span class=secno>3 </span>Interoperability
1.49 lhunt 347: Considerations</h2>
1.16 avankest 348:
1.23 lhunt 349: <p><em>This section is non-normative.</em>
350:
1.65 lhunt 351: <p>Some implementations might have different levels of support for
352: Selectors. If some implementations lack support for some selectors, then
1.87 lhunt 353: the use of such selectors will result in those implementations failing to
354: return the expected results. Authors are advised to check for the DOM
355: Exceptions thrown by these APIs and provide a fallback for graceful
356: degradation.
1.19 avankest 357:
1.49 lhunt 358: <h3 id=extensibility><span class=secno>3.1 </span>Extensibility</h3>
1.5 avankest 359:
360: <p><em>This section is non-normative.</em>
361:
362: <p>Extensions of the APIs defined in this specification are <em>strongly
1.36 lhunt 363: discouraged</em>. Implementors, Working Groups and other interested
364: parties should discuss extensions on a relevant public forum, such as <a
1.57 lhunt 365: href="mailto:public-webapps@w3.org">public-webapps@w3.org</a>.
1.5 avankest 366:
1.87 lhunt 367: <h2 id=security><span class=secno>4 </span>Security Considerations</h2>
1.11 avankest 368:
369: <p>It is expected that implementing this specification introduces no new
1.21 lhunt 370: security risks for users.
371:
1.62 lhunt 372: <p>If, at any time, the implementation detects a situation which would
1.73 lhunt 373: violate security policies, the implementation <em class=ct>may</em> abort
374: and raise a security exception. If any other error condition occurs which
375: is not covered directly by this or any other relevant specification, the
376: implementation <em class=ct>may</em> abort and raise an appropriate,
1.62 lhunt 377: language-binding-specific or implementation-specific exception.
378:
1.87 lhunt 379: <h2 id=privacy><span class=secno>5 </span>Privacy Considerations</h2>
1.11 avankest 380:
1.20 lhunt 381: <p>History theft is a potential privacy issue because the
1.54 lhunt 382: <code>:visited</code> pseudo-class in Selectors <a href="#SELECT"
383: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a> allows authors to query
384: which links have been visited.
1.20 lhunt 385:
386: <p class=note>This is not a new problem, as it can already be exploited
387: using existing CSS and DOM APIs, such as <code>getComputedStyle()</code>
1.54 lhunt 388: <a href="#DOM-LEVEL-2-STYLE"
389: rel=biblioentry>[DOM-LEVEL-2-STYLE]<!--{{DOM-LEVEL-2-STYLE}}--></a>.
1.20 lhunt 390:
391: <div class=example>
1.36 lhunt 392: <p>In this example, <var>vlinks</var> will acquire a list of links that
393: the user has visited. The author can then obtain the URIs and potentially
1.20 lhunt 394: exploit this knowledge.</p>
395:
1.27 lhunt 396: <pre>var vlinks = document.querySelectorAll(":visited");
1.20 lhunt 397: for (var i = 0; i < vlinks.length; i++) {
398: doSomethingEvil(vlinks[i].href);
399: }</pre>
400: </div>
401:
402: <p>As <a href="http://www.w3.org/TR/css3-selectors/#link">defined in
1.54 lhunt 403: <cite>Selectors</cite></a> (<a href="#SELECT"
404: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>, section 6.6.1), user
405: agents <em class=ct>may</em> treat all links as unvisited links. It is <em
1.47 lhunt 406: class=ct>recommended</em> that implementations behave consistently with
407: other uses of Selectors supported by the user agent.
1.11 avankest 408:
1.87 lhunt 409: <h2 id=nodeselector><span class=secno>6 </span>The <code
1.55 lhunt 410: title="">NodeSelector</code> Interface</h2>
1.16 avankest 411:
1.82 lhunt 412: <pre class=idl>module dom {
1.90 lhunt 413: [ImplementedOn=Document,ImplementedOn=DocumentFragment,ImplementedOn=Element,
414: NoInterfaceObject]
415: interface <dfn id=dom-document-selector>NodeSelector</dfn> {
1.96 lhunt 416: Element <a href="#queryselector" title=queryselector>querySelector</a>(in DOMString selectors);
417: NodeList <a href="#queryselectorall" title=queryselectorall>querySelectorAll</a>(in DOMString selectors);
1.82 lhunt 418: };
419: };</pre>
1.36 lhunt 420:
421: <p>The term <dfn id=first>first</dfn> used in the definitions of the
1.92 lhunt 422: methods of the <code><a
423: href="#dom-document-selector">NodeSelector</a></code> interface means
1.87 lhunt 424: <em>first in document order</em>. The term <dfn id=document-order>document
1.98 ! lhunt 425: order</dfn> means a depth-first pre-order traversal of the DOM tree or
! 426: subtree in question. The term <dfn id=context-node>context node</dfn>
1.87 lhunt 427: refers to the node upon which the method was invoked. The term <dfn
1.91 lhunt 428: id=nodes-subtrees>node’s subtrees</dfn> refers to the collection of
1.88 lhunt 429: elements that are descendants of the <a href="#context-node">context
430: node</a>. The term <dfn id=matching-element-node>matching
431: <code>Element</code> node</dfn> refers to an <code>Element</code> node
432: that matches the group of selectors (<var>selectors</var>) that was passed
433: to the method, according to the rules for matching elements defined in
434: Selectors <a href="#SELECT"
435: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>.</p>
1.74 lhunt 436: <!-- (Commented out until this definition, or something like it, is needed for
437: the proposed :scope pseudo-class.)
438:
439: <p>If the <span>context node</span> is a <code>Document</code> node, then
440: the <span>scope element</span> is the <code>documentElement</code> of
441: the given document. If the <span>context node</span> is an
442: <code>Element</code> node, then the <span>scope element</span> is the
443: same as the <span>context node</span>.</p>
444: -->
1.65 lhunt 445:
1.53 lhunt 446: <p>The <dfn id=queryselector
1.65 lhunt 447: title=queryselector><code>querySelector()</code></dfn> method on the
1.53 lhunt 448: <code><a href="#dom-document-selector">NodeSelector</a></code> interface
1.98 ! lhunt 449: <em class=ct>must</em>, when invoked, return the <a
! 450: href="#first">first</a> matching <code>Element</code> node within the <a
! 451: href="#nodes-subtrees">node’s subtrees</a>. If there is no such node,
! 452: the method <em class=ct>must</em> return <code>null</code>.
1.1 avankest 453:
1.53 lhunt 454: <p>The <dfn id=queryselectorall
1.65 lhunt 455: title=queryselectorall><code>querySelectorAll()</code></dfn> method on the
456: <code><a href="#dom-document-selector">NodeSelector</a></code> interface
457: <em class=ct>must</em>, when invoked, return a <code>NodeList</code>
1.98 ! lhunt 458: containing all of the matching <code>Element</code> nodes within the <a
! 459: href="#nodes-subtrees">node’s subtrees</a>, in <a
! 460: href="#document-order">document order</a>. If there are no such nodes, the
1.65 lhunt 461: method <em class=ct>must</em> return an empty <code>NodeList</code>.
1.53 lhunt 462:
463: <p>Both <code title=queryselector><a
464: href="#queryselector">querySelector()</a></code> and <code
465: title=queryselectorall><a
1.65 lhunt 466: href="#queryselectorall">querySelectorAll()</a></code> take a <a
467: href="http://www.w3.org/TR/css3-selectors/#grouping">group of
468: selectors</a> (<var>selectors</var>) as their argument (<a href="#SELECT"
1.86 lhunt 469: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>, section 5). This group of
470: selectors <em class=ct>should</em> match the <code>selectors_group</code>
471: production (<a href="#SELECT"
1.84 lhunt 472: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>, section 10) with the
473: additional provision that leading and trailing <a
474: href="http://www.w3.org/TR/css3-selectors/#whitespace"
475: title=Selectors>whitespace</a> (<a href="#SELECT"
476: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>, section 4) is permitted.
1.86 lhunt 477: This group of selectors <em class=ct>should not</em> use <a
1.87 lhunt 478: href="#namespace-prefix-needs-to-be-resolved"
479: title=need-to-resolve>namespace prefixes that need to be resolved</a>.
1.36 lhunt 480:
1.96 lhunt 481: <p class=note>Implementers are advised that if <code>null</code> or
482: <code>undefined</code> are passed as the value of the <var>selectors</var>
483: parameter, they are to be handled as defined in WebIDL <a href="#WEBIDL"
484: rel=biblioentry>[WEBIDL]<!--{{!WEBIDL}}--></a>. Authors are advised to
485: avoid passing these values.
486:
1.36 lhunt 487: <p class=note>Authors are advised that while the use of pseudo-elements in
488: selectors is permitted, they will not match any elements in the document,
489: and thus would not result in any elements being returned. Therefore,
1.73 lhunt 490: authors are advised to avoid the use of pseudo-elements in selectors that
491: are passed to the methods defined in this specification.
1.36 lhunt 492:
1.94 lhunt 493: <p>The implementation <em class=ct>must</em> first trim any leading and/or
1.61 lhunt 494: trailing <a href="http://www.w3.org/TR/css3-selectors/#whitespace"
1.65 lhunt 495: title=Selectors>whitespace</a> from the value of the <var>selectors</var>
496: parameter. The implementation <em class=ct>must</em> then process the
497: value according to <a
1.61 lhunt 498: href="http://www.w3.org/TR/css3-selectors/#w3cselgrammar">the grammar of
499: Selectors</a> (<a href="#SELECT"
1.89 lhunt 500: rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>, section 10). Selectors are
501: evaluated against a given element in the context of the entire DOM tree in
502: which the element is located. If the given group of selectors is <a
1.54 lhunt 503: href="http://www.w3.org/TR/css3-selectors/#Conformance">invalid</a> (<a
504: href="#SELECT" rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>, section
505: 13), the implementation <em class=ct>must</em> <a
1.25 lhunt 506: href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMException-SYNTAX_ERR">raise
1.54 lhunt 507: a <code>SYNTAX_ERR</code> exception</a> (<a href="#DOM-LEVEL-3-CORE"
508: rel=biblioentry>[DOM-LEVEL-3-CORE]<!--{{!DOM-LEVEL-3-CORE}}--></a>,
509: section 1.4).
1.20 lhunt 510:
1.50 lhunt 511: <p>If the user agent also supports some level of CSS, the implementation
512: <em class=ct>should</em> support the same set of selectors in both these
513: APIs and CSS.
1.1 avankest 514:
1.53 lhunt 515: <p>The <code>NodeList</code> object returned by the <code><a
1.65 lhunt 516: href="#queryselectorall">querySelectorAll()</a></code> method <em
1.53 lhunt 517: class=ct>must</em> be static, not <a
518: href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#td-live"
1.94 lhunt 519: title="Document Object Model Core">live</a> (<a href="#DOM-LEVEL-3-CORE"
1.54 lhunt 520: rel=biblioentry>[DOM-LEVEL-3-CORE]<!--{{!DOM-LEVEL-3-CORE}}--></a>,
1.94 lhunt 521: section 1.1.1). Subsequent changes to the structure of the underlying
1.54 lhunt 522: document <em class=ct>must not</em> be reflected in the
523: <code>NodeList</code> object. This means that the object will instead
524: contain a list of matching <code>Element</code> nodes that were in the
525: document at the time the list was created.
1.1 avankest 526:
1.87 lhunt 527: <h3 id=resolving-namespaces><span class=secno>6.1 </span>Resolving
528: Namespaces</h3>
1.50 lhunt 529:
1.87 lhunt 530: <p>If the group of selectors include <a
531: href="#namespace-prefix-needs-to-be-resolved"
1.65 lhunt 532: title=need-to-resolve>namespace prefixes that need to be resolved</a>, the
1.73 lhunt 533: implementation <em class=ct>must</em> <a
1.68 lhunt 534: href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMException-NAMESPACE_ERR">raise
535: a <code>NAMESPACE_ERR</code> exception</a> (<a href="#DOM-LEVEL-3-CORE"
1.54 lhunt 536: rel=biblioentry>[DOM-LEVEL-3-CORE]<!--{{!DOM-LEVEL-3-CORE}}--></a>,
537: section 1.4).
1.50 lhunt 538:
1.86 lhunt 539: <p class=note>This specification does not provide support for resolving
540: arbitrary namespace prefixes. However, support for a namespace prefix
541: resolution mechanism may be considered for inclusion in a future version
542: of this specification.
543:
1.87 lhunt 544: <p>A <dfn id=namespace-prefix-needs-to-be-resolved
545: title=need-to-resolve>namespace prefix needs to be resolved</dfn> if the
546: namespace component is neither empty (e.g. <code>|div</code>),
547: representing the null namespace, or an asterisk (e.g. <code>*|div</code>),
548: representing any namespace. Since the asterisk or empty namespace prefix
549: do not need to be resolved, implementations that support the namespace
550: syntax in Selectors <em class=ct>must</em> support these. <a
551: href="#SELECT" rel=biblioentry>[SELECT]<!--{{!SELECT}}--></a>
1.60 lhunt 552:
553: <p class=note>Implementations that don't support the namespace syntax in
554: Selectors would instead throw a <code>SYNTAX_ERR</code> because it would
555: be treated as an invalid selector.
1.50 lhunt 556:
1.87 lhunt 557: <h2 id=dom-feature-string><span class=secno>7 </span>DOM Feature String</h2>
1.64 lhunt 558:
1.70 lhunt 559: <p>DOM3 Core defines several methods for checking for interface support, or
560: for obtaining implementations of interfaces, using <a
1.64 lhunt 561: href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMFeatures">feature
1.94 lhunt 562: strings</a> (<a href="#DOM-LEVEL-3-CORE"
1.65 lhunt 563: rel=biblioentry>[DOM-LEVEL-3-CORE]<!--{{!DOM-LEVEL-3-CORE}}--></a>,
1.94 lhunt 564: section 1.3.6). A DOM application can use these methods, each of which
1.70 lhunt 565: accept <var>feature</var> and <var>version</var> parameters, using the
566: values "<code title="">Selectors-API</code>" and "<code>1.0</code>"
567: (respectively).
568:
569: <p>Conforming implementations <em class=ct>must</em> respond with a
570: <code>true</code> value when the <code>hasFeature</code> method is queried
571: with these values. Authors are cautioned, however, that implementations
572: returning <code>true</code> might not be perfectly compliant, and that
573: implementations returning <code>false</code> might well have support for
574: features in this specification; in general, therefore, use of this method
575: is discouraged.
1.64 lhunt 576:
1.87 lhunt 577: <h2 id=examples0><span class=secno>8 </span>Examples</h2>
1.64 lhunt 578:
1.22 lhunt 579: <div class=example>
1.72 lhunt 580: <p>The following examples make use of this sample XHTML document.</p>
1.20 lhunt 581:
1.72 lhunt 582: <pre><html xmlns="http://www.w3.org/1999/xhtml">
1.22 lhunt 583: <head>
584: <title>Selectors API Example</title>
585: </head>
586: <body>
1.72 lhunt 587: <div id="foo">
588: <p class="warning">This is a sample warning</p>
589: <p class="error">This is a sample error</p>
590: </div>
591: <div id="bar">
592: <p>...</p>
593: </div>
1.22 lhunt 594: </body>
1.36 lhunt 595: </html></pre>
1.20 lhunt 596:
1.65 lhunt 597: <p>The methods accept a group of selectors (comma separated) as the
598: argument. The following example would select all <code>p</code> elements
599: in the document that have a class of either "<code>error</code>" or
600: "<code>warning</code>".</p>
601:
602: <pre>var alerts = document.querySelectorAll("p.warning, p.error");</pre>
1.21 lhunt 603:
1.65 lhunt 604: <p>The <code title=document-selectelement>querySelector()</code> methods
605: also accept a group of selectors and they will return the first element
606: (if any) that matches any of the selectors in the group.</p>
607:
608: <pre>var x = document.querySelector("#foo, #bar");</pre>
609:
610: <p><var>x</var> would contain the first element in the document with an ID
1.94 lhunt 611: of either <code>foo</code> or <code>bar</code>, or <code>null</code> if
612: there is no such element. In the sample document above, it would select
613: the <code>div</code> element with the ID of <code>foo</code> because it
614: is first in document order. The order of the selectors used in the
615: parameter has no effect and would have the same result if the order were
616: reversed, as in:</p>
1.81 lhunt 617:
618: <pre>var x = document.querySelector("#bar, #foo");</pre>
619:
620: <p>The methods can also be invoked on elements. In the following example,
621: assume the event handler is registered on an element, and thus the method
622: is invoked on the target element of the event.</p>
1.22 lhunt 623:
1.65 lhunt 624: <pre>function handle(evt) {
625: var x = evt.target.querySelector("span");
626: ...
627: // Do something with x
1.21 lhunt 628: }</pre>
1.14 avankest 629:
1.74 lhunt 630: <p>Even though the method is invoked on an element, selectors are still
631: evaluated in the context of the entire document. In the following
632: example, the method will still match the <code>div</code> element's child
633: <code>p</code> element, even though the <code>body</code> element is not
634: a descendant of the <code>div</code> element itself.</p>
635:
636: <pre>var div = document.getElementById("bar");
1.80 lhunt 637: var p = div.querySelector("body p");</pre>
1.74 lhunt 638:
1.72 lhunt 639: <p>Given this sample fragment that contains a list as a navigation menu:</p>
640:
641: <pre><ul class="nav">
642: <li><a href="/">Home</a></li>
643: <li><a href="/products">Products</a></li>
644: <li><a href="/about">About</a></li>
645: </ul></pre>
646:
647: <p>The following example selects all the <code>li</code> elements and
648: demonstrates how to iterate through the collection in a
1.43 lhunt 649: <code>NodeList</code>.</p>
1.21 lhunt 650:
1.41 lhunt 651: <pre>var lis = document.querySelectorAll("ul.nav>li");
1.24 lhunt 652: for (var i = 0; i < lis.length; i++) {
1.21 lhunt 653: process(lis.item(i));
654: }</pre>
655:
656: <p>In ECMAScript, the language binding also allows <code>NodeList</code>s
1.93 lhunt 657: to be addressed using the array notation, so that loop could be rewritten
658: like this:</p>
1.21 lhunt 659:
1.24 lhunt 660: <pre>for (var i = 0; i < lis.length; i++) {
1.21 lhunt 661: process(lis[i]);
662: }</pre>
663:
1.43 lhunt 664: <p>Since the <code>NodeList</code> objects returned by these methods are
1.22 lhunt 665: not live, changes to the DOM do not affect the content of the list.
1.21 lhunt 666: Consider the <code>process()</code> function called in the previous
667: examples is defined as follows:</p>
668:
1.36 lhunt 669: <pre>function process(elmt) {
1.21 lhunt 670: elmt.parentNode.removeChild(elmt);
671: }</pre>
672:
673: <p>This would cause each selected element to be removed from the DOM, but
1.43 lhunt 674: each element will remain in the <code>NodeList</code>. If the list were a
1.21 lhunt 675: live <code>NodeList</code>, removing an item from the DOM would also
676: remove the element from the list and adjust the indexes of subsequent
677: elements. That would have adverse effects upon the loop because not all
678: selected elements would be processed.</p>
1.87 lhunt 679:
680: <p>In documents comprising elements from multiple namespaces, it's
681: possible that some elements from different namespaces share the same
682: local name. Since this API does not natively support a namespace
683: resolution mechanism for selectors, obtaining a list of such elements
1.94 lhunt 684: from a specific namespace, excluding all others, requires additional
1.87 lhunt 685: processing to filter the result. The following example illustrates a
686: document containing <code>video</code> elements from both the SVG and
687: XHTML namespaces.</p>
688:
689: <pre><svg id="svg1" xmlns="http://www.w3.org/2000/svg"
690: xmlns:xlink="http://www.w3.org/1999/xlink">
691: <video id="svgvideo1" xlink:href="myvideo.ogg" width="320" height="240"/>
692: <foreignObject width="100" height="100">
693: <video id="htmlvideo1" src="myvideo.ogg" xmlns="http://www.w3.org/1999/xhtml">No video1</video>
694: </foreignObject>
695: </svg></pre>
696:
697: <p>The following script demonstrates how to first select the
698: <code>video</code> elements and then filter out the unwanted elements
699: based on their namespace.</p>
700:
701: <pre>var list = document.querySelectorAll("svg video");
702: var result = new Array();
703: var svgns = "http://www.w3.org/2000/svg"
704:
705: for(var i = 0; i < elms.length; i++) {
706: if(elms[i].namespaceURI == svgns) {
707: result.push(elms[i]);
708: }
709: }</pre>
1.21 lhunt 710: </div>
711:
1.11 avankest 712: <h2 class=no-num id=references>References</h2>
1.1 avankest 713:
1.54 lhunt 714: <h3 class=no-num id=normative-references>Normative references</h3>
715: <!--begin-normative-->
716: <!-- Sorted by label -->
717:
718: <dl class=bibliography>
719: <dt style="display: none"><!-- keeps the doc valid if the DL is empty -->
720: <!---->
721:
722: <dt id=DOM-LEVEL-3-CORE>[DOM-LEVEL-3-CORE]
723:
1.88 lhunt 724: <dd>Gavin Nicol; et al. <a
1.54 lhunt 725: href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407"><cite>Document
726: Object Model (DOM) Level 3 Core Specification.</cite></a> 7 April 2004.
727: W3C Recommendation. URL: <a
728: href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407">http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407</a>
729: </dd>
730: <!---->
731:
732: <dt id=RFC2119>[RFC2119]
733:
734: <dd>S. Bradner. <a href="http://www.ietf.org/rfc/rfc2119.txt"><cite>Key
735: words for use in RFCs to Indicate Requirement Levels.</cite></a> Internet
736: RFC 2119. URL: <a
737: href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt</a>
738: </dd>
739: <!---->
740:
741: <dt id=SELECT>[SELECT]
742:
1.88 lhunt 743: <dd>Daniel Glazman; et al. <a
1.54 lhunt 744: href="http://www.w3.org/TR/2005/WD-css3-selectors-20051215"><cite>Selectors.</cite></a>
745: 15 December 2005. W3C Working Draft. (Work in progress.) URL: <a
746: href="http://www.w3.org/TR/2005/WD-css3-selectors-20051215">http://www.w3.org/TR/2005/WD-css3-selectors-20051215</a>
747: </dd>
748: <!---->
1.76 lhunt 749:
750: <dt id=WEBIDL>[WEBIDL]
751:
752: <dd>Cameron McCormack. <a
1.88 lhunt 753: href="http://www.w3.org/TR/2008/WD-WebIDL-20081219"><cite>Web
754: IDL.</cite></a> 19 December 2008. W3C Working Draft. (Work in progress.)
1.76 lhunt 755: URL: <a
1.88 lhunt 756: href="http://www.w3.org/TR/2008/WD-WebIDL-20081219">http://www.w3.org/TR/2008/WD-WebIDL-20081219</a>
1.76 lhunt 757: </dd>
758: <!---->
1.54 lhunt 759: </dl>
760: <!--end-normative-->
1.1 avankest 761:
1.84 lhunt 762: <h3 class=no-num id=informative-references>Informative references</h3>
1.54 lhunt 763: <!--begin-informative-->
764: <!-- Sorted by label -->
765:
766: <dl class=bibliography>
767: <dt style="display: none"><!-- keeps the doc valid if the DL is empty -->
768: <!---->
769:
1.69 lhunt 770: <dt id=CSS21>[CSS21]
771:
772: <dd>Bert Bos; et al. <a
773: href="http://www.w3.org/TR/2007/CR-CSS21-20070719"><cite>Cascading Style
774: Sheets Level 2 Revision 1 (CSS 2.1) Specification.</cite></a> 19 July
775: 2007. W3C Candidate Recommendation. (Work in progress.) URL: <a
776: href="http://www.w3.org/TR/2007/CR-CSS21-20070719">http://www.w3.org/TR/2007/CR-CSS21-20070719</a>
777: </dd>
778: <!---->
779:
1.54 lhunt 780: <dt id=DOM-LEVEL-2-STYLE>[DOM-LEVEL-2-STYLE]
781:
782: <dd>Vidur Apparao; Philippe Le Hégaret; Chris Wilson. <a
783: href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113"><cite>Document
784: Object Model (DOM) Level 2 Style Specification.</cite></a> 13 November
785: 2000. W3C Recommendation. URL: <a
786: href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113">http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113</a>
787: </dd>
788: <!---->
789:
790: <dt id=ECMA-262>[ECMA-262]
791:
792: <dd><a
793: href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"><cite>ECMAScript
794: Language Specification, Third Edition.</cite></a> December 1999. URL: <a
795: href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">http://www.ecma-international.org/publications/standards/Ecma-262.htm</a>
796: </dd>
797: <!---->
1.1 avankest 798: </dl>
1.54 lhunt 799: <!--end-informative-->
1.1 avankest 800:
1.11 avankest 801: <h2 class=no-num id=acknowledgements>Acknowledgements</h2>
1.1 avankest 802:
1.45 avankest 803: <p>The editors would like to thank to the following people who have
1.7 avankest 804: contributed to this specification (ordered on first name):
805:
1.84 lhunt 806: <p>Adam van den Hoven, Alan Gresley, Alex Russell, Björn Höhrmann, Boris
807: Zbarsky, Cameron McCormack, Charles McCathieNevile, Chris Wilson,
808: Christophe Jolif, Daniel Glazman, Daniel Schierbeck, Dave Massy, David
809: "liorean" Andersson, David Håsäther, Dean Jackson, Doug Schepers, Erik
810: Dahlström, Francois Remy, Garret Smith, Hallvord R. M. Steen, Ian
811: Hickson, Ivan Enderlin, Jean-Yves Bitterlich, Jim Ley, João Eiras, John
812: Resig, Jon Ferraiolo, Jonas Sicking, Jorgen Horstink, Karl Dubost,
813: Kartikaya Gupta, L. David Baron, Maciej Stachowiak, Magnus Kristiansen,
814: Martijn, Masataka Yakura, Mihai Sucan, Mohamed Zergaoui, Nicholas C.
815: Zakas, Nicolas Mendoza, Philip Taylor, Robert Sayre, Robin Berjon, Sander,
816: Sergey Ilinsky, Simon Pieters, Steven Pemberton, Tarquin Wilton-Jones,
817: Travis Leithead, and William J. Edney
1.1 avankest 818:
819: <p>Thanks to all those who have helped to improve this specification by
1.96 lhunt 820: sending suggestions and corrections.
Webmaster