2010-06-20 3 views
0

다음은 브라우저 dom 구조를 통해 재귀하는 데 사용되는 기능입니다.Javascript : Eval() 및 객체 길이가 정의되지 않은 문제를 대체하십시오.

  1. 는 평가()
  2. I을 제거해야합니다 : - 아마 간단한 - 내가 (크롬) 작동시킬 수 없었던 것을 그것으로 문제

    (function() { 
        function displaydom (child, parent) { 
         if (parent) {parent = parent+".";}; // if there is no parent then child is the parent 
    
         var jsns = eval(parent+child); // Join parent + child and eval 
    
         for (var i in jsns){ // loop through dom object's attributes 
          if (typeof jsns[i] == "object") { // if attribute is an object then recurse through 
           // display output here 
           displaydom (String(i) /** next child **/, parent+child); 
          }; 
         }; 
        }; 
        displaydom ('self', ''); 
    })(); 
    

    은 몇 가지가 있습니다 for 루프를 for (var i=0, len = jsns.length; i < len; i++) {};으로 변경하고 싶습니다. 속도가 빠르지 만 jsns '0'또는 'undefined'의 길이가 계속 유지됩니다.

피씨 - 브라우저를 충돌시키지 않으려면 코드를 그대로 실행하지 마십시오!

답변

1

를 사용하여 두 번째 질문에 대해서는 square bracket notation

 var jsns = parent[obj] 

...

1.`parent`은 빈 문자열입니다. 이 길이 속성 을 가질 수 없습니다 3. 따라서` "".self`가`이다 4.`undefined`는 속성이 없습니다 undefined`, 그래서 2. 문자열은`self` 속성이 없습니다

... Array (또는 배열과 같은 객체)가 아닌 무언가에 tranditional for 루프를 사용할 수없고 대부분의 객체는 사용할 수 없습니다. 당신이에서 객체의 속성을 반복 할 수 없기 때문에

+0

self = window (즉, dom 구조를 반복합니다.) 이 태그가 iframe에 있기 때문에 자기를 사용합니다. 또한 상위 'if'문은 첫 번째 빈 부모를 보완합니다. – EddyR

0

이가,

var jsns = parent; 
if(parent) { 
    jsns = parent[child]; 
} 

당신은 루프을 변경할 수 없습니다, 다윗이 말한대로 대괄호를 사용하여, 평가를 제거하려면 당신이 제안하는 방법. 개체 속성은 이름으로 만 액세스 할 수 있으며 숫자로 인덱싱되지 않습니다. 이를 수행하는 유일한 방법은 현재 사용중인 for-in 루프입니다.

+0

좋아요, 이해합니다. 그렇다면 부모 호출자의 부모 + 자식이 재귀 호출에서 문자열이라는 것입니다. 문자열을 객체 참조로 변환하려면 어떻게해야합니까? – EddyR

관련 문제