2

これは私にとって初めての Safari 拡張機能であり、今のところ静かなところが気に入っています。私は、injected.js ページと対話し、jquery .toggle(); を介してページ上の項目を切り替える拡張バーを追加しようとしています。

問題なく jQuery をページに読み込むことができましたが、拡張バーから注入された .js にメッセージを送信することになると、不十分です。私は今日、Apple の開発者ページのレビューに 8 時間以上を費やしました。私ができた唯一のことは、

延長バー:

<!DOCTYPE html>
<html>
<head>
    <title>Board Tools</title> <!-- Extension Bar -->
    <script type="text/javascript" src="jQuery.min.js"></script>
    <script type="text/javascript">
        const myGlobal = safari.extension.globalPage.contentWindow;

    function ToggleBoard(){ 
        myGlobal.test();    
    }
</script>

</head>
<body>

    <input type="button" id="board" value="Board Toggle" onClick="ToggleBoard();">

</body>
</html>

グローバル HTML:

<!DOCTYPE HTML>
<html>
<head>
    <title>global page</title>
    <script type="text/javascript">

        function test() {
            alert("1");
            event.target.page.dispatchMessage("test", "test");
            alert("2");
    }

   </script>
</head>
<body> </body>
</html>

注入された.js:

function test(msgEvent) {
    alert(msgEvent.name);
}
// register for message events
safari.self.addEventListener("message", test, false);

拡張バーから ToggleBoard() 関数を呼び出すことができます。ToggleBoard() 関数は、グローバル HTML から test() 関数を呼び出すことができます。グローバル HTML ページで test() 関数が呼び出されると、最初のアラートが発生しますが、2 番目のアラートは発生しません。少なくともそこまでは絞り込みました。メッセージを送信しようとしている方法がおそらく間違っていると思いますが、それがここにあることです: https://developer.apple.com/library/archive/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html #//apple_ref/doc/uid/TP40009977-CH14-SW1

それが私の側の間違いなのか、それとも開発ページで何か間抜けなのかを確認するために、ページの正確なコードをコピーし、グローバル HTML と Injected.js だけを使用しましたが、探していた結果が得られませんでした。

解決済み: 私が選択した回答は、私が抱えていた問題に大いに当てはまります。一言で言えば正確な答えではありませんでしたが、コメントとともに、コードをまっすぐにするのに役立ちました。さまざまな拡張コンポーネントが適切にメッセージを受け取るようにするために、拡張リモート アクセスをすべてに設定し、URL パターンをホワイトリストに追加する必要がありました。拡張機能は必要なページでのみ起動し、メッセージを使用できます。

4

1 に答える 1

1

test関数はイベント ハンドラーではないため、グローバル ページの関数でeventは何も参照しません。アクティブなタブをターゲットにする場合は、代わりにこれを使用します。

safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('test, 'test');

後で、挿入されたスクリプトからのメッセージに拡張バーまたはグローバル ページを応答させたい場合は、次のようなものをいずれかの場所に追加できます。

safari.application.addEventListener('message', function (e) {
    if (e.name === 'whatever') {
        e.target.page.dispatchMessage('foo', 'bar');
    }
}, false);

挿入されたスクリプトからグローバル ページまたは拡張バーにメッセージを送信する場合safari.self.tab.dispatchMessageは、「メッセージ」イベント ハンドラーを使用して、グローバル ページまたは拡張バーに配置します。

于 2012-08-17T17:29:21.617 に答える