웹 프론트엔드 JS 튜토리얼 javascript_javascript 팁에서 NodeList를 배열 배열로 처리하는 방법

javascript_javascript 팁에서 NodeList를 배열 배열로 처리하는 방법

May 16, 2016 pm 06:23 PM
array 정렬

예:

코드 복사 코드는 다음과 같습니다.

var 앵커 = document.getElementsByTagName ("a" );
for (i = 0; i < anchors.length; i ) {
var ele=anchors[i];//특정 요소 가져오기
//여기에 일부 코드
}

위 코드는 문서의 모든 링크 요소를 가져온 다음 순회하여 작업을 수행한다는 의미입니다.
이 방법을 통해 얻은 DOM 요소 그룹이 배열이 아닌가?라고 물으실 수도 있습니다. 길이 속성을 직접 얻을 수 있고, 인덱스에 따라 해당 개별 요소를 얻을 수도 있습니다. 다니엘의 유명한 오리 이론에 따르면 오리처럼 걷고(길이 속성이 있음) 오리처럼 꽥꽥거립니다. 인덱스 값으로), 오리입니다. 결론은 자명하죠?
이미 자바스크립트에 대해 좀 더 깊이 이해했다면, 값을 얻기 위해 인덱싱할 수 있는 길이 속성이 있습니다. 인수가 이를 수행할 수 있는 것 같죠? 배열? 실제 개발에서는 일반 배열로 운용하지만, 길이와 for 루프는 사용하기 매우 쉽고 오류도 발생하지 않습니다.
그런데 실제로는 배열(Array)이 아니라 NodeList입니다. NodeList는 배열이 아닙니다.
정말 놀랐죠?

1. NodeList가 배열이 아닌 이유는 무엇인가요?

NodeList가 배열인지 확인하세요. 아마도 가장 직접적인 방법은 Array의 독점 푸시 및 팝 방법을 사용해 보는 것입니다.
코드 복사 코드는 다음과 같습니다.

var 앵커 = document.getElementsByTagName("a");
var newEle = document.createElement("a");//Create a 새로운 요소
anchors.push(newEle);//push
var element=ankors.pop();//pop

위 코드가 맞는지 여부는 직접 테스트할 수 있습니다. push 또는 pop 방식인 경우 예외 없이 push 또는 pop 방식이 없다는 메시지가 표시됩니다. 아직도 질문이 있으신가요? 이게 끝인가요? 이런 일방적인 테스트로 인해 Louzhu는 가만히 앉아 긴장을 풀 수 없게 되었습니다. 인수가 배열이 아니라는 것을 증명한 것처럼 동일한 방법을 사용하여 NodeList가 배열이 아님을 증명할 수 있습니다. 아래 코드를 보세요.
코드 복사 코드는 다음과 같습니다.

Array.prototype .testNodeList = "test nodelist"; //배열에 프로토타입 속성 추가
function funcNodeList() {
varlinks = document.getElementsByTagName("a")
alert(links.testNodeList); >}
function test() {
alert(new Array().testNodeList); //노드 목록 테스트
funcNodeList(); //#ff0000 그게 뭐야?
}
test( ); //테스트해 보세요


위의 분석을 통해 NodeList가 배열(Array)이 아님을 확인할 수 있습니다. 그렇다면 컬렉션을 운영하는 습관에 따라 NodeList를 어떻게 운영할까요?

2. NodeList를 Array처럼 운용

NodeList에는 길이가 있기 때문에 for 루프로 인덱싱하여 값을 얻을 수 있지 않나요? ㅎㅎ 가장 직접적인 아이디어는 이렇습니다. g

코드 복사 코드는 다음과 같습니다.
var arr = new Array();
var 앵커 = document.getElementsByTagName("a")
for (var i = 0; i var ele = 앵커s[i ];
arr.push(ele); //arr은 우리가 원하는 배열입니다
}

명확하게 설명하겠습니다. 먼저 배열을 만들고 NodeList를 탐색합니다. , 그리고 각각을 추가합니다. 단일 요소를 배열 변수에 푸시하고 마지막으로 배열 변수에 대해 연산을 수행합니다. 당신의 지능이 모욕당했다고 느끼시나요?
위 내용은 농담이 아닙니다. 다음은 Lou Zhu가 인터넷의 Google에서 찾은 내용이기 때문입니다. 두 줄의 코드로 NodeList를 Array로 변환하여 사용할 수 있습니다.

코드 복사 코드는 다음과 같습니다.
var 앵커 = document.getElementsByTagName("a")
var arr = Array.prototype .slice.call(anchors) ; //IE 이외의 일반 브라우저



