2014-10-01 107 views
1

使用PhantomJS調用page.evaluate()時,是否可以在嵌入式JavaScript文件中引用函數?如何從evaluate()訪問注入的.js文件中的函數?

例如我想調用包含在文件my.js功能someFunctionInMyJs

var page = require('webpage').create(); 
page.injectJs('my.js') 
page.open('http://...', function() { 
    var x = page.evaluate(function() { 
     var y = someFunctionInMyJs(); 
     return y; 
    }); 

    phantom.exit(); 
}); 

這是可能的/有沒有其他辦法?

my.js看起來是這樣的:

function someFunctionInMyJs() { 
    return 'Hi there!'; 
} 

,我得到的錯誤是:

 
ReferenceError: Can't find variable: someFunctionInMyJs 

my.js在於在那裏我調用PhantomJS的文件夾中。

+0

你的例子my.js包含一個語法錯誤。請註冊['onConsoleMessage'](http://phantomjs.org/api/webpage/handler/on-console-message.html)和['onError'](http://phantomjs.org/api/webpage /handler/on-error.html)事件。也許有錯誤。如果沒有錯誤,你可以嘗試顯式地將函數定義爲'window.someFunctionInMyJs = function(){...}'。 – 2014-10-02 07:22:39

+0

@Artjom謝謝:我已經使用http://esprima.org/demo/validate.html修復了JS,但我仍然無法獲得要識別的功能。你能否在答案中粘貼一個「窗口」的例子。下面的用法?我試過http://phantomjs.org/api/webpage/method/inject-js.html這個例子,但也有問題。我確信我在做一些愚蠢的事情。 – davek 2014-10-02 10:00:27

回答

1

問題是,您將腳本注入頁面,該頁面大約:此時爲空,然後打開您的預期頁面。您需要在page.open回調中注入腳本。每次您導航到另一個頁面時,您都必須執行此操作。

​​

您也可以嘗試注入(injectJs)從通過page.onInitialized處理程序腳本,如果你的腳本示例交換的XMLHttpRequest的實現。

如果這仍然不起作用,那麼您的功能可能不是全球性的,在這種情況下,您必須這樣做。編輯my.js來定義你的函數爲

window.someFunctionInMyJs = function() { 
    return 'Hi there!'; 
}; 
+0

謝謝!現在有效,一旦我使用'window'語法。 – davek 2014-10-02 10:37:45

相關問題