일부 사이트에서는 프로토 타입을 사용합니다. DOM의 document.getElementsByClassName()
은 NodeList
을 반환하지만 Prototype의 document.getElementsByClassName()
은 Array
을 반환하지만 NodeList
은 JS 스크립트로 만들 수 없기 때문에 반환합니다.
파이어 폭스에서 당신은 원래의 방법을 얻을 수
var node = document;
Components.lookupMethod(node, 'getElementsByClassName').call(node, /* className */);
를 사용할 수 있습니다. 어쩌면 Google 크롬은 비슷한 점을 구현합니다. 그렇지 않으면 운이 없어집니다. 나는 아무것도 (2 분 인터넷 검색) 찾을 수 없었다. 이 같은 것을 사용할 수 있습니다이 경우
:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
className = className.replace(/([\.\\\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-])/, '\\$1');
var regex = new RegExp('(?:^|[\\n\\r ])' + className + '(?:[\\n\\r ]|$)');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(regex.test(nodeList[ i ].className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
당신은 소름 정규식 사용하지 않는 다음과 같은 기능을 사용할 수 있습니다 node.classList
Google 크롬 구현하는 경우 :
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(nodeList[ i ].classList.contains(className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
이 기능을 지정된 노드 내부의 모든 요소를 반복합니다. Prototype과 같은 Array를 반환하고 동일한 단점을 공유합니다. 배열은 NodeList
과 같이 "라이브"가 아닙니다.
미리 캐시 할 수 있습니다. 또는 네이티브 지원이없는 경우에만 스크립트를 변경하여 지원을 추가 할 수 있습니다 (대다수가이를 수행해야합니다). 그러나 일단 재정의하면 되돌릴 수 없습니다. – davin
@davin 불행히도, 나는 페이지 또는 스크립트를 소유/통제하지 않습니다. – asleepysamurai
내가 말했듯이, 북마크릿을 작성 중이며 페이지에 삽입 된 스크립트가 아닙니다. 그래서 나는 getElementsByClassName을 redine하는 함수를 수정할 수 없다. 그래서 다른 접근 방법을 찾고있다. – asleepysamurai