2016-06-09 5 views
1

저는 javascript를 배우고 DOM 통과를 연습합니다. 'nodeName'을 기반으로 부모 요소의 배열을 반환하는 메서드를 만들었습니다. 나는 등배열의 모든 요소에 액세스

Element.prototype.specificParent = function(nodeName1) { 
    nodeName1 = nodeName1.toUpperCase(); 
    var x = this; 
    var matches = []; 
    var allParents = []; 

    while(x.parentNode !== null) { 
     allParents.push(x.parentNode); 
     x = x.parentNode; 
    } 

    for(i = 0; i < allParents.length; i++) { 
     if(allParents[i].nodeName === nodeName1) { 
      matches.push(allParents[i]); 
     } 
    } 

    return matches; 

} 

이 특정 요소의 모든 (즉, 다른의 부모)을 선택하고 스타일을하거나 변경할 수 있도록 내가 가지, 내 원하는 효과를 가지고, 이런 짓을했는지.

:

var parents = document.getElementById("startHere").specificParent("div"); //gets all parent div elements and returns the array 

//I can then style them individually: 
parents[0].style.background = "black"; 
parents[1].style.background = "black"; 
//etc, etc, etc 

//or I could use a for loop to style them all: 
for(i = 0; i < parents.length; i++) { 
    parents[i].style.background = "black"; 
} 

는 내가하고 싶은 것은 이것이다 : 만 같은 요소에 액세스 할 수 있기 때문에, 반환 된 배열의 모든 요소에 액세스하기 위해, for 루프 같은 것을 사용해야합니다

var parents = document.getElementById("startHere").specificParent("div"); 
parents.style.background = "black"; //changing all the elements in the array 

허용하는 "specificParent"메서드를 변경할 수있는 방법이 있습니까?

이것은 무의미한 운동처럼 보일 수 있지만 나는 배우고 있습니다!

감사

+0

아니요, 방법을 사용해야합니다. – epascarello

+0

의견을 보내 주셔서 감사합니다. 그게 대답이라고 생각했는데 내가 말했듯이, 나는 단지 배우기 만하고, 나는 방법을 사용해야 만한다는 것을 무엇을 의미합니까? 즉, 나는 Method?!?!를 사용하고 있다고 생각했다. – Mike

+0

'parents.forEach (parent => parent.style.background = "black")'[array.forEach의 문서] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/) Global_Objects/Array/forEach) –

답변

1

은 아마도 가장 간단한 방법은 arrays API을 사용하는 것입니다. 당신이 ES6를 사용할 수있는 경우
, 그렇게 같을 것이다

parents.forEach(parent => parent.style.background = "black") 

ES5에서 약간 덜 명확 :

Element.prototype.specificParent = function(nodeName1) { 
    nodeName1 = nodeName1.toUpperCase(); 
    var x = this; 
    var matches = []; 
    var allParents = []; 

    while(x.parentNode !== null) { 
     allParents.push(x.parentNode); 
     x = x.parentNode; 
    } 

    for(i = 0; i < allParents.length; i++) { 
     if(allParents[i].nodeName === nodeName1) { 
      matches.push(allParents[i]); 
     } 
    } 

    function setStyle(styleKey, styleValue) { 
     matches.forEach(function(parent) { parent.style[styleKey]= styleValue; }); 
    } 

    return { 
     elements : matches, 
     setStyle : setStyle 
    }; 
} 
:이 작업을 수행 할 수 있습니다 귀하의 의견에

parents.forEach(function(parent) { parent.style.background = "black"; }) 

을 바탕으로

다음과 같이 사용하십시오.

var parents = document.getElementById("startHere").specificParent("div"); 
parents.setStyle("background", "black"); 
+0

답장을 보내 주셔서 감사합니다. 나는 내가 달성하려고 애쓰던 것이 처음 생각했던 것보다 훨씬 복잡하고 현재의 능력을 훨씬 뛰어 넘는 것이라고 생각한다. 이 답변을 주셔서 감사하지만 일단 함수가 배열을 반환하면 요소에 액세스하는 방법을 변경하는 대신 함수를 변경하려고합니다. 그 말이 맞는다면?! – Mike

+0

나는 당신이 무슨 뜻인지 안다. 기본적으로 요소 배열이있는 경우 변경하려는 모든 요소를 ​​반복해야합니다.Wether를 for 루프 (예를 들어)로 사용하거나 배열 API (예 : 내 대답)는 개인적인 취향에 따라 다르지만 하나 또는 여러 개를 수행해야합니다. 백그라운드에서 JQuery 나 다른 라이브러리를 사용할 수는 있지만, 백그라운드에서 배열을 반복합니다 ... –

+0

맞아, 그게 내가 얻으려고했던거야. 이 함수 내에서 반환 된 요소가 스타일이 될 수있는 요소가되도록 요소를 반복 할 수 있기를 원했습니다. 따라서 반복적으로 간단한 한 줄 함수를 사용할 수 있으며 대신 나를 위해 열심히 노력할 것입니다. 여러 요소를 함께 스타일링하고 싶을 때마다 루프를 다시 입력해야했기 때문에 (어느 방식 으로든 내가 선택한 방식). 고맙습니다. 어쨌든 (아마도 복잡한 {to me} jQuery에서) 가능하지 않습니다. 귀하의 의견을 보내 주셔서 감사합니다. – Mike

관련 문제