gpt4 book ai didi

javascript - 在 Chrome 中的用户脚本之间传输信息

转载 作者:行者123 更新时间:2023-11-29 22:16:57 25 4
gpt4 key购买 nike

当在另一个选项卡中满足特定条件时,我需要在一个选项卡的页面上执行一个函数。我需要做的就是向另一个选项卡发送某种微调。我已经尝试了很多事情并结合计时器来保持轮询:

  • GM_setValue(Chrome 显然不支持)
  • 设置 top.item(显然在选项卡之间不起作用)
  • Cookie(尽管我的用户脚本在同一域的两个选项卡中运行,但这似乎不起作用)

还有其他想法吗?是的,我确实需要使用 Chrome,尽管它似乎有意阻止我 >.>

最佳答案

由于选项卡在同一个域中,您可以使用 localStorage

  1. 设置脚本在两个页面上运行,EG:

    // @include  http://YOUR_SERVER.COM/YOUR_PATH/pitcher/*
    // @include http://YOUR_SERVER.COM/YOUR_PATH/batter/*
  2. 确保您能分辨出哪个页面是哪个页面。例如通过 URL,或一些不同的内容。

  3. 发送页面只是根据需要设置值,EG:

    localStorage.setItem ('targetAddress', 'http://puppies.com/');
  4. 接收页面监听 storage 事件,例如:

    $(window).bind ("storage", function (zEvent) {
    ...
    } );

    window.addEventListener ("storage", function (zEvent) {
    ...
    }, false);


将它们放在一起,这是一个完整的脚本,它可以在 Firefox 和 Chrome(可能还有 Opera 和其他)中运行。

您可以针对 this "sender" page 进行测试, 和 this "receiver" page .

// ==UserScript==
// @name _Cross tab, same domain communication
// @include http://jsbin.com/ihoboz/*pitcher*
// @include http://jsbin.com/ihoboz/*batter*
// @include http://YOUR_SERVER.COM/YOUR_PATH/pitcher/*
// @include http://YOUR_SERVER.COM/YOUR_PATH/batter/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in Greasemonkey 1.0. It restores the sandbox.
*/

function GM_main ($) {
/*-- Is this the sending or receiving page?
In our example, the sender has "pitcher" in the URL,
while the receiver has "batter" in the URL
*/
var isSender = false, isReceiver = false;

if (/pitcher/i.test (location.href) ) {
isSender = true;
}
else if (/batter/i.test (location.href) ) {
isReceiver = true;
}

if (isSender) {
//-- Add 2 buttons to change the data we send to the other tab.
$("body").prepend (
'<button class="gmTestButtons">Set the transmitted value.</button>' +
'<button class="gmTestButtons">Reset the transmitted value.</button>'
);

$("button.gmTestButtons").click ( function () {

if (/^Set the transmitted/.test (this.textContent) ) {
localStorage.setItem ('targetAddress', 'http://puppies.com/');
}
else {
localStorage.setItem ('targetAddress', 'http://unicorns.com/');
}
} );
}
else if (isReceiver) {
//-- Listen for changes in local storage
$(window).bind ("storage", function (zEvent) {
var varName = zEvent.originalEvent.key;
var newValue = zEvent.originalEvent.newValue;

alert (
'Received new variable, "' + varName
+ '", with a new value of: ' + newValue
);
} );
}
}

//-- Style and/or postion our buttons
GM_addStyle ( " \
button.gmTestButtons { \
margin: 1em; \
padding: 1ex 1em; \
font-size: 20px; \
background: pink; \
} \
" );


//--- The rest of this just loads jQuery in a cross-browser way.
//
if (typeof jQuery === "function") {
console.log ("Running with local copy of jQuery!");
GM_main (jQuery);
}
else {
console.log ("fetching jQuery from some 3rd-party server.");
add_jQuery (GM_main, "1.7.2");
}

function add_jQuery (callbackFn, jqVersion) {
var jqVersion = jqVersion || "1.7.2";
var D = document;
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
var scriptNode = D.createElement ('script');
scriptNode.src = 'http://ajax.googleapis.com/ajax/libs/jquery/'
+ jqVersion
+ '/jquery.min.js'
;
scriptNode.addEventListener ("load", function () {
var scriptNode = D.createElement ("script");
scriptNode.textContent =
'var gm_jQuery = jQuery.noConflict (true);\n'
+ '(' + callbackFn.toString () + ')(gm_jQuery);'
;
targ.appendChild (scriptNode);
}, false);
targ.appendChild (scriptNode);
}

关于javascript - 在 Chrome 中的用户脚本之间传输信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14620163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com