3

Safari のメニューバーに留まる Safari 拡張機能を作成しています。クリックすると、特定の文字列を含むすべてのリンクが開きます。しかし、それは機能していません。

これは私の拡張ビルダー画面のようです: http://i.imgur.com/xRXB1.png

クリックしたときにのみスクリプトを実行したいので、HTML ファイルにスクリプトがあるため、外部スクリプトは設定していません。

そして、次のコードを含む global.html ページがあります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <script type="text/javascript" src="jquery.js"></script>
    </head>
    <body>
        <script>
            safari.application.addEventListener("comnand", performCommand, false);

            Function performCommand(event) {  
                if (event.command == "open-designs") {  
                    $(document).ready(function() {
                        $('a[href*="/Create/DesignProduct.aspx?"]').each(function() {
                            window.open($(this).attr('href'),'_blank');
                        });
                    });
                }  
            }
        </script>
    </body>
</html>

これは機能しませんか?jQuery は JS であるため、jQuery と JS の書き込みを混在させることはできますか? そして、それは私がリンクをターゲットにする方法ではありませんか?

4

2 に答える 2

4

問題は、拡張機能のグローバル ページが、現在読み込まれているページの DOM に直接アクセスできないことです。必要なことを実現するには、注入されたスクリプトを使用し、メッセージング プロキシを使用してページと通信する必要があります。

たとえば、グローバルは次のようになります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <script type="text/javascript" src="jquery.js"></script>
    </head>
    <body>
        <script>
            $(document).ready(function() {
                safari.application.addEventListener("command", performCommand, false);
            });

            function performCommand(event) {  
                if (event.command == "open-designs") { 
                    safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("open-designs", "all");
                }  
            }
        </script>
    </body>
</html>

次に、Extension Builder で、2 つの「開始スクリプト」を追加する必要があります。1 つは jquery で、もう 1 つはページに読み込まれる新しいファイルで、次のようになります。

function extensionname_openAll(event)
{
    if (event.name == 'open-designs')
    {
        $('a[href*="/Create/DesignProduct.aspx?"]').each(function(index,elem) {
            window.open($(elem).attr('href'),'_blank');
        });
    }
}
safari.self.addEventListener("message", extensionname_openAll, true);
于 2012-05-13T12:32:22.873 に答える
3
  1. 私が見ている明確なことの1つは、あなたの$(document).ready()関数が別の関数内にあるということです。$(document).ready()これにより、DOM と jQuery が完全にロードされた後にのみその関数を呼び出すという条件の必要性が本質的に軽減されます。

    コードを再編成して、DOM と jQuery がロードされた後にのみイベント リスナーを追加します。 それ$(document).ready()がコールバックを使用する目的です。

  2. さらに、 のコールバック関数に関してもう 1 つ問題があります .each()。その関数は、インデックスとそれが参照する要素の 2 つのパラメーターを処理する必要があります。への呼び出しeach() は、要素のコレクションを反復処理します。コールバック関数に入る要素ごとに、そのインデックスがパラメーターとして渡され、そのインデックスにある要素自体も渡されます。詳細については、ドキュメントを参照してください。

$(document).ready(function() {
 safari.application.addEventListener("command", performCommand, false);
 console.log("Document is ready to go!");
});

function performCommand(event) {  
  console.log("event recieved");
  if (event.command == "open-designs") {     
    console.log("got 'open-designs' event");
    $('a[href*="/Create/DesignProduct.aspx?"]').each(function(index,elem) {
      console.log("opening window", index, elem);
      window.open($(elem).attr('href'),'_blank');
    });
  }  
}

コールバックを使用し$(document).ready()て、DOM の準備が整い、jQuery が初期化されたことを示します。すべての準備ができたら、イベント リスナーをセットアップできます。リスナーが追加される前に関数を呼び出すperformCommand()ことはできません (他の参照がない限り)。

于 2012-05-10T17:55:20.277 に答える