Javascript 是否有一种方法可以从页面上下文侦听幻象上下文中的事件?

Javascript 是否有一种方法可以从页面上下文侦听幻象上下文中的事件?,javascript,events,phantomjs,hook,webpage,Javascript,Events,Phantomjs,Hook,Webpage,例如:我用PhantomJS打开一个页面,评估一个异步脚本(例如ajax)。当它成功时,我想让幻影上下文(在page.evaluate()之外)知道异步过程已经完成 我不想使用setTimeout和setInteval在幻象上下文中等待并不断检查进程是否已完成。这正是该过程的目的 因此,如果在页面上下文中有一个异步调用(如AJAX请求),则可以执行以下操作: page.onCallback = function(data){ console.log("finished: " + data

例如:我用PhantomJS打开一个页面,评估一个异步脚本(例如ajax)。当它成功时,我想让幻影上下文(在
page.evaluate()
之外)知道异步过程已经完成

我不想使用
setTimeout
setInteval
在幻象上下文中等待并不断检查进程是否已完成。

这正是该过程的目的

因此,如果在页面上下文中有一个异步调用(如AJAX请求),则可以执行以下操作:

page.onCallback = function(data){
    console.log("finished: " + data.text);
    phantom.exit();
};
page.evaluate(function(){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "/");
    xhr.onreadystatechange = function () {
        var DONE = this.DONE || 4;
        if (this.readyState === DONE){
            window.callPhantom({text: this.responseText});
        }
    };
    xhr.send();
});
另一种方法是将调用添加到生产JavaScript中,以简化测试。如果您正在编写web应用程序,有时很难找到一个选择器来指示页面何时完全加载。为了使测试此类应用程序更容易,您可以在JavaScript页面中使用如下内容:

finishOffPage(function callback(){
    if (typeof window.callPhantom === "function") {
        window.callPhantom({type: "loadFinished"});
    }
});
然后您可以编写如下测试:

page.onCallback = function(data){
    if (data.type === "loadFinished") {
        // do some testing
    }
};
page.open(url);

这是一个可以动态添加此类内容的示例:

我正在使用Node.js和phantom来制作我的应用程序。假设有两个来自用户的并发请求。每个请求运行上述代码一次。第一个请求的page.onCallback是否有可能从第二个请求的window.callPhantom()接收数据?@MrCold不太可能,因为即使使用相同的PhantomJS实例,也不会对两个请求使用相同的
page
实例。即使使用相同的
页面
实例,也不可能这样做,因为无法为同一事件注册两个事件处理程序。您可能需要一些中间件将结果路由到适当的响应对象。@ArtjomB。在您的示例中,
if(typeof window.callPhantom==“Function”){
假设为
if(typeof window.callPhantom==“Function”){
,所以小写为“Function”。@Grigory您完全正确。我想知道为什么没有人注意到这一点。