2014-10-09 126 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

我使用的節點,所以我用'npm'安裝'phantom'然後聲明'var phantom = require('phantom');'。 – maudulus 2014-10-09 14:37:02

+0

還有https://github.com/alexscheelmeyer/node-phantom等等。我看到他們都導致相同的答案。 – 2014-10-09 14:49:24

回答

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

嗯,它是recongnizing linkArray,但由於某種原因返回一個空數組,如果我在最後一行('},linkArray)後面運行'console.log(linkArray)';') – maudulus 2014-10-09 15:12:44

+1

這是因爲它是異步的,超出控制流程(這是'完成'功能的內部)。 – 2014-10-09 15:14:27

+0

太棒了!感謝您的幫助:) – maudulus 2014-10-09 15:16:15