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

时间:2018-09-19 23:03:16

标签: javascript userscripts tampermonkey

我正在尝试在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 个答案:

答案 0 :(得分:2)

您可以使用GM_getTab()GM_saveTab()Here's the doc page for both)在Tampermonkey中进行此操作。

这些功能设置和检索仅在给定选项卡中持久存在的数据,而不考虑页面加载或域更改。

这是一个可以正常运行的脚本(只需调整其运行的页面)即可演示该技术:

// ==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.");
}