2017년 12월 20일 수요일

HTML 에서 Array.forEach 의 한계 -> ie, getElementsByName

HTML 에서 Array.forEach 의 한계 -> ie, getElementsByName

chrome, firefox 등에서는 input 을 getElementsByName 등으로 잡을 경우
Array로 잡아준다.
반면 ie는 HtmlCollection 이라는 것으로 잡아준다.

그래서 forEach는 동작하지 않는다.
HtmlCollection 이 Array 처럼 동작하게 하기 위한 파싱.. 따로 prototype 에 extend 하지는 않고 그냥 함수에 인자로 해당 HtmlCollection을 넣는 식으로 구성했다.
/**
 * for IE HtmlCollection parse to Array
 */
var toArray = function(eles) {
       // shield
       if (eles.forEach && typeof eles.forEach == 'function') {
              return eles;
       }
       
       var ELEMENT_NODE = 1;
       var isElements = (eles.item && (eles.item(0).nodeType == ELEMENT_NODE));
       if (!isElements) {
              if (window.console) {
                     console.log("toArray use only Elements.");
              }
              return eles;
       }
       
       // logic
       var tempItem;
       var resArr = [];
       var htmlCollection = eles;
       for (var i = 0, len = htmlCollection.length; i < len; i++) {
              tempItem = htmlCollection.item(i);
              resArr.push(tempItem);
       };
       return resArr;
}

ele.labes 하면 input 인경우 htmlFor 가 해당 input id와 동일한 label 을 가져온다.
이 것도 ie에는 없다.
인풋의_아이디 가 해당 input 의id라고 할 때
document.querySelector('label[for'+인풋의_아이디+'])
로 가져올 수 있다.

관련 디버깅

NodeList - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/NodeList
HTMLCollection - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection
Document.getElementsByName() - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/Document/getElementsByName

HTMLCollection - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection

댓글 없음:

댓글 쓰기

크롬 에서 번역 옵션 뜨는 거 막는 방법

버그 같은게 아니고 저 옵션의 기본 값이 제공으로 바뀐듯... 번역 옵션 제공을 비활성화하면 안 뜸. Chrome에서 웹페이지 번역 모르는 언어로 작성된 페이지를 방문할 때 다음 단계에 따라 Chrome이 페이지를 번역하도록 할 수 있습...