javascript – PhantomJS 2:检测未触发事件的点击

我正在使用PhantomJS 2来点击页面的元素.但是,我不知道点击这些元素是否会触发事件(例如页面加载).

我希望能够处理这两种情况:

>当单击元素触发页面加载时,我想等到新页面加载完毕.
>当点击不触发事件时,我希望能够识别(无需等待很长的超时).

在PhantomJS 1中,我可以简单地使用这样的闭包:

function click(page,elem,callback) {
  var loading = false;

  page.set('onLoadStarted',function() {
    loading = true;
  });

  page.set('onLoadFinished',function() {
    callback('click triggered page load');
  });

  triggerClick(page,elem);

  setTimeout(function() {
    if ( ! loading) {
      callback('click did not trigger page load');
    }
  },100);
}

这里我将关闭加载变量,它充当事件处理程序和setTimeout中函数间的“通信通道”.

>如果click触发了页面加载,onLoadFinished处理程序将在加载页面调用回调.
>如果单击不触发页面加载,setTimeout中的函数将在100ms后调用回调(这是可接受的).

代码在PhantomJS 1下运行良好.

不幸的是,在PhantomJS 2下,onLoadStarted和onLoadFinished的事件处理程序不再能够访问加载变量(即它们看起来不再像闭包一样工作).

所以现在我想知道如何在PhantomJS 2中实现相同的行为.任何想法?

PS:我知道我必须通过PhantomJS 2中的page.property(…)安装事件处理程序,而不是像PhantomJS 1那样使用page.set(…).

编辑:我正在使用节点包phantom(https://www.npmjs.com/package/phantom)作为节点和节点之间的桥梁. phantomjs.

解决方法

对我来说,解决方案实际上是放弃节点桥,而是使用纯粹的幻像.这导致以下相应的代码像魅力一样工作,即使使用PhantomJS 2:
function click(page,callback) {
  var loading = false;

  page.onLoadStarted = function() {
    loading = true;
  };

  page.onLoadFinished = function() {
    callback('click triggered page load');
  };

  triggerClick(page,100);
}

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...