2014-10-09 3 views
1

전역 변수 var linkArray=[]을 선언했지만 phantomJS 함수 내부에서 선택되지 않았습니다. 오류 메시지는 phantom stdout: ReferenceError: Can't find variable: linkArray입니다. 이것을 어떻게 찾을 수 있습니까? window.linkArray으로 선언했지만, 헤드리스 응용 프로그램이므로 다른 오류 (ReferenceError: window is not defined)가 발생합니다.전역 적으로 정의 된 변수를 찾을 수 없음

따라서 저는 var linkArray=[]을 전역으로 만드는 방법이 필요합니다.

var phantom = require('phantom'); 

var linkArray=[]; 

phantom.create(function (ph) { 
    ph.createPage(function (page) { 
     var main_file="file:///C:/whatever/index.html"; 
     page.open(main_file, function (status) { 
      console.log("opened " + main_file +"\n",status+"\n"); 
      page.evaluate(function() { 
       for (var i=0; i < document.getElementsByTagName('a').length; i++) { 
        linkArray.push(document.getElementsByTagName('a')[i].href) 
       } 
       return linkArray; 
      } 
      , function (result) { 
       console.log(result) 
       ph.exit(); 
      }); 

     }); 
    }); 
}, { 
    dnodeOpts: { 
     weak: false 
    }   
}); 
+0

을 반환해야한다, 그래서 나는'phantom'를 설치하는'npm'를 사용 'var phantom = require ('phantom');을 선언하십시오. – maudulus

+0

또한 https://github.com/alexscheelmeyer/node-phantom 등이 있습니다. 나는 그들 모두가 같은 대답을하게된다는 것을 안다. –

답변

2

PhantomJS는 페이지 컨텍스트와 외부 컨텍스트를 가지고 있습니다. 페이지 컨텍스트는 샌드 박싱되어 있으므로 명시 적으로 변수를 전달해야합니다. 그것은 가치에 의해 전달됩니다. docs 말 :

웹 페이지의 컨텍스트에서 주어진 기능을 평가합니다. 실행은 샌드 박스 처리되고 웹 페이지는 팬텀 개체에 액세스 할 수 없으며 자체 설정을 조사 할 수 없습니다.

또한 참고에 유의하십시오.

참고 : 평가 함수의 인수와 반환 값은 단순한 기본 개체 여야합니다. 경험 법칙 : JSON을 통해 직렬화 할 수 있다면 괜찮습니다.

클로저, 함수, DOM 노드 등이 작동하지 않습니다! 이 문제를 해결하려면

는 외부 변수는 페이지 문맥 (evaluate)에 전달 나는 노드를 사용하고

page.evaluate(function(linkArray) { 
    // page context, linkArray is a local variable now 
    for (var i=0; i < document.getElementsByTagName('a').length; i++) { 
     linkArray.push(document.getElementsByTagName('a')[i].href) 
    } 
    return linkArray; 
}, function finished(result) { 
    // outer context 
    console.log(result) 
    linkArray = result; 
    ph.exit(); 
}, linkArray); // pass values for the page context as last parameters 
+0

흠, linkArray를 다시 인식하고 있습니다 만, 어떤 이유로 마지막 행 ('}, linkArray);) 뒤에'console.log (linkArray)'를 실행하면 빈 배열을 반환합니다.) – maudulus

+1

비동기이며 파열했기 때문입니다 ('finished' 함수 내부에있는) 제어 흐름에서 벗어납니다. –

+0

굉장! 도와 줘서 고맙습니다. – maudulus

관련 문제