web-dev-qa-db-ja.com

プロトコルハンドラーが登録されているかどうかの最も簡単なクロスブラウザーチェック

ユーザーがカスタムプロトコル(myapp://superlinkなど)のリンクをクリックしたとき

アプリを起動するか、ユーザーが設定アプリをダウンロードして実行できるようにする必要があります

カスタムプロトコルが登録されているかどうかを確認するためのクロスブラウザーの方法を探しています

私はユーザーエージェントのサーバー側(IEの場合)をチェックしてこれを特定しようとしました

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform] "myapp" = ""

送る

`....NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; **myapp**`

ユーザーエージェントとして

これは良い、きれいな方法、簡単な設定です:

.regファイルをダウンロードして実行するか、MS Windowsポリシーを介して伝達するだけです

ChromeおよびFirefoxの場合、これを修正できません

(jsで)クライアント側のソリューションはありますか?

私の環境:IE8 +、Chrome(最新)、Firefox(最新))

29
jonny

それは常に私を失敗させることはありませんこの古いトリックがあります。

必要なコア機能はsetTimeoutです。詳細をお知らせします。

setTimeout(function() {
  window.location = "http://iTunes.com/app/yourapplocation";
}, 200);

// once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
window.location = "myapp://superlink";

あなたはそれがおそらくリンクであると述べたので、私はあなたの便宜のためにこの素晴らしい関数を作りました:

HTMLコード

<a href="myapp://superlink" data-href-alt="http://iTunes.com/app/yourapplocation">Click here</a>

JSコード

$("a[href*='myapp://']").click(function(e)
{
  var el = $(this);
  setTimeout(function() {
    window.location = el.data("data-href-alt");
  }, 200);

  // once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
  window.location = el.data("href");

  e.preventDefault();
});

これがあなたに役立つことを願っています:)

21
kororo

同様の問題がありましたが、カスタムプロトコルが既に登録されている(実行可能ファイルを開く)かどうかを確認したり、ダウンロードページを開いたり、何か他のことをしたりする必要がありました。残念ながら、ブラウザによって動作が異なるため、これに対処する簡単な方法はありません。私はすべての情報を収集しようとし、この問題のためのかなり一般的なライブラリを思い付きました、あなたは見てみることができます:

https://github.com/ismailhabib/custom-protocol-detection

pS:Windows 8以外のソリューションIEはかなり醜いですが、より良いソリューションを見つけることができませんでした。

16
habsq

kororoのソリューションは何らかの理由で機能しないので、代わりにこの少し変更されたソリューションを使用して管理しました。

<html>
<a id="link">Click Me</a>
<script>
var link = document.getElementById('link');
var timeout;
window.addEventListener('blur',function(e){
    window.clearTimeout(timeout);
})

link.addEventListener('click', function(e) { 

    timeout = window.setTimeout(function() {
      console.log('timeout');
      window.location = "https://myapp.net";
    }, 1000);

    window.location = "myapp://";
    e.preventDefault();
});
</script>
</html>
6
Houseman

コロノの答えを更新しました、これは私にとってうまくいきました:

$(function() {
    var timeIndex;
    $("a[href*='myapp://']").blur(function(e)
    {
        clearTimeout(timeIndex);
    });

    $("a[href*='myapp://']").click(function(e)
    {
      var el = $(this);
      timeIndex = setTimeout(function() {
        window.location = el.attr("data-href-alt");
      }, 200);

      // once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
      window.location = el.attr("href");
      e.preventDefault();
    });
});
2
Ron Teitelbaum

サラーム

インストール ismailhabib/custom-protocol-detection

このJSファイルを含めることによって protocolcheck.js

次に、このようなコードを書きます

<div id="protocol" href="myprotocol:[email protected]">Check Protocol</div>

<script>
        $("#protocol").click(function (event) {
            protocolCheck($(this).attr("href"), function () {
                    alert("protocol not recognized");
                });
            event.preventDefault ? event.preventDefault() : event.returnValue = false;
        });
</script>
0
Ali Jamal