Предисловие: я не разработчик Windows / программного обеспечения. Я просто веб-разработчик с навыками Javascript, поэтому знаю, что могу не разбираться в тонкостях обработчиков протоколов.
Я являюсь частью команды, которая создала программу, устанавливающую обработчик протокола. После того, как пользователь установил программное обеспечение, он может запустить его, перейдя по ссылке типа <a href="myAwesomeApp://params">Start!</a>
.
Моя проблема (и я понимаю, что это очень старая проблема) в том, что мне нужен способ узнать, установлен ли этот обработчик протокола.
- Если это так, запустите обработчик протокола
- Если нет, перенаправьте в папку с установщиком программного обеспечения.
Я нашел полуобещающее решение, которое работает для FF и Chrome. здесь (старая запись в блоге о скрипт (здесь). Я не уверен, почему это не работает для IE, даже если автор явно создал функциональность для IE. Вот код, который я использую сейчас (HTML / JS):
<html>
<head>
<title>Detect Custome Protocol</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
</head>
<body>
<input id="protocol" value="" placeholder="custom protocol"/>
<button id="launch">Launch</button>
<!-- Mozilla Only -->
<iframe id="hiddenIframe" src="about:blank" style="display:none"></iframe>
<!-- IE Case 1 -->
<a id="hiddenLink" style="display:none;" href="#">custom protocol</a>
<script>
//Default State
var isSupported = false;
//Helper Methods
function getProtocol(){
return $('#protocol').val();
}
function getUrl(){
return getProtocol()+"://"+"rajeshsegu.com";
}
function result(){
alert(getProtocol() + " supported => " + isSupported);
}
//Handle Click on Launch button
$('#launch').click(function(){
if($.browser.mozilla){
launchMozilla();
}else if($.browser.chrome){
launchChrome();
}else if($.browser.msie){
launchIE();
}
});
//Handle IE
function launchIE(){
var url = getUrl(),
aLink = $('#hiddenLink')[0];
isSupported = false;
aLink.href = url;
//IE10+
if(navigator.msLaunchUri){
navigator.msLaunchUri(url,
function(){ isSupported = true; result(); }, //success
function(){ isSupported=false; result(); } //failure
);
return;
} else if (navigator.appName=="Microsoft Internet Explorer" && aLink.protocolLong=="Unknown Protocol"){
//Case 1: protcolLong
console.log("Case 1");
isSupported = false;
result();
return;
}
//Case2: Open New Window, set iframe src, and access the location.href
console.log("Case 2");
var myWindow = window.open('','','width=0,height=0');
myWindow.document.write("<iframe src='"+ url + "'></iframe>");
setTimeout(function(){
try{
myWindow.location.href;
isSupported = true;
}catch(e){
//Handle Exception
}
if(isSupported){
myWindow.setTimeout('window.close()', 100);
}else{
myWindow.close();
}
result();
}, 100)
};
//Handle Firefox
function launchMozilla(){
var url = getUrl(),
iFrame = $('#hiddenIframe')[0];
isSupported = false;
//Set iframe.src and handle exception
try{
iFrame.contentWindow.location.href = url;
isSupported = true;
result();
}catch(e){
//FireFox
if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL"){
isSupported = false;
result();
}
}
}
//Handle Chrome
function launchChrome(){
var url = getUrl(),
protcolEl = $('#protocol')[0];
isSupported = false;
protcolEl.focus();
protcolEl.onblur = function(){
isSupported = true;
console.log("Text Field onblur called");
};
//will trigger onblur
location.href = url;
//Note: timeout could vary as per the browser version, have a higher value
setTimeout(function(){
protcolEl.onblur = null;
result()
}, 500);
}
</script>
</body>
</html>
Я создал образец страницы для устранения неполадок. На line 72
отсутствовала одна '
цитата, поэтому я добавил ее. Больше ничего не изменилось. *
У меня двоякий вопрос:
- Есть ли лучший способ реализовать этот тип обнаружения обработчика протокола? Есть ли способ исправить функцию
launchIE()
, чтобы она работала? - Есть ли способ узнать, к каким обработчикам я должен иметь доступ при использовании этой проверки? Например, в моем текущем коде acrobat отображается как True в Chrome. В IE10 это неверно. У меня есть общее представление о том, что должно быть правдой / ложью, но я не знаю окончательно.
Я пытаюсь сделать это в Javascript, поскольку требования этого проекта - запустить программу из браузера (и позже вернуть результаты). Если это невозможно в Javascript, я готов услышать любые другие решения.
navigator.msLaunchUri
должен быть выше методаnavigator.appName=="Microsoft Internet Explorer"
. Потому что navigator.appName IE10 также является Microsoft Internet Explorer. Более правильный код будетif(navigator.msLaunchUri){}else if(navigator.appName=="Microsoft Internet Explorer"){}
- person hexalys   schedule 09.01.2014