用户脚本每分钟单击一个 "Refresh" 按钮,除非有输入?
Userscript to Click a "Refresh" button every minute except when there is input?
我正在尝试创建一个 Tampermonkey 脚本,它会每隔一段时间点击一次页面的 "Refresh" 按钮,最好是每分钟一次。
如果它可以在您在网站上执行其他操作(如打字)时暂停,那就更好了,但这是可选的。
原因是我们在工作中使用了一个网站,需要我们及时跟踪收到的客户请求,但该网站只有一个集成的刷新按钮,需要手动点击而没有自动刷新。
有一些浏览器插件可以满足我的需要,但它们会刷新整个网页,导致它丢失重要信息或之前完成的设置。 (网站上的刷新按钮不会发生这种情况)。
所以我发现的是 setInterval 和 .click 函数。
我设置的是以下内容,有时有效,有时无效。
但是每次它确实起作用时,即使禁用 Tampermonkey 也不会停止。
// ==UserScript==
// @name Ticket System - Auto Refresh
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://my*******.***.****mand.com/*
// @grant none
// ==/UserScript==
setInterval(function () {document.getElementById("buttonOcLMZKwM8KoKda967hf2B0_11").click();}, 10000);
//end
我上面所做的可能有一些重大缺陷,但正如我所说,我没有使用 javascript 的经验。此外,使用的时间是为了快速查看它是否有效而进行测试。
正如您可能看到的那样,我已经卡在了刷新部分,所以打字时的停止部分甚至都没有远程完成。
我也用过
document.getElementById("buttonOcLMZKwM8KoKda967hf2B0_11")
目标很可能会失败,因为网站往往会在您再次登录时更改此 ID。所以我试图通过使用来做到这一点:
document.querySelector('[title="Refresh"]');
但这似乎根本不起作用,即使按钮的标题是刷新。
这是网站上的完整按钮 HTML:
<button type="button" id="buttonOcLMZKwM8KoKda967hf2B0_11" data-sap-ui="buttonOcLMZKwM8KoKda967hf2B0_11"
data-sap-automation-id="OcLMZKwM8KoKda967hf2B0" title="Refresh" role="button"
aria-disabled="false" tabindex="0" class="sapUiBtn sapUiBtnIconOnly sapUiBtnLite sapUiBtnS width-button-form sapUiBtnStd">
<img id="buttonOcLMZKwM8KoKda967hf2B0_11-img" src="https://.........TbRefresh.png"
alt="Refresh" class="sapUiBtnIco"></button>
我会非常感谢我能得到的任何帮助。
开始和停止轮询,或间隔点击等;仅仅是:
- 存储
setInterval()
调用的值。
例如:var myTimer = setInterval (someFunction, 1000);
- 将该值传递给
clearInterval()
以停止循环。
例如:clearInterval (myTimer);
当然,用户界面是最难的部分。我喜欢:
- 在屏幕的右上角放置一个状态和控制按钮。
- 绑定键盘快捷键,无需鼠标即可切换循环。
以下用户脚本执行上述所有操作,外加:
- 在循环的每次迭代中单击 "Refresh" 按钮。
- Stops/Restarts点击控制按钮时的循环
- Stops/Restarts 当按下 F9 时(取决于焦点所在的位置)。
- 选择或键入其中一个表单控件时停止循环。
- 单击 "Refresh" 按钮时重新开始循环。
这是一个完整的工作用户脚本(它只是******
块上方的部分。)。
要查看实际效果,运行 代码段。
// ==UserScript==
// @name _Click button regularly, with start/stop controls
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
//--- Initialize the refresh button loop and controls.
var rfrshBtnSel = 'button[title="Refresh"]'; // jQuery selector for the refresh
var rfrshTmr = LoopManager (clickRefreshButton, 1000); // 1000 ms == 1 second.
var loopStBtn = LoopButtonManager (rfrshTmr.toggle);
rfrshTmr.setCallbacks (loopStBtn.start, loopStBtn.stop, loopStBtn.error);
rfrshTmr.start (); // Start looping the refresh btn click.
$(window).keydown (keyboardShortcutHandler);
//--- On use of certain form controls, stop the refresh timer:
$("body").on (
"click keydown focus paste scroll", "input, textarea, select", rfrshTmr.stop
);
//--- On click of the refresh button, (re)start the refresh timer:
$("body").on ("click", rfrshBtnSel, rfrshTmr.start);
function clickRefreshButton () {
var refreshBtn = $(rfrshBtnSel);
if (refreshBtn.length === 1) clickNode (refreshBtn);
else loopStBtn.error ("Refresh button not found!");
}
function keyboardShortcutHandler (zEvent) {
if (zEvent.which == 120) { // On F9, Toggle the Loop state.
rfrshTmr.toggle ();
return false;
}
return true;
}
function clickNode (jNode) {
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
jNode[0].dispatchEvent (clickEvent);
}
function LoopManager (callbackFnc, intrvlMillisec, bAutoStart, ...optParams) {
var _thisInterval = null;
var _startCB = null, _stopCB = null, _errorCB = null;
if (bAutoStart) _start ();
function _start () {
if ( ! _thisInterval) {
_thisInterval = setInterval (callbackFnc, intrvlMillisec, ...optParams);
}
if (_startCB) _startCB ();
}
function _stop () {
clearInterval (_thisInterval);
_thisInterval = null;
if (_stopCB) _stopCB ();
}
function _toggle () {
if (_thisInterval) _stop ();
else _start ();
}
function _setCallbacks (startCB, stopCB, errorCB) {
_startCB = startCB; _stopCB = stopCB; _errorCB = errorCB;
}
return {
start: _start, stop: _stop, setCallbacks: _setCallbacks, toggle: _toggle
};
}
function LoopButtonManager (clickCB) {
var _btnNode = $('#tmStartStopBtn');
if (_btnNode.length === 0) {
_btnNode = $( `
<button id="tmStartStopBtn" type="button" class="tmRefreshRunning">
<span>TBD</span> (F9)
</button>
` ).appendTo ("body");
}
var _spanNode = _btnNode.find ("span");
_btnNode.click (clickCB);
function _start () {
setButtonDisplay ("Running", "tmRefreshRunning");
}
function _stop () {
setButtonDisplay ("Stopped", "tmRefreshStopped");
}
function _error (errMess) {
console.error ("TM: " + errMess);
setButtonDisplay ("See console!", "tmError");
}
function setButtonDisplay (btnText, btnClass) {
_spanNode.text (btnText);
_btnNode.removeClass ();
if (btnClass) _btnNode.addClass (btnClass);
}
return { start: _start, stop: _stop, error: _error };
}
GM_addStyle ( `
#tmStartStopBtn {
position: absolute;
top: 0;
right: 0;
font-size: 18px;
margin: 5px;
opacity: 0.9;
z-index: 1100;
padding: 5px 20px;
color: black;
cursor: pointer;
}
.tmRefreshRunning { background: orange; }
.tmRefreshStopped { background: lime; }
.tmError { background: red; }
` );
/********************************************************************
******* Everything below this block is simulated target page. *******
******* It's NOT part of the userscript. *******
********************************************************************/
$('button[title="Refresh"]').click ( function () {
$(this).attr ("id", 'spelunk' + Math.random () );
$("#StatusNd").text ("Refreshed: " + (new Date() + '').replace (/\s*\(.+\)/, "") );
} );
div {
margin: 0 0 1ex 1em;
width: 20em;
padding: 0.5ex 1em 0 1em;
border: 1px solid darkgreen;
border-radius: 1ex;
}
label { margin: 0 0 0 2em; }
label[for="Bar"] { display: inline-block; vertical-align: top; }
button, #StatusNd { margin: 0 0 1ex 2em; }
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://greasyfork.org/scripts/44560-gm-addstyle-shim/code/GM_addStyle_shim.js"></script>
<p>This userscript will click the "Refresh" button every second,<br> unless typing in an input.</p>
<div>Some inputs:<br>
<label>Foo: <input type="text" id="Foo"></label><br><br>
<!-- <label for="Bar">Bar: </label>
<textarea id="Bar"></textarea> -->
</div>
<button type="button" id="some_random_ID" title="Refresh">Refresh</button>
<p id="StatusNd"></p>
我正在尝试创建一个 Tampermonkey 脚本,它会每隔一段时间点击一次页面的 "Refresh" 按钮,最好是每分钟一次。
如果它可以在您在网站上执行其他操作(如打字)时暂停,那就更好了,但这是可选的。
原因是我们在工作中使用了一个网站,需要我们及时跟踪收到的客户请求,但该网站只有一个集成的刷新按钮,需要手动点击而没有自动刷新。
有一些浏览器插件可以满足我的需要,但它们会刷新整个网页,导致它丢失重要信息或之前完成的设置。 (网站上的刷新按钮不会发生这种情况)。
所以我发现的是 setInterval 和 .click 函数。 我设置的是以下内容,有时有效,有时无效。 但是每次它确实起作用时,即使禁用 Tampermonkey 也不会停止。
// ==UserScript==
// @name Ticket System - Auto Refresh
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://my*******.***.****mand.com/*
// @grant none
// ==/UserScript==
setInterval(function () {document.getElementById("buttonOcLMZKwM8KoKda967hf2B0_11").click();}, 10000);
//end
我上面所做的可能有一些重大缺陷,但正如我所说,我没有使用 javascript 的经验。此外,使用的时间是为了快速查看它是否有效而进行测试。
正如您可能看到的那样,我已经卡在了刷新部分,所以打字时的停止部分甚至都没有远程完成。
我也用过
document.getElementById("buttonOcLMZKwM8KoKda967hf2B0_11")
目标很可能会失败,因为网站往往会在您再次登录时更改此 ID。所以我试图通过使用来做到这一点:
document.querySelector('[title="Refresh"]');
但这似乎根本不起作用,即使按钮的标题是刷新。
这是网站上的完整按钮 HTML:
<button type="button" id="buttonOcLMZKwM8KoKda967hf2B0_11" data-sap-ui="buttonOcLMZKwM8KoKda967hf2B0_11"
data-sap-automation-id="OcLMZKwM8KoKda967hf2B0" title="Refresh" role="button"
aria-disabled="false" tabindex="0" class="sapUiBtn sapUiBtnIconOnly sapUiBtnLite sapUiBtnS width-button-form sapUiBtnStd">
<img id="buttonOcLMZKwM8KoKda967hf2B0_11-img" src="https://.........TbRefresh.png"
alt="Refresh" class="sapUiBtnIco"></button>
我会非常感谢我能得到的任何帮助。
开始和停止轮询,或间隔点击等;仅仅是:
- 存储
setInterval()
调用的值。
例如:var myTimer = setInterval (someFunction, 1000);
- 将该值传递给
clearInterval()
以停止循环。
例如:clearInterval (myTimer);
当然,用户界面是最难的部分。我喜欢:
- 在屏幕的右上角放置一个状态和控制按钮。
- 绑定键盘快捷键,无需鼠标即可切换循环。
以下用户脚本执行上述所有操作,外加:
- 在循环的每次迭代中单击 "Refresh" 按钮。
- Stops/Restarts点击控制按钮时的循环
- Stops/Restarts 当按下 F9 时(取决于焦点所在的位置)。
- 选择或键入其中一个表单控件时停止循环。
- 单击 "Refresh" 按钮时重新开始循环。
这是一个完整的工作用户脚本(它只是******
块上方的部分。)。
要查看实际效果,运行 代码段。
// ==UserScript==
// @name _Click button regularly, with start/stop controls
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
//--- Initialize the refresh button loop and controls.
var rfrshBtnSel = 'button[title="Refresh"]'; // jQuery selector for the refresh
var rfrshTmr = LoopManager (clickRefreshButton, 1000); // 1000 ms == 1 second.
var loopStBtn = LoopButtonManager (rfrshTmr.toggle);
rfrshTmr.setCallbacks (loopStBtn.start, loopStBtn.stop, loopStBtn.error);
rfrshTmr.start (); // Start looping the refresh btn click.
$(window).keydown (keyboardShortcutHandler);
//--- On use of certain form controls, stop the refresh timer:
$("body").on (
"click keydown focus paste scroll", "input, textarea, select", rfrshTmr.stop
);
//--- On click of the refresh button, (re)start the refresh timer:
$("body").on ("click", rfrshBtnSel, rfrshTmr.start);
function clickRefreshButton () {
var refreshBtn = $(rfrshBtnSel);
if (refreshBtn.length === 1) clickNode (refreshBtn);
else loopStBtn.error ("Refresh button not found!");
}
function keyboardShortcutHandler (zEvent) {
if (zEvent.which == 120) { // On F9, Toggle the Loop state.
rfrshTmr.toggle ();
return false;
}
return true;
}
function clickNode (jNode) {
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
jNode[0].dispatchEvent (clickEvent);
}
function LoopManager (callbackFnc, intrvlMillisec, bAutoStart, ...optParams) {
var _thisInterval = null;
var _startCB = null, _stopCB = null, _errorCB = null;
if (bAutoStart) _start ();
function _start () {
if ( ! _thisInterval) {
_thisInterval = setInterval (callbackFnc, intrvlMillisec, ...optParams);
}
if (_startCB) _startCB ();
}
function _stop () {
clearInterval (_thisInterval);
_thisInterval = null;
if (_stopCB) _stopCB ();
}
function _toggle () {
if (_thisInterval) _stop ();
else _start ();
}
function _setCallbacks (startCB, stopCB, errorCB) {
_startCB = startCB; _stopCB = stopCB; _errorCB = errorCB;
}
return {
start: _start, stop: _stop, setCallbacks: _setCallbacks, toggle: _toggle
};
}
function LoopButtonManager (clickCB) {
var _btnNode = $('#tmStartStopBtn');
if (_btnNode.length === 0) {
_btnNode = $( `
<button id="tmStartStopBtn" type="button" class="tmRefreshRunning">
<span>TBD</span> (F9)
</button>
` ).appendTo ("body");
}
var _spanNode = _btnNode.find ("span");
_btnNode.click (clickCB);
function _start () {
setButtonDisplay ("Running", "tmRefreshRunning");
}
function _stop () {
setButtonDisplay ("Stopped", "tmRefreshStopped");
}
function _error (errMess) {
console.error ("TM: " + errMess);
setButtonDisplay ("See console!", "tmError");
}
function setButtonDisplay (btnText, btnClass) {
_spanNode.text (btnText);
_btnNode.removeClass ();
if (btnClass) _btnNode.addClass (btnClass);
}
return { start: _start, stop: _stop, error: _error };
}
GM_addStyle ( `
#tmStartStopBtn {
position: absolute;
top: 0;
right: 0;
font-size: 18px;
margin: 5px;
opacity: 0.9;
z-index: 1100;
padding: 5px 20px;
color: black;
cursor: pointer;
}
.tmRefreshRunning { background: orange; }
.tmRefreshStopped { background: lime; }
.tmError { background: red; }
` );
/********************************************************************
******* Everything below this block is simulated target page. *******
******* It's NOT part of the userscript. *******
********************************************************************/
$('button[title="Refresh"]').click ( function () {
$(this).attr ("id", 'spelunk' + Math.random () );
$("#StatusNd").text ("Refreshed: " + (new Date() + '').replace (/\s*\(.+\)/, "") );
} );
div {
margin: 0 0 1ex 1em;
width: 20em;
padding: 0.5ex 1em 0 1em;
border: 1px solid darkgreen;
border-radius: 1ex;
}
label { margin: 0 0 0 2em; }
label[for="Bar"] { display: inline-block; vertical-align: top; }
button, #StatusNd { margin: 0 0 1ex 2em; }
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://greasyfork.org/scripts/44560-gm-addstyle-shim/code/GM_addStyle_shim.js"></script>
<p>This userscript will click the "Refresh" button every second,<br> unless typing in an input.</p>
<div>Some inputs:<br>
<label>Foo: <input type="text" id="Foo"></label><br><br>
<!-- <label for="Bar">Bar: </label>
<textarea id="Bar"></textarea> -->
</div>
<button type="button" id="some_random_ID" title="Refresh">Refresh</button>
<p id="StatusNd"></p>