如何使用Tampermonkey重新加载其他选项卡?

时间:2018-08-25 07:14:53

标签: javascript tampermonkey

我想在当前标签页更改时使用Tampermonkey刷新某个标签页。

我是Duolingo的用户,但对他们对Crown系统的新更改不满意,并且我不喜欢他们带有“ Practice”按钮的算法。

因此,我使用网站 duome.eu 选择最弱的一个进行审查。

类似于此页:
https://duome.eu/example/progress

此网站上的信息基于用户在以下方面的进度  duolingo.com。

我单击duome页面上的链接以打开duolingo网站以查看技能。
在完成一项技能的复习之后,我希望重新加载duome.eu页面以重新计算我的进度。

我该如何实现?

我也乐于接受其他想法,谢谢:)

1 个答案:

答案 0 :(得分:4)

您可以通过以下方式实现:

  1. 将您的Tampermonkey脚本设置为在两个域上运行
  2. 使用GM_setValue()DocGM_addValueChangeListener()Doc以及可选的GM_getValue()Doc在脚本实例之间进行通信

例如,说您想监视this random question,并在每次单击投票按钮或喜欢的明星时重新加载its timeline page

可以正常运行的Tampermonkey脚本可以做到:

// ==UserScript==
// @name     _Cross tab, cross domain script communication
// @match    *://stackoverflow.com/questions/521295/*
// @match    *://stackoverflow.com/posts/521295/timeline
// @require  https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant    GM_setValue
// @grant    GM_addValueChangeListener
// ==/UserScript==

const xmssionKey = "Last vote-button click event";

//-- Are we on the "interactive" page/site/domain or the "monitoring" one?
if (location.pathname.includes ("questions") ) {
    //-- On the "interactive page/tab...
    //-- Hook into the page's vote and favorite buttons:
    $(".inner-content").on ("click", ".vote a", zEvent => {
        var tmStamp   = new Date ().getTime ();
        var ctMessage = `Button ${zEvent.target.className} clicked - ${tmStamp}`;
        console.log (ctMessage);

        //-- Send message to monitoring tab.
        GM_setValue (xmssionKey, ctMessage);
    } );
}
else {
    //-- On the "monitoring" page/tab...
    //-- Listen for new message:
    GM_addValueChangeListener (
        xmssionKey, (keyName, oldValue, newValue, bRmtTrggrd) => {
            console.log (`Received new event: ${newValue}`);
            //-- User feedback, esp useful with time delay:
            document.title = "Reloading...";
            /*-- Important:
                May need to wait 1 to 300 seconds to allow for
                web-app / database / API delays and/or caching.
                1222 == 1.2 seconds
            */
            setTimeout ( () => {location.reload(); }, 1222);
    } );
}
  1. 安装脚本。
  2. 打开the timeline page
  3. 打开the question page
  4. 单击投票按钮之一或最喜欢的星星。
  5. 您将看到时间轴页面自动重新加载。

请注意,对于此特定示例,两个页面都位于同一个域中(仅是为了使每个人都更容易运行演示脚本),但是代码/策略对于跨域页面也同样有效。