Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Commit 0a7f12f

Browse files
committed
docs(dom): edit attribute
1 parent db45bbf commit 0a7f12f

6 files changed

Lines changed: 274 additions & 71 deletions

File tree

a.out

Whitespace-only changes.

chapters.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,12 @@
5050
- dom/parentnode.md: ParentNode 接口,ChildNode 接口
5151
- dom/document.md: Document 节点
5252
- dom/element.md: Element 节点
53+
- dom/attributes.md: 属性的操作
5354
- dom/globaleventhandlers.md: GlobalEventHandlers 接口
5455
- bom/: 浏览器模型
5556
- bom/cookie.md: Cookie
5657
- bom/same-origin.md: 同源限制
5758
- bom/location.md: Location 对象,URL 对象,URLSearchParams 对象
5859
- elements/: 网页元素接口
5960
- elements/a.md: <a>
60-
- elements/image.md: <image>
61+
- elements/image.md: <img>

docs/bom/same-origin.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ window.onhashchange = checkMessage;
148148
function checkMessage() {
149149
var message = window.location.hash;
150150
// ...
151-
}r
151+
}
152152
```
153153

154154
同样的,子窗口也可以改变父窗口的片段标识符。

docs/dom/attributes.md

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
# 属性的操作
2+
3+
HTML 元素包括标签名和若干个键值对,这个键值对就称为“属性”(attribute)。
4+
5+
```html
6+
<a id="test" href="http://www.example.com">
7+
链接
8+
</a>
9+
```
10+
11+
上面代码中,`a`元素包括两个属性:`id`属性和`href`属性。
12+
13+
属性本身是一个对象(`Attr`对象),但是实际上,这个对象极少使用。一般都是通过元素节点对象(`HTMlElement`对象)来操作属性。本章介绍如何操作这些属性。
14+
15+
## Element.attributes 属性
16+
17+
元素对象有一个`attributes`属性,返回一个类似数组的动态对象,成员是该元素标签的所有属性节点对象,属性的实时变化都会反映在这个节点对象上。其他类型的节点对象,虽然也有`attributes`属性,但返回的都是`null`,因此可以把这个属性视为元素对象独有的。
18+
19+
单个属性可以通过序号引用,也可以通过属性名引用。
20+
21+
```javascript
22+
// HTML 代码如下
23+
// <body bgcolor="yellow" onload="">
24+
document.body.attributes[0]
25+
document.body.attributes.bgcolor
26+
document.body.attributes['ONLOAD']
27+
```
28+
29+
注意,上面代码的三种方法,返回的都是属性节点对象,而不是属性值。
30+
31+
属性节点对象有`name``value`属性,对应该属性的属性名和属性值,等同于`nodeName`属性和`nodeValue`属性。
32+
33+
```javascript
34+
// HTML代码为
35+
// <div id="mydiv">
36+
var n = document.getElementById('mydiv');
37+
38+
n.attributes[0].name // "id"
39+
n.attributes[0].nodeName // "id"
40+
41+
n.attributes[0].value // "mydiv"
42+
n.attributes[0].nodeValue // "mydiv"
43+
```
44+
45+
下面代码可以遍历一个元素节点的所有属性。
46+
47+
```javascript
48+
var para = document.getElementsByTagName('p')[0];
49+
var result = document.getElementById('result');
50+
51+
if (para.hasAttributes()) {
52+
var attrs = para.attributes;
53+
var output = '';
54+
for(var i = attrs.length - 1; i >= 0; i--) {
55+
output += attrs[i].name + '->' + attrs[i].value;
56+
}
57+
result.textContent = output;
58+
} else {
59+
result.textContent = 'No attributes to show';
60+
}
61+
```
62+
63+
## 元素的标准属性
64+
65+
HTML 元素的标准属性(即在标准中定义的属性),会自动成为元素节点对象的属性。
66+
67+
```javascript
68+
var a = document.getElementById('test');
69+
a.id // "test"
70+
a.href // "http://www.example.com/"
71+
```
72+
73+
上面代码中,`a`元素标签的属性`id``href`,自动成为节点对象的属性。
74+
75+
这些属性都是可写的。
76+
77+
```javascript
78+
var img = document.getElementById('myImage');
79+
img.src = 'http://www.example.com/image.jpg';
80+
```
81+
82+
上面的写法,会立刻替换掉`img`对象的`src`属性,即会显示另外一张图片。
83+
84+
这种修改属性的方法,常常用于添加表单的属性。
85+
86+
```javascript
87+
var f = document.forms[0];
88+
f.action = 'submit.php';
89+
f.method = 'POST';
90+
```
91+
92+
上面代码为表单添加提交网址和提交方法。
93+
94+
注意,这种用法虽然可以读写属性,但是无法删除属性,`delete`运算符在这里不会生效。
95+
96+
HTML 元素的属性名是大小写不敏感的,但是 JavaScript 对象的属性名是大小写敏感的。转换规则是,转为 JavaScript 属性名时,一律采用小写。如果属性名包括多个单词,则采用骆驼拼写法,即从第二个单词开始,每个单词的首字母采用大写,比如`onClick`
97+
98+
有些 HTML 属性名是 JavaScript 的保留字,转为 JavaScript 属性时,必须改名。主要是以下两个。
99+
100+
- `for`属性改为`htmlFor`
101+
- `class`属性改为`className`
102+
103+
另外,HTML 属性值一般都是字符串,但是 JavaScript 属性会自动转换类型。比如,将字符串`true`转为布尔值,将`onClick`的值转为一个函数,将`style`属性的值转为一个`CSSStyleDeclaration`对象。因此,可以对这些属性赋予各种类型的值。
104+
105+
## 属性操作的标准方法
106+
107+
### 概述
108+
109+
元素节点提供六个方法,用来操作属性。
110+
111+
- `getAttribute()`
112+
- `getAttributeNames()`
113+
- `setAttribute()`
114+
- `hasAttribute()`
115+
- `hasAttributes()`
116+
- `removeAttribute()`
117+
118+
这有几点注意。
119+
120+
(1)适用性
121+
122+
这六个方法对所有属性(包括用户自定义的属性)都适用。
123+
124+
(2)返回值
125+
126+
`getAttribute()`只返回字符串,不会返回其他类型的值。
127+
128+
(3)属性名
129+
130+
这些方法只接受属性的标准名称,不用改写保留字,比如`for``class`都可以直接使用。另外,这些方法对于属性名是大小写不敏感的。
131+
132+
```javascript
133+
var image = document.images[0];
134+
image.setAttribute('class', 'myImage');
135+
```
136+
137+
上面代码中,`setAttribute`方法直接使用`class`作为属性名,不用写成`className`
138+
139+
### Element.getAttribute()
140+
141+
`Element.getAttribute`方法返回当前元素节点的指定属性。如果指定属性不存在,则返回`null`
142+
143+
```javascript
144+
// HTML 代码为
145+
// <div id="div1" align="left">
146+
var div = document.getElementById('div1');
147+
div.getAttribute('align') // "left"
148+
```
149+
150+
### Element.getAttributeNames()
151+
152+
`Element.getAttributeNames()`返回一个数组,成员是当前元素的所有属性的名字。如果当前元素没有任何属性,则返回一个空数组。使用`Element.attributes`属性,也可以拿到同样的结果,唯一的区别是它返回的是类似数组的对象。
153+
154+
```javascript
155+
var mydiv = document.getElementById('mydiv');
156+
157+
mydiv.getAttributeNames().forEach(function (key) {
158+
var value = mydiv.getAttribute(key);
159+
console.log(key, value);
160+
})
161+
```
162+
163+
上面代码用于遍历某个节点的所有属性。
164+
165+
### Element.setAttribute()
166+
167+
`Element.setAttribute`方法用于为当前元素节点新增属性。如果同名属性已存在,则相当于编辑已存在的属性。该方法没有返回值。
168+
169+
```javascript
170+
// HTML 代码为
171+
// <button>Hello World</button>
172+
var b = document.querySelector('button');
173+
b.setAttribute('name', 'myButton');
174+
b.setAttribute('disabled', true);
175+
```
176+
177+
上面代码中,`button`元素的`name`属性被设成`myButton``disabled`属性被设成`true`
178+
179+
这里有两个地方需要注意,首先,属性值总是字符串,其他类型的值会自动转成字符串,比如布尔值`true`就会变成字符串`true`;其次,上例的`disable`属性是一个布尔属性,对于`<button>`元素来说,这个属性不需要属性值,只要设置了就总是会生效,因此`setAttribute`方法里面可以将`disabled`属性设成任意值。
180+
181+
### Element.hasAttribute()
182+
183+
`Element.hasAttribute`方法返回一个布尔值,表示当前元素节点是否包含指定属性。
184+
185+
```javascript
186+
var d = document.getElementById('div1');
187+
188+
if (d.hasAttribute('align')) {
189+
d.setAttribute('align', 'center');
190+
}
191+
```
192+
193+
上面代码检查`div`节点是否含有`align`属性。如果有,则设置为居中对齐。
194+
195+
### Element.hasAttributes()
196+
197+
`Element.hasAttributes`方法返回一个布尔值,表示当前元素是否有属性,如果没有任何属性,就返回`false`,否则返回`true`
198+
199+
```javascript
200+
var foo = document.getElementById('foo');
201+
foo.hasAttributes() // true
202+
```
203+
204+
### Element.removeAttribute()
205+
206+
`Element.removeAttribute`方法移除指定属性。该方法没有返回值。
207+
208+
```javascript
209+
// HTML 代码为
210+
// <div id="div1" align="left" width="200px">
211+
document.getElementById('div1').removeAttribute('align');
212+
// 现在的HTML代码为
213+
// <div id="div1" width="200px">
214+
```
215+
216+
## dataset 属性
217+
218+
有时,需要在HTML元素上附加数据,供 JavaScript 脚本使用。一种解决方法是自定义属性。
219+
220+
```html
221+
<div id="mydiv" foo="bar">
222+
```
223+
224+
上面代码为`div`元素自定义了`foo`属性,然后可以用`getAttribute()``setAttribute()`读写这个属性。
225+
226+
```javascript
227+
var n = document.getElementById('mydiv');
228+
n.getAttribute('foo') // bar
229+
n.setAttribute('foo', 'baz')
230+
```
231+
232+
这种方法虽然可以达到目的,但是会使得 HTML 元素的属性不符合标准,导致网页代码通不过校验。
233+
234+
更好的解决方法是,使用标准提供的`data-*`属性。
235+
236+
```html
237+
<div id="mydiv" data-foo="bar">
238+
```
239+
240+
然后,使用元素节点对象的`dataset`属性,它指向一个对象,可以用来操作 HTML 元素标签的`data-*`属性。
241+
242+
```javascript
243+
var n = document.getElementById('mydiv');
244+
n.dataset.foo // bar
245+
n.dataset.foo = 'baz'
246+
```
247+
248+
上面代码中,通过`dataset.foo`读写`data-foo`属性。
249+
250+
删除一个`data-*`属性,可以直接使用`delete`命令。
251+
252+
```javascript
253+
delete document.getElementById('myDiv').dataset.foo;
254+
```
255+
256+
除了`dataset`属性,也可以用`getAttribute('data-foo')``removeAttribute('data-foo')``setAttribute('data-foo')``hasAttribute('data-foo')`等方法操作`data-*`属性。
257+
258+
注意,`data-`后面的属性名有限制,只能包含字母、数字、连词线(`-`)、点(`.`)、冒号(`:`)和下划线(`_`)。而且,属性名不应该使用`A``Z`的大写字母,比如不能有`data-helloWorld`这样的属性名,而要写成`data-hello-world`
259+
260+
转成`dataset`的键名时,连词线后面如果跟着一个小写字母,那么连词线会被移除,该小写字母转为大写字母,其他字符不变。反过来,`dataset`的键名转成属性名时,所有大写字母都会被转成连词线+该字母的小写形式,其他字符不变。比如,`dataset.helloWorld`会转成`data-hello-world`
261+

docs/dom/element.md

Lines changed: 9 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ HTML 元素可以设置`contentEditable`属性,使得元素的内容可以编
122122

123123
### Element.attributes
124124

125-
`Element.attributes`属性返回一个类似数组的对象,成员是当前元素节点的所有属性节点,详见《Attr 对象》一章。
125+
`Element.attributes`属性返回一个类似数组的对象,成员是当前元素节点的所有属性节点,详见《属性的操作》一章。
126126

127127
```javascript
128128
var p = document.querySelector('p');
@@ -493,75 +493,16 @@ el.nextElementSibling
493493

