我正在写一个用户脚本,我需要生成一个精确的自增id,我认为使用顶级主框架全局变量来处理这个是最好的方法。但是,有些站点似乎与脚本的postMessage冲突,例如:https://arad.hange.jp/,当我使用postMessage时,他没有正确呈现,我该怎么办以避免影响那个网站?
我试过使用GM.getValue GM.setValue来做,但是在临界情况下,它不能完全自增1,因为GM.setValue不能实现原子+1操作。
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match *://*/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=fosstodon.org
// @grant GM.addStyle
// @grant GM.getValue
// @grant GM.setValue
// ==/UserScript==
(function () {
"use strict";
if (window.self === window.top) {
let globalId = 0;
window.addEventListener("message", (e) => {
if (e && e.data && e.data.id === "increaseOne") {
globalId++;
console.log("globalId", globalId);
}
});
} else {
// child iframe
// get root window
// check is root window
setTimeout(() => {
window.top.postMessage({ id: "increaseOne" }, "*");
}, 1000);
}
})();