0

カスタム プロトコルを使用してユーザーのマシンで実行可能ファイルを呼び出すリンクを含む Web アプリを作成しています。このようなもの:

<a href="myprotocol:abc">click this</a>

意図したアクションは、ユーザーがリンクをクリックして実行可能ファイルの実行が開始された後、Web サービスへの進行状況情報の送信を開始することです。ユーザーのブラウザーが同じサービスを照会し、進行状況を Web ブラウザーでユーザーに表示したいと考えています。

計画では、実行可能ファイルを開始してから、サービスへの ajax 呼び出しを開始し、Web ページ上のテキストを更新することを開始しました。ただし、ajax 呼び出しの実行を妨げているカスタム プロトコル リンクに関連する問題があるようです。次のエラーが表示されます。

{"readyState":0,"responseText":"","status":0,"statusText":"error"}

これは通常、クロスドメインの問題のために予約されていますが、ここで起こっていることではありません。

これが私のコードです(プロトコルを「mailto」プロトコルに変更したので、誰のマシンでも動作します):

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    </head>
    <body>
        <a id="go" href="mailto:abc@def.com">gopher it</a>
        <div id="percent"></div>
    </body>

    <script>
        $(document).ready(function() {
            $("#go").click(function() {
                pollStatus("abc");
            });
        });

        function pollStatus(id) {
            $.ajax({
             url: "service/" + id + "/status",
                 type: "GET",
                 dataType: "json",

                 success: function(data) {
                     $("#percent").html(data.percent);

                     //keep polling until status is 100%
                     if(data.percent < 100)
                         setTimeout(function() { pollStatus(id) }, 500);
                 },

                 error: function(e) {
                     console.log(JSON.stringify(e));
                 }
            });
        }
    </script>
 </html>

次のように $("#go").click() を変更して false を返すと、ajax 呼び出しは成功します。

 $(document).ready(function() {
     $("#go").click(function() {
         pollStatus("abc");
         return false;
     });
 });

しかし、カスタム プロトコルが実行されないため、実行可能ファイルは実行されません。

これを機能させる方法についてのアイデアはありますか?

4

1 に答える 1

2

これ:

<a id="go" href="{url}">gopher it</a>

文字通りの意味: 現在のドキュメントを のいずれかに置き換え{url}ます。したがって、すべてのスクリプトの実行を停止し、ベース URL を変更するなどしてください。

解決策として、これを試すことができます:

<a id="go" href="{url}" target="_blank">gopher it</a>

ドキュメントを新しいウィンドウで開きます。

しかし、私はそれを少し違った方法で行います-目に見えないiframeを介して、そのsrc属性をボタンクリックハンドラーの「myprotocol:abc」に割り当てます。それほどきれいではありませんが、うまくいきます。

于 2014-01-06T02:51:19.087 に答える