494494
### 属性相关方法
495495

496-
以下方法用来操作当前节点的属性
496+
元素节点提供六个方法,用来操作属性
497497

498-
**(1)Element.getAttribute()**
498+
- `getAttribute()`:读取某个属性的值
499+
- `getAttributeNames()`:返回当前元素的所有属性名
500+
- `setAttribute()`:写入属性值
501+
- `hasAttribute()`:某个属性是否存在
502+
- `hasAttributes()`:当前元素是否有属性
503+
- `removeAttribute()`:删除属性
499504

500-
`Element.getAttribute`方法接受一个字符串作为参数,返回同名属性的值。如果没有该属性,则返回`null`
501-
502-
```javascript
503-
var mydiv = document.getElementById('mydiv');
504-
var id = mydiv.getAttribute('id');
505-
```
506-
507-
上面代码读取`mydiv``id`的值。
508-
509-
**(2)Element.getAttributeNames()**
510-
511-
`Element.getAttributeNames()`返回一个数组,成员是当前元素的所有属性的名字。如果当前元素没有任何属性,则返回一个空数组。使用`Element.attributes`属性,也可以拿到同样的结果,唯一的区别是它返回的是类似数组的对象。
512-
513-
```javascript
514-
var mydiv = document.getElementById('mydiv');
515-
516-
mydiv.getAttributeNames().forEach(function (key) {
517-
var value = mydiv.getAttribute(key);
518-
console.log(key, value);
519-
})
520-
```
521-
522-
上面代码用于遍历某个节点的所有属性。
523-
524-
**(3)Element.setAttribute()**
525-
526-
`Element.setAttribute`方法用于为当前节点设置属性。如果属性已经存在,将更新属性值,否则将添加该属性。该方法没有返回值。
527-
528-
```javascript
529-
// HTML 代码为
530-
// <button>Hello World</button>
531-
var b = document.querySelector('button');
532-
b.setAttribute('name', 'myButton');
533-
b.setAttribute('disabled', true);
534-
```
535-
536-
上面代码中,`button`元素的`name`属性被设成`myButton``disabled`属性被设成`true`
537-
538-
这里有两个地方需要注意,首先,属性值总是字符串,其他类型的值会自动转成字符串,比如布尔值`true`就会变成字符串`true`;其次,上例的`disable`属性是一个布尔属性,对于`<button>`元素来说,这个属性不需要属性值,只要设置了就总是会生效,因此`setAttribute`方法里面可以将`disabled`属性设成任意值。
539-
540-
**(4)Element.hasAttribute()**
541-
542-
`Element.hasAttribute`方法返回一个布尔值,表示当前元素节点是否有指定的属性。
543-
544-
```javascript
545-
var foo = document.getElementById('foo');
546-
foo.hasAttribute('bar') // false
547-
```
548-
549-
**(5)Element.hasAttributes()**
550-
551-
`Element.hasAttributes`方法返回一个布尔值,表示当前元素是否有属性,如果没有任何属性,就返回`false`,否则返回`true`
552-
553-
```javascript
554-
var foo = document.getElementById('foo');
555-
foo.hasAttributes() // true
556-
```
557-
558-
**(6)Element.removeAttribute()**
559-
560-
`Element.removeAttribute`方法移除指定属性。该方法没有返回值。
561-
562-
```javascript
563-
document.getElementById('div1').removeAttribute('id')
564-
```
505+
这些方法的介绍请看《属性的操作》一章。
565506

566507
### Element.querySelector()
567508

docs/elements/image.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# <image> 元素
1+
# <img> 元素
22

33
## 概述
44

0 commit comments

Comments
 (0)