---
tags: Javascript,
disqus: hackmd
---
# [JS]HTMLCollection使用Array方法|chris_Hsiao
為什麼不直接使用dd接forEach就好,還要用Array.prototype?
答:getElementsByClassName返回的是一個collection,並非array。
藉由此題暸解到,HTML collection,也可以直接跑array的方式,
不用再特地轉array或使用for loop。
```javascript=
var dd = document.getElementsByClassName('item');
Array.prototype.forEach.call(dd, function(element) {
element.addEventListener('click', function() {
console.log('element', element);
});
});
```
ES2015 (aka ES6)
```javascript=
const dd = document.getElementsByClassName('item');
Array.from(dd).forEach(element => {
element.addEventListener('click', () => {
console.log('element', element);
});
});
```
#### 參考文章
[Click on multiple elements same class name](https://stackoverflow.com/questions/54508019/click-on-multiple-elements-same-class-name)
---
### 轉array
或者可以使用slice
[Most efficient way to convert an HTMLCollection to an Array](https://stackoverflow.com/questions/222841/most-efficient-way-to-convert-an-htmlcollection-to-an-array)
Array.prototype.slice.call跟[].slice.call,
雖然效果一樣,但還是有一點不一樣,可以再上網查一下有什麼差別。
```javascript=
var arr = Array.prototype.slice.call( htmlCollection );
var arr = [].slice.call(htmlCollection);
```
ES6
```javascript=
var arr = Array.from(htmlCollection); //ie不支援
var arr = [...htmlCollection]; //ie不支援
```
---
### for loop
```javascript=
var dd = document.getElementsByClassName('item');
for (var i = 0, i < dd.length; i++) {
dd[i].addEventListener('click', function() {
console.log('element', element);
});
};
```