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