Обнаружение обработчика протокола с помощью Javascript

Предисловие: я не разработчик 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 отсутствовала одна ' цитата, поэтому я добавил ее. Больше ничего не изменилось. *

У меня двоякий вопрос:

  1. Есть ли лучший способ реализовать этот тип обнаружения обработчика протокола? Есть ли способ исправить функцию launchIE(), чтобы она работала?
  2. Есть ли способ узнать, к каким обработчикам я должен иметь доступ при использовании этой проверки? Например, в моем текущем коде acrobat отображается как True в Chrome. В IE10 это неверно. У меня есть общее представление о том, что должно быть правдой / ложью, но я не знаю окончательно.

Я пытаюсь сделать это в Javascript, поскольку требования этого проекта - запустить программу из браузера (и позже вернуть результаты). Если это невозможно в Javascript, я готов услышать любые другие решения.


person Fillip Peyton    schedule 09.01.2014    source источник
comment
Верно, но в этом вопросе нет приемлемого варианта для IE. И это очень старый вопрос   -  person Fillip Peyton    schedule 09.01.2014
comment
В вашем коде я заметил одну вещь: метод 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
comment
В этом есть смысл. Я исправлю это сейчас.   -  person Fillip Peyton    schedule 09.01.2014