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>) &lt;<a
                     67:      href="mailto:annevk@opera.com">annevk@opera.com</a>&gt;
                     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>) &lt;<a
1.20      lhunt      71:      href="mailto:lachlan.hunt@lachy.id.au">lachlan.hunt@lachy.id.au</a>&gt;
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>&lt;table id="score">
                    248:   &lt;thead>
                    249:     &lt;tr>
                    250:       &lt;th>Test
                    251:       &lt;th>Result
                    252:   &lt;tfoot>
                    253:     &lt;tr>
                    254:       &lt;th>Average
                    255:       &lt;td>82%
                    256:   &lt;tbody>
                    257:     &lt;tr>
                    258:       &lt;td>A
                    259:       &lt;td>87%
                    260:     &lt;tr>
                    261:       &lt;td>B
                    262:       &lt;td>78%
                    263:     &lt;tr>
                    264:       &lt;td>C
                    265:       &lt;td>81%
                    266: &lt;/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 &lt; groups.length; i++) {
                    281:   rows = groups[i].rows;
                    282:   for (var j = 0; j &lt; 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&gt;tbody&gt;tr&gt;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 &lt; 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>&lt;html xmlns="http://www.w3.org/1999/xhtml">
1.22      lhunt     598:   &lt;head>
                    599:     &lt;title&gt;Selectors API Example&lt;/title&gt;
                    600:   &lt;/head>
                    601:   &lt;body>
1.72      lhunt     602:     &lt;div id="foo"&gt;
                    603:       &lt;p class="warning"&gt;This is a sample warning&lt;/p&gt;
                    604:       &lt;p class="error"&gt;This is a sample error&lt;/p&gt;
                    605:     &lt;/div&gt;
                    606:     &lt;div id="bar"&gt;
                    607:       &lt;p&gt;...&lt;/p&gt;
                    608:     &lt;/div&gt;
1.22      lhunt     609:   &lt;/body>
1.36      lhunt     610: &lt;/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>&lt;ul class="nav"&gt;
                    657:   &lt;li&gt;&lt;a href="/"&gt;Home&lt;/a&gt;&lt;/li&gt;
                    658:   &lt;li&gt;&lt;a href="/products"&gt;Products&lt;/a&gt;&lt;/li&gt;
                    659:   &lt;li&gt;&lt;a href="/about"&gt;About&lt;/a&gt;&lt;/li&gt;
                    660: &lt;/ul&gt;</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&gt;li");
1.24      lhunt     667: for (var i = 0; i &lt; 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 &lt; 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>&lt;svg id=&quot;svg1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;
                    705:                xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&gt;
                    706:   &lt;video id=&quot;svgvideo1&quot; xlink:href=&quot;myvideo.ogg&quot; width=&quot;320&quot; height=&quot;240&quot;/&gt;
                    707:   &lt;foreignObject width=&quot;100&quot; height=&quot;100&quot;&gt;
                    708:     &lt;video id=&quot;htmlvideo1&quot; src=&quot;myvideo.ogg&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;No video1&lt;/video&gt;
                    709:   &lt;/foreignObject&gt;
                    710: &lt;/svg&gt;</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&#233;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