2017-08-25 25 views
0

我正在使用phantomjs來執行下面的代碼。 我無法弄清楚這裏有什麼問題。從幻像js得到奇怪的行爲

function process(arg1, arg2) { 

    var webpage = require('webpage').create(); 

    webpage.onConsoleMessage = function(msg) { 
     // something 
    }; 

    webpage.onError = function(msg, trace) { 

     // something 
    }; 

    webpage.open(entityResolvedFilePath, function(status) { 
     if (status !== 'success') { 

      abort(ErrorCode['HTML_LOAD_FAILURE']); 

     } else { 

      injectScriptsToWebpage(webpage); 

      if (inputParams['myExpression']) { 

       var outerWebPagescope=webpage; 
       window.wepPage=webpage; 
       webpage.evaluate(function() { 

        if (hasRequiredNoides(document)) { 
         //do something 
        } 
        else { 

         //outerWebPagescope.onCallback(); this also doesn't works 
         wepPage.onCallback(); 
        } 
       }); 
      } 
      else { 
       webpage.onCallback(); 
      } 
     } 
    }); 

    webpage.onCallback = function() { 

     webpage.evaluate(function(inputParams) { 
      //do something 
     }); 

    }; 
} 

當我打電話內webpage.open它創建一個新的功能範圍,所以我特林通過創建參考outerWebPagescope訪問外部變量webpage.evaluate,但我無法訪問它。 據我瞭解封閉這應該工作。

任何人都可以解釋我這個。 不知何故,我無法通過使用phantomjs來調試回調代碼,該代碼在瀏覽器中從未打過我的調試器。

回答

0

page.evaluate裏面的PhantomJS函數不僅僅是一個閉包,它存在另一個上下文(網頁的)的insode,其中所有的外部變量和函數都不存在,但是網頁的DOM可用。

如果我理解你的意圖,你想要從網頁上下文中與外部上下文進行交互。有兩種方法:

•您可以從page.evaluate中獲得return數據,但它必須是簡單的可序列化對象或數組。

•您可以致電注入網頁spcifically爲一種互動的特殊效用函數window.callPhantom

page.evaluate(function(){ 
    if (typeof window.callPhantom === 'function') { 
     window.callPhantom({ hello: 'world' }); 
    } 
}); 

page.onCallback = function(data) { 
    console.log('CALLBACK: ' + JSON.stringify(data)); 
    // Prints 'CALLBACK: { "hello": "world" }' 
}; 

文檔:http://phantomjs.org/api/webpage/handler/on-callback.html

+0

感謝響應,我總是得到window.callPhantom爲未定義。 –