JavaScript - как определить, доступна ли схема пользовательских URL-адресов или недоступна?

В операционной системе Windows у меня есть настраиваемая схема URI, которая используется из

IE, Firefox, Opera, Safari, Google Chrome

запускает клиент SSH VPN-маршрутизатора Juniper (например, Cisco). В основном это работает, как показано ниже, если клиент SSH установлен, с веб-страницы можно запустить VPN-клиент SSH.

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

Проблема:

иногда пользователь не установил клиентское приложение SSH-маршрутизатора Juniper из коробки CD/DVD, поэтому можжевельник: open ничего не делает.

Итак, в этом случае мне нужно определить погоду, или нет схемы URL.

Поэтому я попробовал Javascript-метод, но он не работает точно. потому что можжевельник: open на самом деле не веб-ссылка.

Как я могу его обнаружить?

<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>

Ответ 1

ИЗМЕНИТЬ Следующие предложения в комментариях:

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> 

Цена, которую вы должны заплатить, - это дублированный запрос на страницу.

ИЗМЕНИТЬ

Это хороший обход для политики одного и того же происхождения, что предотвращает работу асинхронной версии с использованием XMLHTTPRequest, поскольку SOP ограничивает междоменные запросы на http и можжевельник: поэтому open всегда будет терпеть неудачу.

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;
    }
}

EDIT

Исходное решение, приведенное ниже, фактически не работает, потому что не генерируется исключение, если protocal не поддерживается.

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

Ответ 2

После многого поиска я не пришел ни к чему, что могло бы помочь решить мою проблему. Но это то, что я сейчас делаю

1) Напишите небольшой крошечный веб-сервер, который может работать на ПК в течение 24/7 при загрузке, при сбое. Использовать собственный питон:

python -m SimpleHTTPServer [port]

2) крошечный веб-сервер будет прослушивать ненормальные порты, такие как 10001 или такие TCP-порты, которые никогда не будут использоваться

3) из браузера мы должны связаться с http://localhost:10001, чтобы получить ответ

4) на основе этого ответа мы должны решить

В противном случае, кажется, что доступ не доступен

EDIT: Или вы можете сделать так: InnoSetup - есть ли способ вручную создать cookie для Internet Explorer?