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?