그러나 가장 안타까운 일이 일어났습니다. 위의 코드는 사악한 IE에서 제대로 작동하지 않으며 IE는 JScript 개체가 없습니다라는 메시지를 표시합니다.
위의 분석을 무시하고 NodeList를 Array로 변환하여 작업할 필요가 없다고 생각할 수도 있습니다. 실제로 Lou Zhu는 어떤 프로그래밍 언어를 사용하든 유형 변환은 매우 현명하지 못한 행동이라고 개인적으로 믿습니다. 가장 일반적인 것은 C#의 박싱(boxing) 및 언박싱(unboxing), 수치 데이터 변환 등인데, 이는 성능 문제가 있고 주의하지 않으면 광산 사고를 유발할 수 있습니다. 그런데 Lou Zhu는 왜 NodeList를 배열로만 취급합니까? NodeList를 동적으로 변경할 때 NodeList를 직접 조작하면 자신도 모르게 제한 구역에 실수로 들어갈 가능성이 높기 때문입니다. 예는 다음과 같습니다.
(1), html 문서 조각


(2), 자바스크립트 테스트 코드

코드 복사 코드는 다음과 같습니다.

var 앵커 = document.getElementsByTagName("a")
for (i = 0; i < 앵커s.length ; i ) {
var ele= document.createElement("a");
ele.setAttribute("href", "http://www.cnblogs.com/jeffwongishandsome/")
ele .appendChild( document.createTextNode("new link test"));
document.getElementById("divAnchor").appendChild(ele); // div가 새 링크를 추가합니다.
}

in 문서가 로드된 후 위 스크립트를 실행합니다. 우리의 원래 의도는 div 내의 기존 a 요소 뒤에 a 요소를 추가하는 것입니다. 하지만 실행하면 브라우저가 충돌할 수 있습니다. 그렇죠? 여기서 Louzhu는 IE가 직접 멈추고, FF는 스크립트가 사용 중인지, 스크립트 실행을 중지할지 여부를 묻는 메시지를 표시합니다. 중지를 클릭한 후 페이지에 n개의 링크가 생성되었습니다. 실제로 이유를 대담하게 분석할 수 있습니다. for 루프 NodeList(전제: for 루프 내부에 새 요소가 추가되어 노드 목록의 길이가 변경됩니다. Chen Tongxie의 제안에 감사드립니다) 길이는 계속해서 변경되고 증가할 것입니다. , 루프는 계속해서 반복되며 마침내 무한 루프가 됩니다. 다음 코드를 사용하면 예상한 것과 효과가 같습니다.
코드 복사 코드는 다음과 같습니다.

