2013-03-08 53 views
11

經過幾個小時的無果搜索,我在這裏發帖。 PhantomJS不允許我在下面的代碼中使用變量,並在運行腳本「無法找到變量」時出現錯誤消息。找不到變量 - PhantomJS

你知道哪裏可以成爲我的問題嗎?

page.open(myurl, function (status) { 

    if (status == 'success') { 

     page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js", function() { 

      elem = page.evaluate(function() { 

       /* Select one element with jQuery */ 
       myElem = $('body'); 
       return myElem; 

      }) 

      var elemHtml = page.evaluate(function() { return $(elem).html(); }); 
      console.log(elemHtml); 

     }) 

     phantom.exit();  

    } 

}) 

感謝=)

+0

「myElem」的定義在哪裏? – 2013-03-08 20:44:17

+0

我已經更新了我的代碼,以顯示myElem的定義:) – Antoine 2013-03-08 21:35:34

回答

19

有信息在Quick Start教程的一個重要部分(在其代碼評價部分):

要在上下文評估的JavaScript或CoffeeScript的代碼的網頁,使用evaluate()函數。執行是「沙盒」,代碼無法訪問任何JavaScript對象和變量在其自己的頁面上下文之外。可以從evaluate()返回一個對象,但它僅限於簡單對象,不能包含函數或閉包。

與您的代碼的問題是這樣雙重的:

  1. 變量elem在網頁環境之外初始化,它不是從第二evaluate到達。
  2. 您返回一個非簡單對象,即DOM元素。

這是一個很容易解決的問題,主要是通過適當設計代碼來適應實際的「監獄」執行模型。請仔細閱讀所有相關文件並探索噸數included examples

+2

不錯的工作!有趣的是,你有唯一的答案,你的姓氏意味着「指導」 – pythonian29033 2016-07-07 13:37:15

+1

我仍然不知道如何實現它。我有一個案例來訪問page.evaluate()中的變量。我想根據傳遞給evaluate()的String來查找DOM元素。你能告訴我/指向我的代碼? – rohit12sh 2017-04-18 20:01:12

+1

「請仔細閱讀所有相關文檔(...)」 - 是吧?例如。 「我不會告訴你......」 – 2017-08-28 13:53:43

相關問題