我正在尝试创建一个Tampermonkey脚本,每隔一段时间点击页面的“刷新”按钮,最好每分钟一次。
如果你在网站上执行其他操作时可能会暂停,例如打字,那就更好了。
原因是我们正在使用一个工作网站,需要我们及时跟踪传入的客户请求,但该网站只有一个集成的刷新按钮,需要手动点击并且不会自动刷新。
有些浏览器插件可以满足我的需求,但是它们会刷新整个网页,导致它丢失之前已经完成的重要信息或设置。 (网站上的刷新按钮不会发生这种情况。)
所以我发现的是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>
我会非常感谢任何帮助我能得到。
答案 0 :(得分:1)
开始和停止轮询,或间隔点击等;仅仅:
setInterval()
来电的值
EG:var myTimer = setInterval (someFunction, 1000);
clearInterval()
以停止循环。clearInterval (myTimer);
当然,用户界面是最难的部分。我喜欢:
以下用户文件执行以上所有操作,并加上:
以下是完整的工作用户说明(它只是******
块上方的部分。)。
要查看它的实际效果,请运行代码段。
// ==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*\(.+\)/, "") );
} );
&#13;
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; }
&#13;
<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>
&#13;