varlinks = document.getElementsByTagName("a");
var 앵커 = null; //Array
try {
anchors = Array.prototype.slice.call(links) ;
}
catch (e) { //
anchors = new Array()
for (var i = 0; i anchors.push (links[i]);
}
}
for (i = 0; i var ele = document.createElement ("a");
ele.setAttribute("href", "http://www.cnblogs.com/jeffwongishandsome/")
ele.appendChild(document.createTextNode("new) 링크 테스트") ; 그다지 어렵지는 않습니다. 물론 가능합니다. 익숙한 코딩 습관을 약간만 수정하면 됩니다.



코드 복사
코드는 다음과 같습니다. var 앵커 = document.getElementsByTagName("a"); var len = 앵커s.length; //변수 정의 for (i = 0; i < len i ) { //로컬 변수 len
var ele = document.createElement("a")
ele.setAttribute("href", "http://www.cnblogs .com/jeffwongishandsome/");
ele.appendChild(document.createTextNode("new link test"));
document.getElementById("divAnchor").appendChild(ele); // div는 새 링크를 추가합니다. 링크
}


이 시점에서 궁금한 점이 있든 없든 읽어주셔서 감사하다는 말씀드리고 싶습니다. 조언을 기대합니다.
작성자: Jeff Wong
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

foreach 루프를 사용하여 PHP 배열에서 중복 요소를 제거하는 방법은 무엇입니까? foreach 루프를 사용하여 PHP 배열에서 중복 요소를 제거하는 방법은 무엇입니까? Apr 27, 2024 am 11:33 AM

PHP 배열에서 중복 요소를 제거하기 위해 foreach 루프를 사용하는 방법은 다음과 같습니다. 배열을 순회하고 요소가 이미 존재하고 현재 위치가 첫 번째 항목이 아닌 경우 삭제합니다. 예를 들어, 데이터베이스 쿼리 결과에 중복된 레코드가 있는 경우 이 방법을 사용하면 이를 제거하고 중복된 레코드가 없는 결과를 얻을 수 있습니다.

PHP 어레이 딥 카피(Array Deep Copy) 기술: 다양한 방법을 사용하여 완벽한 카피 달성 PHP 어레이 딥 카피(Array Deep Copy) 기술: 다양한 방법을 사용하여 완벽한 카피 달성 May 01, 2024 pm 12:30 PM

PHP에서 배열을 깊게 복사하는 방법에는 json_decode 및 json_encode를 사용한 JSON 인코딩 및 디코딩이 포함됩니다. array_map 및 clone을 사용하여 키와 값의 전체 복사본을 만듭니다. 직렬화 및 역직렬화를 위해 직렬화 및 역직렬화를 사용합니다.

PHP 배열 키 값 뒤집기: 다양한 방법의 성능 비교 분석 PHP 배열 키 값 뒤집기: 다양한 방법의 성능 비교 분석 May 03, 2024 pm 09:03 PM

PHP 배열 키 값 뒤집기 방법의 성능 비교는 array_flip() 함수가 대규모 배열(100만 개 이상의 요소)에서 for 루프보다 더 나은 성능을 발휘하고 시간이 덜 걸리는 것을 보여줍니다. 키 값을 수동으로 뒤집는 for 루프 방식은 상대적으로 시간이 오래 걸립니다.

데이터 정렬에 PHP 배열 그룹화 기능 적용 데이터 정렬에 PHP 배열 그룹화 기능 적용 May 04, 2024 pm 01:03 PM

PHP의 array_group_by 함수는 키 또는 클로저 함수를 기반으로 배열의 요소를 그룹화하여 키가 그룹 이름이고 값이 그룹에 속한 요소의 배열인 연관 배열을 반환할 수 있습니다.

PHP 배열 심층 복사 모범 사례: 효율적인 방법 발견 PHP 배열 심층 복사 모범 사례: 효율적인 방법 발견 Apr 30, 2024 pm 03:42 PM

PHP에서 배열 전체 복사를 수행하는 가장 좋은 방법은 json_decode(json_encode($arr))를 사용하여 배열을 JSON 문자열로 변환한 다음 다시 배열로 변환하는 것입니다. unserialize(serialize($arr))를 사용하여 배열을 문자열로 직렬화한 다음 새 배열로 역직렬화합니다. RecursiveIteratorIterator를 사용하여 다차원 배열을 재귀적으로 순회합니다.

PHP 배열 다차원 정렬 연습: 간단한 시나리오부터 복잡한 시나리오까지 PHP 배열 다차원 정렬 연습: 간단한 시나리오부터 복잡한 시나리오까지 Apr 29, 2024 pm 09:12 PM

다차원 배열 정렬은 단일 열 정렬과 중첩 정렬로 나눌 수 있습니다. 단일 열 정렬은 array_multisort() 함수를 사용하여 열별로 정렬할 수 있습니다. 중첩 정렬에는 배열을 순회하고 정렬하는 재귀 함수가 필요합니다. 실제 사례로는 제품명별 정렬, 판매량 및 가격별 복합 정렬 등이 있습니다.

중복 요소를 찾는 데 있어 PHP 배열 그룹화 기능의 역할 중복 요소를 찾는 데 있어 PHP 배열 그룹화 기능의 역할 May 05, 2024 am 09:21 AM

PHP의 array_group() 함수를 사용하면 지정된 키로 배열을 그룹화하여 중복 요소를 찾을 수 있습니다. 이 함수는 다음 단계를 통해 작동합니다. key_callback을 사용하여 그룹화 키를 지정합니다. 선택적으로 value_callback을 사용하여 그룹화 값을 결정합니다. 그룹화된 요소 수를 계산하고 중복 항목을 식별합니다. 따라서 array_group() 함수는 중복된 요소를 찾고 처리하는 데 매우 유용합니다.

PHP에서 배열의 값을 크기별로 정렬하는 방법 PHP에서 배열의 값을 크기별로 정렬하는 방법 Mar 22, 2024 pm 05:24 PM

PHP는 웹 사이트 개발 및 데이터 처리 분야에서 널리 사용되는 일반적으로 사용되는 서버 측 스크립팅 언어입니다. PHP에서는 배열의 값을 크기별로 정렬하는 것이 매우 일반적인 요구 사항입니다. 내장된 정렬 기능을 사용하면 배열을 쉽게 정렬할 수 있습니다. 다음은 PHP를 사용하여 배열의 값을 크기별로 정렬하는 방법을 구체적인 코드 예제와 함께 소개합니다. 1. 배열의 값을 오름차순으로 정렬합니다.

See all articles