代码之家  ›  专栏  ›  技术社区  ›  theCrabNebula

如何在选项卡中退出脚本或运行一次用户脚本?

  •  1
  • theCrabNebula  · 技术社区  · 6 年前

    我正在尝试在Tampermonkey中运行一个脚本,并让它在一个选项卡或给定的网页上运行一次,然后再停止。脚本当前会自动单击其中包含给定单词的任何“a”元素链接。HTML代码示例如下:

    <a href="adbc.com">Contact</a>
    

    如果我在脚本中指定了单词“Contact”,脚本将单击该链接。不幸的是,我的脚本在浏览器中的一个页面/选项卡中继续无限地运行,不管它被点击了多少次。我希望它停止-并在一个选项卡中使用一次(即使它转到下一个被单击的链接)。

    我希望这个脚本在单击单个链接后停止,或者只在单个选项卡或单个页面中运行一次。通常这不是问题,因为下一个加载的页面(单击的链接)不会包含带有给定短语的链接。。。但有时会,这将导致页面只是无限地点击链接。我需要一种方法来避免这个问题-只让脚本单击一次或一个链接。这可能包括退出脚本、暂停脚本,或者只是让程序运行一次。

    现在我有以下代码,可以自动单击其中包含短语“Contact”的任何链接:

    // ==UserScript==
    // @name     Music Submissions Contact
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
    // @include  *
    // @grant    GM_addStyle
    // ==/UserScript==
    
    var TargetLink = $("a:contains('Contact')")
    
    if (TargetLink.length)
        window.location.href = TargetLink[0].href
    

    我想让这个脚本在一次单击后停止/退出/关闭/暂停/挂起。我一直找不到正确的语法或逻辑,所以任何建议肯定会有所帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Brock Adams    6 年前

    你可以在这里用 GM_getTab() GM_saveTab() ( Here's the doc page for both ).

    这些函数设置和检索 无论页面加载或域更改如何,仅在给定的选项卡中保持 .

    完全有效的剧本 (只需调整它运行的页面)演示了该技术:

    // ==UserScript==
    // @name     _Data that persists only in tab, cross-domain, cross page loads
    // @match    *://YOUR_SERVER.COM/YOUR_PATH/*
    // @grant    GM_saveTab
    // @grant    GM_getTab
    // ==/UserScript==
    /* eslint-disable no-multi-spaces */
    
    GM_getTab ( thisTabData => {
        console.log ("thisTabData: ", thisTabData);
        if (thisTabData.bornOn) {
            console.info ("Userscript has already run for this tab.");
            return;
        }
        var tmStamp         = (new Date() ).getTime ();
        thisTabData.bornOn  = tmStamp;
        GM_saveTab (thisTabData);
    
        scriptMain ();
    } );
    
    function scriptMain () {
        // PUT THE CODE THAT YOU ONLY WANT TO RUN ONCE PER TAB, HERE.
        console.log ("Script main code ran.");
    }