最近我一直在学习JS并尝试与网页进行交互,首先进行抓取,但现在也在特定网页上进行交互。例如,我有一个包含按钮的网页,我想大约每30秒按此按钮然后刷新(并且倒计时再次开始)。我写了以下脚本来做到这一点:
var klikCount = 0;
function getPlayElement() {
var playElement = document.querySelector('.button_red');
return playElement;
}
function doKlik() {
var playElement = getPlayElement();
klikCount++;
console.log('Watched ' + klikCount);
playElement.click();
setTimeout(doKlik, 30000);
}
doKlik()
但现在我需要加强我的游戏,每次单击按钮时都会弹出一个新窗口,我也需要在那里执行操作,然后关闭它并返回“主”脚本。这可能通过JS吗?请记住,我是一个完整的javascript noob,并没有意识到很多基本功能。
谢谢,Alex
DOM事件有一个isTrusted
属性,只有当事件由用户生成时才是true
,而不是像el.click()
情况那样综合地生成。
弹出窗口是众多Web机制中的一种,只有在用户执行了单击或类似操作时才有效,而不是代码本身。
赋予页面打开无限量弹出窗口的能力从来都不是一个好主意,因此很久以前他们以多种方式杀死了该功能。
您可以在自己的标签/窗口中创建iframe并通过postMessage在这些框架内执行操作,但我不确定这对您来说是否足够好。
无论如何,如果从用户生成点击,该代码将起作用,如下所示:
document.body.addEventListener(
'click',
event => {
const outer = open(
'about:blank',
'blanka',
'menubar=no,location=yes,resizable=no,scrollbars=no,status=yes'
);
outer.document.open();
outer.document.write('This is a pretty big popup!');
// post a message to the opener (aka current window)
outer.document.write(
'<script>opener.postMessage("O hi Mark!", "*");</script>'
);
// set a timer to close the popup
outer.document.write(
'<script>setTimeout(close, 1000)</script>'
);
outer.document.close();
// you could also outer.close()
// instead of waiting the timeout
}
);
// will receive the message and log
// "O hi Mark!"
addEventListener('message', event => {
console.log(event.data);
});
每个弹出窗口都有一个开启器,每个不同的窗口都可以通过postMessage
进行通信。