2016-12-12 16 views
4

私は2つのスクリプトを持っています。それぞれ、当社の異なるサブドメイン"Example.com".TamperMonkey - 異なるサブドメインのスクリプト間のメッセージ

Script #1 -- house.example.com 
Script #2 -- bob.fred.example.com 

同じドメイン、別のサブドメイン上で実行されます。

特定の要素がhouse.example.comに表示されたら、私はbob.fred.example.com

上で実行中のスクリプトにメッセージを介して送信する必要があり、Googleの拡張は、拡張間でメッセージを交換することができるので、内のメッセージを交換するTamperMonkeyと方法が必要同一の第2レベルドメイン上で実行されている場合は、スクリプト間で同じ拡張機能を使用できます。

誰でも正しい方向に向けることができますか? 1つまたは2つの例が金でその重さに値する。


更新: Gothdoはこの質問への答えを含むようJavascript communication between browser tabs/windowsを参照するが、彼は考慮に関与クロスオリジンの政策を取ることができませんでした。 この質問の主なポイントであった、この参照された質問の回答のどれも、クロスオリジンブラウザタブ通信に対する明確な回答はありません。私はこの問題を研究して解決し、多くのSOソースと非SOソースからアイデアを得ました。この質問が再開された場合、私は解決策を掲載します。

+3

これは私にとって重複していません。 OPは[Chrome拡張機能のメッセージング](https://developer.chrome.com/extensions/messaging)と同様に、TamperMonkeyのメッセージングについて質問しています。 – nicovank

+0

@nicovank Tampermonkeyでも同じです。 TampermonkeyスクリプトにはChrome拡張機能などの特権はありません。それらは通常のスクリプトと非常によく似ています。 –

+2

@ゴートまだ、私は適切なことは、そのようなAPIはないと言っている回答を提供することですが、通常のウェブメッセージングを使用してリンクを提供することができます。答えは似ていますが、これは重複ではありません。 - 特に、スクリプトが同じページで実行された場合、どのように['GM_setValue'](https://wiki.greasespot.net/GM_setValue)を使用するかを提示することで、答えが向上する可能性があるためです。 – nicovank

答えて

0

クロスタブユーザースクリプト通信を実現するには、GM_getValue,GM_setValue & GM_addValueChangeListenerを使用できます。

ユーザースクリプトのヘッダーに次の行を追加します。

// @grant  GM_setValue 
// @grant  GM_getValue 
// @grant  GM_addValueChangeListener 

次の大まかなコードは、クロスタブのユーザースクリプト通信を簡略化します。

function GM_onMessage(label, callback) { 
    GM_addValueChangeListener(label, function() { 
    callback.apply(undefined, arguments[2]); 
    }); 
} 

function GM_sendMessage(label) { 
    GM_setValue(label, Array.from(arguments).slice(1)); 
} 

メッセージを送受信するには、次の操作が必要です。送信されたメッセージは、前と同じである場合

GM_onMessage('_.unique.name.greetings', function(src, message) { 
    console.log('[onMessage]', src, '=>', message); 
}); 
GM_sendMessage('_.unique.name.greetings', 'hello', window.location.href); 

NOTEメッセージの送信は、あなたのコールバックをトリガしない場合があります。これは、値が変更されていないため、すなわち、GM_setValueが呼び出されたにもかかわらず、以前と同じ値が変更されているため、呼び出さないGM_addValueChangeListenerが原因です。

関連する問題