GM_getTab(cb)是如何工作的?

问题描述 投票:6回答:2

似乎没有任何关于这些函数如何工作的信息。我猜想这些是Tampermonkey专属的函数?看起来他们被设计成允许当前正在运行的Tampermonkey脚本之间的通信;一个替代性的方法来不断地轮询GM_Value存储的变化。这是一个非常有趣的想法。

但是,我不知道如何使用它们,他们采取什么值,以及什么样的对象,你回来?你如何使用这三个函数,我对它们的目的是正确的吗?

GM_getTab(cb) 获取一个对象,只要这个标签页是打开的,这个对象就会持久化。

GM_saveTab(tab) 保存tab对象,以便在页面卸载后重新打开它。

GM_getTabs(cb) 在数组中获取所有tab对象,以便与其他scrips实例通信。

(http:/forum.tampermonkey.netviewtopic.php?f=16&t=74。)

userscripts tampermonkey
2个回答
7
投票

我从来没有尝试过使用它们,但是看代码,这些似乎是能够从每个标签页中存储你想要的任何东西,并且还能让所有标签页以这种方式存储所有东西。

在两个chrome控制台上,我运行了以下内容。

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号标签页):

对象 {rand: 0.9303610376082361}VM779: 11 0.9303610376082361VM779: 14其他标签页: 366有值:0.417106909211725VM779:13我敢打赌,我就是那个名为:371的标签。

我使用这个用户脚本在chrome控制台中添加了访问权限,(根据指定的说明,在 @match page).我看到这些数据在我关闭设置它的标签页后,仍然可以通过GM_getTabs()访问。

// ==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()访问。我不知道我会不会指望这个,但我可能会尽量减少我留下的东西。


0
投票

lossleader的回答很完整。简而言之。GM_getTab() 过关 拷贝 的 "标签对象 "到 cb (现在是 callback 在Tampermonkey的最新文档中)。) GM_saveTab() 拯救了 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() &amp。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 { … }

(更新) "tab对象 "被传递给了 "回调"。callback 脚本之间是隔离的,所以脚本A得到的 "tab对象 "与脚本B不同。

setTabExpr1.user.js:26:15 {…}
​                           + a: 1234567
                           + <prototype>: Object { … }
​
setTabExpr2.user.js:26:15 {…}
​                           + b: 7654321
​                           + <prototype>: Object { … }
© www.soinside.com 2019 - 2024. All rights reserved.