用户脚本每分钟点击一次“刷新”按钮,除非有输入?

时间:2018-04-27 14:02:29

标签: javascript click greasemonkey tampermonkey

我正在尝试创建一个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>

我会非常感谢任何帮助我能得到。

1 个答案:

答案 0 :(得分:1)

开始和停止轮询,或间隔点击等;仅仅:

  1. 存储setInterval()来电的值 EG:var myTimer = setInterval (someFunction, 1000);
  2. 将该值传递给clearInterval()以停止循环。
    EG:clearInterval (myTimer);
  3. 当然,用户界面是最难的部分。我喜欢:

    1. 将状态和控制按钮放在屏幕的右上角。
    2. 绑定键盘快捷键,无需鼠标即可切换循环。
    3. 以下用户文件执行以上所有操作,并加上:

      1. 点击&#34;刷新&#34;循环的每次迭代都按钮。
      2. 单击控制按钮时停止/重新启动循环。
      3. 按下 F9 时停止/重启(取决于焦点所在的位置)。
      4. 选择或输入其中一个表单控件时停止循环。
      5. 当&#34;刷新&#34;重新启动循环。单击按钮。
      6. 以下是完整的工作用户说明(它只是******块上方的部分。)。
        要查看它的实际效果,请运行代码段。

        &#13;
        &#13;
        // ==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;
        &#13;
        &#13;