【问题标题】:Why doesn't Phantom.js evaluate work with my Backbone app?为什么 Phantom.js 不评估我的 Backbone 应用程序的工作情况?
【发布时间】:2026-01-25 21:10:01
【问题描述】:
page.open(My_url, function(status) {
                        page.evaluate(function() { 
                            var html = document.documentElement.outerHTML;
                            return html;
                        }, function(result){
                            res.send(result);
                        });
                    });

我有一个 Backbone 应用程序。 “My_url”指向那个主干页面。

当我运行此代码时,outerHTML 不包括呈现的视图。它只有基本的 css/scripts/container holder。

就像 Backbone 应用程序根本没有运行一样。如何让 evaluate() 返回完全渲染的 Backbone 应用程序(在所有 ajax 调用和其他东西之后)?

毕竟,这就是 Phantom.js 的重点

【问题讨论】:

    标签: javascript html node.js backbone.js phantomjs


    【解决方案1】:

    在页面加载后立即对其进行评估并不总是足够的。有时,由于 JavaScript 在页面上的编写方式,您必须等待并允许页面的 JavaScript 执行。为此,我建议您在执行评估之前尝试添加等待。例如

    function ( status ) {
      if ( status === 'fail' ) {
        phantom.exit( 1 );
        return; // essential, if you don't, below will be executed
      }
    
      window.setTimeout(
        function () {
          var result = page.evaluate(
            function () {
              var html = document.documentElement.outerHTML;
              return html;
            }
          );
          res.send( result );
        },
        1000 // wait 1,000ms (1s)
      );
    }
    

    如果您发现有必要等待,那么您可能想要等待某事。为此,请在 Internet 上查找 waitFor 或类似函数,以允许您的脚本不断轮询,直到出现特定的 DOM 元素。

    【讨论】:

    • 如何使用“waitFor”?它不是 phantomJS 的一部分。我想等待一个元素出现。
    • 你是对的——它不附带 phantomJS。这就是为什么您必须在 Google 上搜索它 - 然后将该功能剪切并粘贴到您自己的代码中。您还必须检查网页的 DOM(例如,使用 Google Chrome 中的网络开发人员工具)以确定您要等待的元素。
    最近更新 更多