diff --git a/2-ui/1-document/04-searching-elements-dom/1-find-elements/solution.md b/2-ui/1-document/04-searching-elements-dom/1-find-elements/solution.md index 1ec4ebf131..cefc4a2443 100644 --- a/2-ui/1-document/04-searching-elements-dom/1-find-elements/solution.md +++ b/2-ui/1-document/04-searching-elements-dom/1-find-elements/solution.md @@ -1,36 +1,35 @@ 实现的方式有很多种。 -以下是列举的一些方法: +以下列举的是其中一些方法: ```js -// 1. The table with `id="age-table"`. +// 1. 带有 id="age-table" 的表格。 let table = document.getElementById('age-table') -// 2. All label elements inside that table +// 2. 表格内的所有 label 元素 table.getElementsByTagName('label') -// or +// 或 document.querySelectorAll('#age-table label') -// 3. The first td in that table (with the word "Age"). +// 3. 表格中的第一个 td(带有 "Age" 字段) table.rows[0].cells[0] -// or +// 或 table.getElementsByTagName('td')[0] -// or +// 或 table.querySelector('td') -// 4. The form with the name "search". -// assuming there's only one element with name="search" +// 4. 带有 name="search" 的 form。 +// 假设文档中只有一个 name="search" 的元素 let form = document.getElementsByName('search')[0] -// or, form specifically +// 或者,专门对于 form document.querySelector('form[name="search"]') -// 5. The first input in that form. -form.getElementsByTagName('input') -// or +// 5. 表单中的第一个 input +form.getElementsByTagName('input')[0] +// 或 form.querySelector('input') -// 6. The last input in that form. -// there's no direct query for that -let inputs = form.querySelectorAll('input') // search all -inputs[inputs.length-1] // take last +// 6. 表单中的最后一个 input +let inputs = form.querySelectorAll('input') // 查找所有 input +inputs[inputs.length-1] // 取出最后一个 ``` diff --git a/2-ui/1-document/04-searching-elements-dom/1-find-elements/task.md b/2-ui/1-document/04-searching-elements-dom/1-find-elements/task.md index ef01ae7f4a..71024c7b4f 100644 --- a/2-ui/1-document/04-searching-elements-dom/1-find-elements/task.md +++ b/2-ui/1-document/04-searching-elements-dom/1-find-elements/task.md @@ -4,15 +4,15 @@ importance: 4 # 搜索元素 -这是带有表格和表单的文档。 +这是带有表格(table)和表单(form)的文档。 -如何查找? +如何查找?…… -1. `id="age-table"` 的表格。 -2. 所有的 `label` 元素都内嵌于表格(应该有三个)。 -3. 表格中的第一个 `td`(字段是 "Age")。 -4. `form` 的一个字段是 `search`。 -5. 第一个 `input` 在表单中。 -6. 最后一个 `input` 在表单中。 +1. 带有 `id="age-table"` 的表格。 +2. 表格内的所有 `label` 元素(应该有三个)。 +3. 表格中的第一个 `td`(带有 "Age" 字段)。 +4. 带有 `name="search"` 的 `form`。 +5. 表单中的第一个 `input`。 +6. 表单中的最后一个 `input`。 -新开一个独立的窗口,打开页面 [table.html](table.html),然后再此页面上使用开发者工具。 +在一个单独的窗口中打开 [table.html](table.html) 页面,并对此页面使用浏览器开发者工具。 diff --git a/2-ui/1-document/04-searching-elements-dom/article.md b/2-ui/1-document/04-searching-elements-dom/article.md index c5e52bbe2e..f0729aa565 100644 --- a/2-ui/1-document/04-searching-elements-dom/article.md +++ b/2-ui/1-document/04-searching-elements-dom/article.md @@ -1,44 +1,12 @@ -# 搜索: getElement* 和 querySelector* +# 搜索:getElement*,querySelector* -当元素关联较密切时,DOM 导航属性是最好的。万一不是这样该怎么办?如何去获取页面上的任意一个元素? +当元素彼此靠得近时,DOM 导航(navigation)属性是最好的。如果不是,那该怎么办?如何去获取页面上的任意一个元素? -还有其他的搜索方法。 -## document.getElementById 或者只使用 id - -如果元素有 `id` 属性,那么该 `id` 也会有一个同名全局变量。 - -我们可以用以下方式来访问元素: - -```html run -
| Your age: | +……除非我们声明一个具有相同名称的 JavaScript 变量,否则它具有优先权: -- - - - | -
getElementsByTagName。
+```warn header="请不要使用以 id 命名的全局变量来访问元素"
+[在规范中](http://www.whatwg.org/specs/web-apps/current-work/#dom-window-nameditem) 对此行为进行了描述,所以它是一种标准。但这是注意考虑到兼容性才支持的。
-`"s"` 字符并不存在于 `getElementById`,因为它只返回单个元素。但是 `getElementsByTagName` 返回的是一个元素集合,所以 `"s"` 包含在内。
-```
+浏览器尝试通过混合 JavaScript 和 DOM 的命名空间来帮助我们。对于内联到 HTML 中的简单脚本来说,这还行,但是通常来说,这不是一件好事。因为这可能会造成命名冲突。另外,当人们阅读 JavaScript 代码且看不到对应的 HTML 时,变量的来源就会不明显。
-````warn header="It returns a collection, not an element!"
-另一个普遍存在的错误写法是:
+在本教程中,我们只会在元素来源非常明显时,为了简洁起见,才会使用 `id` 直接引用对应的元素。
-```js
-// 无法运行
-document.getElementsByTagName('input').value = 5;
+在实际开发中,`document.getElementById` 是首选方法。
```
-这无法运行,因为它接受输入的**集合**然后将值赋给它,而不是它里面的元素。
-
-我们应该迭代集合或者按给定索引来获取元素,然后赋值,就像下述所示:
+```smart header="`id` 必须是唯一的"
+`id` 必须是唯一的。在文档中,只能有一个元素带有给定的 `id`。
-```js
-// 应该可以运行(如果有输入)
-document.getElementsByTagName('input')[0].value = 5;
+如果有多个元素都带有同一个 `id`,那么使用它的方法的行为是不可预测的,例如 `document.getElementById` 可能会随机返回其中一个元素。因此,请遵守规则,保持 `id` 的唯一性。
```
-````
-
-还有其他很少使用的方法:
-
-- `elem.getElementsByClassName(className)` 返回具有给定 CSS 类的元素。元素也可能含有其他的类。
-- `document.getElementsByName(name)` 返回具有给定 `name` 属性的元素,文档范围。因为历史原因而很少使用。在这里提出,只是考虑到了完整性。
-
-例如:
-
-```html run height=50
-
-
+```warn header="只有 `document.getElementById`,没有 `anyElem.getElementById`"
+`getElementById` 方法只能被在 `document` 对象上调用。它会在整个文档中查找给定的 `id`。
```
## querySelectorAll [#querySelectorAll]
-现在将进行重要的内容
+到目前为止,最通用的方法是 `elem.querySelectorAll(css)`,它返回 `elem` 中与给定 CSS 选择器匹配的所有元素。
-`elem.querySelectorAll(css)` 的调用将返回与给定 CSS 选择器匹配 `elem` 中的所有元素。这是最常用和最有力的方法。
-
-我们将查找所有为最后一个子元素的 `| Your age: | + ++ + + + | +
getElementsByTagName。
+
+`getElementById` 中没有字母 `"s"`,是因为它只返回单个元素。但是 `getElementsByTagName` 返回的是元素的集合,所以里面有 `"s"`。
+```
+
+````warn header="它返回的是一个集合,不是一个元素!"
+新手的另一个普遍的错误是写:
+
+```js
+// 行不通
+document.getElementsByTagName('input').value = 5;
+```
+
+这是行不通的,因为它需要的是一个 input 的 **集合**,并将值赋(assign)给它,而不是赋值给其中的一个元素。
+
+我们应该遍历集合或通过对应的索引来获取元素,然后赋值,如下所示:
+
+```js
+// 应该可以运行(如果有 input)
+document.getElementsByTagName('input')[0].value = 5;
+```
+````
+
+查找 `.article` 元素:
+
+```html run height=50
+
+
+
+```
+
+## 实时的集合
+
+所有的 `"getElementsBy*"` 方法都会返回一个 **实时的(live)** 集合。这样的集合始终反映的是文档的当前状态,并且在文档发生更改时会“自动更新”。
+
+在下面的例子中,有两个脚本。
+
+1. 第一个创建了对 `querySelector |
+CSS-selector | +✔ | +- | +|
querySelectorAll |
+CSS-selector | +✔ | +- | +|
getElementById |
id |
- | @@ -350,29 +360,15 @@ CSS 选择器的伪类,如 `:hover` 和 `:active` 都是被支持的。例如✔ | ✔ |
querySelector |
-CSS-selector | -✔ | -- | -|
querySelectorAll |
-CSS-selector | -✔ | -- | -