PhantomJS 2:检测到未触发事件的点击
PhantomJS 2: Detecting click that did not trigger an event
我正在使用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);
}
在这里,我将关闭loading
变量,该变量充当事件处理程序和setTimeout
函数之间的"通信通道"。
如果单击触发页面加载,
onLoadFinished
处理程序将在加载页面后调用回调。如果点击没有触发页面加载,
setTimeout
中的函数将在 100 毫秒后调用回调(这是可以接受的)。
这段代码在PhantomJS 1下运行良好。
不幸的是,在 PhantomJS 2 下,onLoadStarted
和onLoadFinished
的事件处理程序无法再访问 loading
变量(即它们不再像看起来那样用作闭包)。
所以现在我想知道如何在 PhantomJS 2 中实现相同的行为。有什么想法吗?
PS:我知道我必须在PhantomJS 2中通过page.property(...)
安装事件处理程序,而不是像PhantomJS 1那样使用page.set(...)
。
编辑:我正在使用节点包phantom(https://www.npmjs.com/package/phantom)作为node和phantomjs之间的桥梁。
对我来说,解决方案实际上是放弃节点桥,而是使用纯 phantomjs。这会导致以下相应的代码像超级按钮一样工作,即使使用 PhantomJS 2 也是如此:
function click(page, elem, callback) {
var loading = false;
page.onLoadStarted = function() {
loading = true;
};
page.onLoadFinished = function() {
callback('click triggered page load');
};
triggerClick(page, elem);
setTimeout(function() {
if ( ! loading) {
callback('click did not trigger page load');
}
}, 100);
}
- 如何检测滚动事件是否像在触摸设备上一样只触发一次
- 检测演示者工具的事件,类似于onmousedown
- 检测window.opener窗口刷新事件
- 检测“;animationend”;链接动画集的事件
- 在离子2中,有任何方法可以将涡旋动量作为一个事件来检测
- 如何识别“;输入“;没有浏览器检测的事件
- 当pswp库关闭时,Photoswipe.js检测到事件
- 如何使用javascript检测不可滚动元素中的滚动事件和方向
- 在onkeyup事件中未检测到文本区域更改
- 检测打印(非打印预览)事件
- 在聊天窗口中检测链接单击事件
- 检测单击子节点并发送槽事件处理程序
- 鼠标滚轮事件检测目前在 Firefox 中不起作用
- 使用 JQuery 事件检测特定的 CSS 关键帧动画
- Paper.js:hitTest通过鼠标事件检测被阻挡的项目
- jQuery / Javascript事件检测页面更改取消
- Cordova滑动事件检测选项为Android, iOS和Windows平板电脑
- 关闭日期拾取器的Angular事件检测
- 函数表达式/事件检测在 ie<=9 或 Safari 中不起作用
- 通过鼠标事件检测移动设备