gpt4 book ai didi

javascript - 幻影 2 : Detecting click that did not trigger an event

转载 作者:数据小太阳 更新时间:2023-10-29 04:52:23 27 4
gpt4 key购买 nike

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

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

  1. 当点击一个元素触发页面加载时,我想等到新页面加载完毕。

  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 中的函数之间的“通信 channel ”。

  1. 如果点击触发页面加载,onLoadFinished 处理程序将在页面加载后调用回调。

  2. 如果点击没有触发页面加载,setTimeout 中的函数将在 100 毫秒后调用回调(这是可以接受的)。

此代码在 PhantomJS 1 下运行良好。

不幸的是,在 PhantomJS 2 下,onLoadStartedonLoadFinished 的事件处理程序无法再访问 loading 变量(即它们不它不再像看起来那样作为闭包工作)。

所以现在我想知道如何在 PhantomJS 2 中实现相同的行为。有什么想法吗?

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

编辑:我使用节点包 phantom ( https://www.npmjs.com/package/phantom ) 作为节点和 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);
}

关于javascript - 幻影 2 : Detecting click that did not trigger an event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35687925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com