【问题标题】:JQuery not getting included in PhantomJsJQuery 未包含在 PhantomJs 中
【发布时间】:2017-09-29 17:16:34
【问题描述】:

我正在尝试将 jquery 与 phantomjs 一起使用。我尝试了一个独立的示例,它运行良好。这是我所做的:

  var page = require('webpage').create();
  page.open("http://www.phantomjs.org", function(status) {

    page.onConsoleMessage = function(msg) {
      console.log("message recvd: " + msg);
    };

    var result;

    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js", function() {
      console.log("loading jquery");
    });

    setTimeout(function() {
      page.evaluate(function() {
        console.log("$(\"title\").text() -> " + $("title").text());
      });
    }, 1000);
 }

这是我得到的输出:

loading jquery
message recvd: $("title").text() -> PhantomJS | PhantomJS

在上面的代码 sn-p 中,我在评估函数上使用了 setTimeout(),因为 includeJs() 会异步执行并且需要一些时间来加载 jquery。如果我不使用 setTimeout() 或使用较小的超时值,则不起作用。

但是,当我在我的应用程序中尝试相同的代码时,它不起作用。这是我所拥有的:

var baseSetup = function(guid, page, config, request, response) {
  /* enable the console output inside the callback functions */
  page.onConsoleMessage = function (msg) {
    console.log(guid + ": console msg: " + msg);
  };

  /* used for ignoring potential alert messages when evaluating js code */
  page.onAlert = function (msg) {
    console.log(guid + " (alert): alert msg: " + msg);
  };

  /* suppress the error messages */
  page.onError = function(msg, trace) {
    var msgStack = ['ERROR: ' + msg];
    if (trace && trace.length) {
      msgStack.push('TRACE:');
      trace.forEach(function(t) {
        msgStack.push(' -> ' +
        t.file +
        ': ' +
        t.line +
        (t.function ? ' (in function "' + t.function + '")' : ''));
      });
    }
    console.error(guid + ": " + msgStack.join('\n'));
  };
}

module.exports = function extractionDriver(responseFromUrl, responseToUser, page, request) {
  console.log(page.customHeaders['guid'] + ": extractionDriver, status = " + responseFromUrl.status);

  if(page.isLocalFile || responseFromUrl.status !== 0)
  {
    var viewportStr = page.customHeaders['viewportStr'];
    console.log(page.customHeaders['guid'] + ": Setting viewport size: " + viewportStr);
    var viewportObj = parseViewport(viewportStr);
    page.viewport = viewportObj;

    page.evaluate(function(w,h) {
      document.body.style.width = w + "px";
      document.body.style.height = h + "px";
    }, viewportObj.width, viewportObj.height);

    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js", function() {
      console.log("loading jquery");
    });

    setTimeout(function() {
      page.evaluate(function() {
        console.log("$(\"title\").text() -> " + $("title").text());
      });
    }, 1000);
  }

这是我在运行应用程序时看到的:

    d8db6045-a0e8-11e4-a619-6949593d958d: ERROR: ReferenceError: Can't find variable: $
TRACE:
-> phantomjs://webpage.evaluate(): 3
-> phantomjs://webpage.evaluate(): 4
-> phantomjs://webpage.evaluate(): 4

永远不会打印日志行“正在加载 jquery”,并且永远不会加载 jquery。

我尝试在 includeJs() 的回调中封装 evaluate() 函数,但这也不起作用(没有打印控制台日志)。

这里可能出了什么问题?如果我应该提供更多信息,请告诉我。

【问题讨论】:

    标签: javascript jquery phantomjs


    【解决方案1】:

    这就是为什么page.includeJs有一个回调,所以你可以把依赖jQuery的代码放在那里。当引用的 JavaScript 已经加载时调用回调。欢迎来到回调地狱之路上的另一个关卡。

    我经历过一次,但由于某种原因这不起作用。解决方法是在includeJs 回调中设置一个全局变量,并使用waitFor 等待在includeJs 回调之外设置全局变量。

    var _loadIndicator = false;
    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js", function() {
      _loadIndicator = true;
    });
    
    waitFor(function check() {
      return _loadIndicator;
    }, function onReady() {
      page.evaluate(function() {
        console.log("$(\"title\").text() -> " + $("title").text());
      });
    }, 10000);
    

    【讨论】:

    • 这是如果您想远程获取它...如果它已经在您的服务器上并且您只想包含 jquery .min 文件...您将使用 injectJs...但是它仍然不适合我
    • @Carine 我不知道您所说的“服务器”是什么意思,但 page.injectJs 仅在文件可通过文件路径访问时才可用。如果不是,那么它必须可以通过 URI 访问,在这种情况下必须使用 page.includeJs
    • 是的,我知道.. 但即使我有 page.injectJs('jquery.min.js'),我仍然收到错误“找不到变量:$”
    • @Carine 不知道。你可以问一个问题。也许有人有时间回答。
    【解决方案2】:

    我只是遇到了麻烦,但我的错误是,我尝试了phantom.injectJs,而不是page.injectJs(混蛋)。然后,如果statussuccess,把

    page.injectJs('lib/jquery.min.js');
    

    试试看

    page.evaluate(function(){
        console.log($("body").length);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 2016-05-22
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多