GM_getTab(cb)如何工作?

时间:2014-09-11 17:10:30

标签: userscripts tampermonkey

似乎没有关于这些功能如何工作的任何信息。我认为这些是Tampermonkey独有的功能?
看起来它们被设计为允许当前运行的Tampermonkey脚本之间的通信;替代连续轮询GM_Value存储以进行更改。这是一个非常有趣的想法。

但我不知道如何使用它们;他们接受了什么价值,以及你得到什么样的对象? 你如何使用这三个功能,我的目的是否正确?

  

GM_getTab(CB)
  只要此选项卡处于打开状态,就获取一个持久的对象。

     

GM_saveTab(制表符)
  保存选项卡对象以在页面卸载后重新打开它。

     

GM_getTabs(CB)
  获取数组中的所有选项卡对象以与其他scrips通信   实例

     

http://forum.tampermonkey.net/viewtopic.php?f=16&t=74

2 个答案:

答案 0 :(得分:4)

我从未尝试过使用它们,但是看一下代码,这些代码似乎是能够从每个标签中存储/获取您想要的任何内容,并且还可以通过所有标签以这种方式存储所有内容。

在两个镀铬控制台上,我运行了以下内容:

var this_tab_data, all_tabs, n;

GM_getTab(function (o) {
    this_tab_data = o;
    n = this_tab_data.rand = Math.random();
    GM_saveTab(this_tab_data);
    console.info(this_tab_data);

    GM_getTabs(function (db) {
        all_tabs = db;
        console.info(n);
        for (var i in all_tabs) {
            if (all_tabs[i].rand === n) console.info("I bet I am the tab named: " + i);
            else console.info("Other tab: " + i + " has value: " + all_tabs[i].rand);
        }
    });
});

结果(在标签2中):

Object {rand: 0.9303610376082361}
VM779:11 0.9303610376082361
VM779:14 Other tab: 366 has value: 0.417106909211725
VM779:13 I bet I am the tab named: 371

我使用此用户脚本在Chrome控制台中添加了访问权限(根据指示的@match页面上的说明):

// ==UserScript==
// @name       My Fancy New Userscript
// @namespace  http://use.i.E.your.homepage/
// @version    0.1
// @description  enter something useful
// @match      http://stackoverflow.com/questions/14059078/use-the-tampermonkey-api-from-the-chrome-console
// @copyright  2012+, You
// ==/UserScript==

unsafeWindow.GM_getTab = GM_getTab;
unsafeWindow.GM_saveTab = GM_saveTab;
unsafeWindow.GM_getTabs = GM_getTabs;

作为旁注,我看到在关闭设置它的选项卡后,GM_getTabs()仍可访问此数据。我不确定我会依靠它,但我可能会尽量减少我留下的东西。

答案 1 :(得分:0)

损失负责人的答案已完成。简而言之,GM_getTab()将“标签对象”的副本传递给cb(现在,它是Tampermonkey的最新文档中的callback),{{1} }将GM_saveTab()对象保存到 real “选项卡对象”中,并且tab将运行当前脚本的所有选项卡传递给GM_getTabs(),作为哈希值。

因此,确定浏览器标签的过程应为:

cb

或使用// Get it GM_getTab(function(tabObj) { // Modify it tabObj.id = genID(); // And store it GM_saveTab(tabObj); })

Promise

(另外)new Promise(r => GM_getTab(r)).then(function(tabObj) { tabObj.id = genID(); GM_saveTab(TabObj); }) GM_getTab()传递给回调的内容是:

GM_getTabs()

(更新)传递给getTab(): {…} ​ + id: "166471588778160035" + <prototype>: Object { … } getTabs(): {…} ​ + 9: Object { id: "166471588778160035" } ​ + 25: Object { id: "599671588779026059" } ​ + 26: Object { id: "154331588779031451" } ​ + 31: Object { id: "622271588779033558" } ​ + 33: Object { id: "542881588779039564" } + 36: Object { id: "112571588779028937" } ​ + 38: Object { id: "549981588779038186" } ​ + <prototype>: Object { … } 的“标签对象”在脚本之间是隔离的,因此scriptA获得了与scriptB不同的“标签对象”

callback