web-dev-qa-db-ja.com

JavaScript-カスタムURLスキームが利用可能かどうかを検出する方法は?

Windowsオペレーティングシステムでは、カスタムURIスキームがあります。

IE、Firefox、Opera、Safari、Google Chrome

ジュニパールーターVPNSSHクライアント(Ciscoなど)を起動します。基本的にSSHクライアントがインストールされている場合は以下のように動作し、ウェブページからVPNSSHクライアントを起動することができます。

<a href="juniper:open"> VPN SSH Client </a>

問題:

ユーザーがCD/DVDボックスからJuniperルーターSSHクライアントアプリケーションをインストールしなかったため、juniper:openは何もしません。

その場合、天気を検出する必要があるか、URLスキームが利用可能かどうかを確認する必要があります。

そのため、Javascriptメソッドを試しましたが、正確に機能しませんでした。 juniper:openは実際にはWebリンクではないからです。

どうすればそれを検出できますか?

<script>
// Fails
function test1(){
  window.location = 'juniper:open';
  setTimeout(function(){
    if(confirm('Missing. Download it now?')){
      document.location = 'https://www.junper-affiliate.com/setup.Zip';
    }
  }, 25);

  //document.location = 'juniper:open';
}

// Fails
function test2(h){
  document.location=h;
  var time = (new Date()).getTime();
  setTimeout(function(){
   var now = (new Date()).getTime();
   if((now-time)<400) {
    if(confirm('Missing. Download it now?')){
     document.location = 'https://www.junper-affiliate.com/setup.Zip';
    } else {
     document.location=h;
    }
   }
  }, 300);
 }
</script>

次に:

<a onclick="test1()">TEST 1</a>
<a href="juniper:open" onclick="test2(this.href);return false;">TEST 2</a>
11
user285594

[〜#〜] edit [〜#〜]コメントの次の提案:

function goto(url, fallback) {
    var script = document.createElement('script'); 

    script.onload = function() { 
        document.location = url;
    } 
    script.onerror = function() { 
        document.location = fallback;
    } 
    script.setAttribute('src', url); 

    document.getElementsByTagName('head')[0].appendChild(script);

}

そして

<a href="javascript:" onclick="goto('juniper:open', 'https://www.junper-affiliate.com/setup.Zip');">TEST 2</a> 

あなたが支払わなければならない価格は、ページの重複したリクエストです。

[〜#〜]編集[〜#〜]

SOPはクロスドメインリクエストをhttpに制限し、juniper:openは常に失敗するため、これは同一生成元ポリシーの適切な回避策であり、XMLHTTPRequestを使用する非同期バージョンが正しく機能しないようにします。

function goto(url, fallback) {
    var xmlhttp=new XMLHttpRequest();
    xmlhttp.open('GET', url, false);
    try {
        xmlhttp.send(null);                  // Send the request now
    } catch (e) {
        document.location = fallback;
        return;
    }

    // Throw an error if the request was not 200 OK 
    if (xmlhttp.status === 200) {
        document.location = url;
    } else {
        document.location = fallback;
    }
}

[〜#〜]編集[〜#〜]

以下の最初の解決策は実際には機能しません。これは、プロトコルがサポートされていない場合に例外がスローされないためです。

  try {
    document.location = 'juniper:open';
  } catch (e) {
    document.location = 'https://www.junper-affiliate.com/setup.Zip';
  }
9
mlr

たくさん検索した後、私は自分の問題を解決するのに役立つものは何も見つかりませんでした。しかし、これは私が今作っているものです

1)起動時、クラッシュ時にPCで24時間年中無休で実行できる小さな小さなWebサーバーを作成します。ネイティブPythonを使用します。

python -m SimpleHTTPServer [port]

2)小さなWebサーバーは、10001などの異常なポートをリッスンしますTCP使用されないポート)

3)ブラウザから、返信を受け取るためだけにhttp://localhost:10001と通信する必要があります

4)その回答に基づいて決定する必要があります

そうでなければ利用できる方法はないようです

編集:または、次の方法で実行できます: InnoSetup-Internet Explorer用のCookieを手動で作成する方法はありますか?

0
YumYumYum