包含在phantomjs中的JQuery不起作用

时间:2014-09-09 20:07:54

标签: phantomjs

我的代码是:

var url = 'https://search.yahoo.com/',
page = new WebPage(),

fs = require('fs');

page.settings.userAgent = 'Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail appname/appversion';

page.onConsoleMessage = function (msg) {
    console.log(msg);
};

page.open(url, function(status) {

    if (status !== 'success')
    {
        console.log('Unable to access network');
        phantom.exit();
        return;
    }
    else
    {
        page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", function()
        {
            page.evaluate(function()
            {
                $('#yschsp').val("ask question");
                $(".sbb").click();
            });   

            page.onLoadFinished = function(status) {
                var content = page.content;
                fs.write('1.html', content, 'w');
                console.log($('#link-1').val());
                phantom.exit();
            };
        });
    }
});

JQuery在page.evaluate中运行得很完美,但在page.onLoadFinished中不起作用。我收到错误

  

无法变量:$

这意味着在函数page.onLoadFinished中jquery不起作用。但我不明白为什么?

1 个答案:

答案 0 :(得分:1)

由于jQuery被加载到页面上下文中,因此只能在那里使用。与页面上下文接口的唯一函数是evaluate(和其他evaluate函数)。

所以这一行

console.log($('#link-1').val());

必须在evaluate回调中。由于您有一个page.onConsoleMessage事件处理程序,您将从页面上下文中收到控制台消息。

另一件事是在页面加载后添加page.onLoadFinished事件处理程序没有做任何有用的事情。您可以删除代码周围的处理程序,因为在调用page.open回调时页面加载已完成。


如果尚未加载#link-1,则应在静态超时(setTimeout)之后记录该值或使用waitFor