JavaScript - how to detect if the Custom URL scheme is available or not available?
EDIT Following suggestions in comments:
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);
}
and
<a href="javascript:" onclick="goto('juniper:open', 'https://www.junper-affiliate.com/setup.zip');">TEST 2</a>
The price you have to pay, is a duplicated request for the page.
EDIT
This is a good workaround for same-origin policy, which prevents an async version using XMLHTTPRequest to work properly, since SOP restricts cross-domain requests to http and juniper:open would therefore always fail.
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
The initial solution below doesn't actually work 'cause no exception is being thrown if the protocol is not supported.
try {
document.location = 'juniper:open';
} catch (e) {
document.location = 'https://www.junper-affiliate.com/setup.zip';
}
Admin
Updated on July 21, 2022Comments
-
Admin almost 2 years
In Windows operating system i have a custom URI scheme, which is used from
IE, Firefox, Opera, Safari, Google Chrome
to launch Juniper router VPN SSH client (like Cisco). Basically it works as below if the SSH Client is installed, from the web page VPN SSH Client can be launched.
<a href="juniper:open"> VPN SSH Client </a>
Problem:
sometimes the user did not installed the Juniper router SSH client application from the CD/DVD box, therefore the juniper:open does nothing.
So in that case, i need to detect weather or not the URL scheme is available.
Therefore, I tried Javascript method but its not working exactly. because the juniper:open is actually not web link.
How do i then detect it please?
<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>
Then:
<a onclick="test1()">TEST 1</a> <a href="juniper:open" onclick="test2(this.href);return false;">TEST 2</a>
-
Admin almost 10 yearsNot working. When i click the link it straight goes to document.location = 'junper-affiliate.com/setup.zip'; even the juniper:open is installed.
-
mlr almost 10 yearsWhat if you use a catch instead of finally? Can you try that?
-
Admin almost 10 yearsif i use
catch
, then thejuniper:open
works but when i uninstall from the systemjuniper:open
then it does not fall back to junper-affiliate.com/setup.zip at all -
Admin almost 10 yearsI tried in IE 11, Google Chrome stable, Firefox, Opera, Safari. and its not working with any of them. (i have it not installed like you)
-
Admin almost 10 yearsCan you not try something like this?
var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', 'doesnotexist.js'); script.onerror = function() { alert("Loading failed!"); } document.getElementsByTagName('head')[0].appendChild(script);
-
mlr almost 10 yearsI see... you are right, no exception is being thrown. I'm coming up with an alternative
-
mlr almost 10 yearsthe xmlHTTPRequest version I had in mind wouldn't work because of same-origin policy, so I used your suggestion about using a script tag (which is a workaround for SOP) and came up with a working version... at least I hope so! Would you mind trying it with Juniper router installed?
-
mlr almost 10 yearsCheck this answer: stackoverflow.com/a/22055638/1676126 it's a bit complicated to obtain cross-browser support, but perhaps it works?
-
Admin almost 10 yearscan you now show an example. Javascript visits
http://localhost:10001
if failed alert "fail" if success "success". Cause in Local PC i am running a web server which has port 10001 TCP open as web server. -
Paul Haggo almost 8 yearsNone of these solutions are working for me (Firefox 48)
-
Geremia over 5 yearsYour simpler try/catch solution works for me in Firefox 60.4.0esr.
-
syonip almost 5 yearsIs this working on https pages? Getting mixed content error.
-
diachedelic about 4 yearsthe script tag solution fails on iOS Safari 13.3 with
Failed to load resource: unsupported URL
-
Alex from Jitbit over 3 yearsThe script solution does not work in Chrome88
ERR_UNKNOWN_URL_SCHEME
(the URI protocol is registered)