Если вы хотите избежать unsafeWindow
, введите код, который взаимодействует с JS страницы, на страницу.См. addJS_Node()
ниже.
Чтобы запускать функции GM_ из таких событий, вы должны иметь возможность взаимодействовать через:
Так что на данный момент обходной путь все еще должен использовать таймер, , но Вы можете избежать unsafeWindow
, если хотите:
//--- Put everything that goes into the main page, inside myJS().
function myJS () {
window.oldDoWork = DoWork;
window.DoWork = function() {
// Do some new work
callGM_setValue ("From target page", "some value");
window.oldDoWork(); // Call the old function
}
function callGM_setValue (varName, varValue) {
//--- Generate and dispatch a synthetic event.
var zEvent = document.createEvent ("CustomEvent");
zEvent.initCustomEvent (
"messageToGM_setvalue", true, false,
{Name: varName, Value: varValue}
);
document.body.dispatchEvent (zEvent);
}
}
document.body.addEventListener (
"messageToGM_setvalue", fireGM_setValue, false
);
function fireGM_setValue (zEvent) {
/*--- setTimeout remains one of the few things that can cleanse
the calling tree of it's "unsafe" origins.
*/
setTimeout (function() {
GM_setValue (zEvent.detail.Name, zEvent.detail.Value);
}, 0);
}
addJS_Node (null, null, myJS);
function addJS_Node (text, s_URL, funcToRun) {
var D = document;
var scriptNode = D.createElement ('script');
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '('
+ funcToRun.toString()
+ ')()';
var targ = D.getElementsByTagName('head')[0]
|| D.body
|| D.documentElement;
targ.appendChild (scriptNode);
}