很多下载网站都有迅雷、快车的专用下载链接,如果用户机器装了迅雷、快车,就会调用迅雷、快车进行下载,如果没有安装则弹出迅雷、快车的下载。那么迅雷、快车是如何做到这一点的呢?我知道他们有个迅雷链、快车链的东西,我是想知道它们的实现原理,想我的网站用户机器在没安装我的软件时,进行一些处理

解决方案 »

  1.   

    try{
       //用你的控件执行一个它的方法
    }
    catch(e){
       //如果检查有错误说明控件没有正确安装
    }
      

  2.   


    在javascript中如何调用应用程序软件的方法呢?注意,不是判断ActiveX控件之类是否安装,是要判断本地计算机是否已安装一个应用程序软件哦
      

  3.   

    http://www.google.cn/search?hl=zh-CN&q=js%E8%AF%BB%E5%8F%96%E6%B3%A8%E5%86%8C%E8%A1%A8
      

  4.   


    new ActiveXObject("WScript.Shell");会弹出一个安全警告对话框,并不是很好的解决方案
      

  5.   

    return top:
    1.迅雷、快车的专用下载链接,其实就是带有下载软件标识的base64加密后的href。
    例如:
    “thunder://QUFodHRwOi8vZG93bi5zYW5kYWkubmV0L1RodW5kZXI1LjkuMTYuMTMwNi5leGVaWg==”
    “Flashget://W0ZMQVNIR0VUXWh0dHA6Ly9kb3duNS5mbGFzaGdldC5jb20vZmxhc2hnZXQzLjQuMC4xMDk4Y24uZXhlW0ZMQVNIR0VUXQ==”。
    刚写了个简单的转换方法:<meta http-equiv="Content-Type" content="text/html; charset=gb2312"><script type=text/javascript>
    var Linkchanger = (function(){
    //////////////*base64加密*//////////////
    var base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);function base64encode(str){var out,i,len;var c1,c2,c3;len=str.length;i=0;out="";while(i<len){c1=str.charCodeAt(i++)&0xff;if(i==len){out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt((c1&0x3)<<4);out+="==";break;}c2=str.charCodeAt(i++);if(i==len){out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=base64EncodeChars.charAt((c2&0xF)<<2);out+="=";break;}c3=str.charCodeAt(i++);out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));out+=base64EncodeChars.charAt(c3&0x3F);}return out;}function base64decode(str){var c1,c2,c3,c4;var i,len,out;len=str.length;i=0;out="";while(i<len){do{c1=base64DecodeChars[str.charCodeAt(i++)&0xff];}while(i<len&&c1==-1);if(c1==-1)break;do{c2=base64DecodeChars[str.charCodeAt(i++)&0xff];}while(i<len&&c2==-1);if(c2==-1)break;out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));do{c3=str.charCodeAt(i++)&0xff;if(c3==61)return out;c3=base64DecodeChars[c3];}while(i<len&&c3==-1);if(c3==-1)break;out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));do{c4=str.charCodeAt(i++)&0xff;if(c4==61)return out;c4=base64DecodeChars[c4];}while(i<len&&c4==-1);if(c4==-1)break;out+=String.fromCharCode(((c3&0x03)<<6)|c4);}return out;}function utf16to8(str){var out,i,len,c;out="";len=str.length;for(i=0;i<len;i++){c=str.charCodeAt(i);if((c>=0x0001)&&(c<=0x007F)){out+=str.charAt(i);}else if(c>0x07FF){out+=String.fromCharCode(0xE0|((c>>12)&0x0F));out+=String.fromCharCode(0x80|((c>>6)&0x3F));out+=String.fromCharCode(0x80|((c>>0)&0x3F));}else{out+=String.fromCharCode(0xC0|((c>>6)&0x1F));out+=String.fromCharCode(0x80|((c>>0)&0x3F));}}return out;}function utf8to16(str){var out,i,len,c;var char2,char3;out="";len=str.length;i=0;while(i<len){c=str.charCodeAt(i++);switch(c>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=str.charAt(i-1);break;case 12:case 13:char2=str.charCodeAt(i++);out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=str.charCodeAt(i++);char3=str.charCodeAt(i++);out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break;}}return out;}
    ///////////////////////////////////////function $(o){
             return document.getElementById(o) || o
    }
    function Enurlcode(str,idr){
             var url = $(idr).value;
             str == "thunder"  && ($(idr).value = 'thunder://'+base64encode(utf16to8('AA'+url+'ZZ')));
             str == "Flashget" && ($(idr).value = 'Flashget://'+base64encode(utf16to8('[FLASHGET]'+url+'[FLASHGET]')));
             str == "qqdl"     && ($(idr).value = 'qqdl://'+base64encode(utf16to8(url)));
    }
    function Dnurlcode(idr){
             var str = $(idr).value;
             /thunder:/i.test(str)  && ($(idr).value = utf8to16(base64decode(str.replace(/thunder:\/\//g,''))).replace(/^.{2}|.{2}$/g,''));
             /Flashget:/i.test(str) && ($(idr).value = utf8to16(base64decode(str.replace(/Flashget:\/\//g,''))).replace(/^.{10}|.{10}$/g,''));
             /qqdl:/i.test(str)     && ($(idr).value = utf8to16(base64decode(str.replace(/qqdl:\/\//g,''))));
    }
    function copycode(idr){
    if(!!+'\v1') return false;
    var obj = document.body.createTextRange();
    obj.moveToElementText($(idr));
    obj.scrollIntoView();
    obj.select();
    obj.execCommand("Copy");
    obj.collapse(false);
    alert("已经复制到剪贴板!")
    }
    return {Enurlcode : Enurlcode, Dnurlcode : Dnurlcode, copycode : copycode}
    })()
    </script><textarea id='text' style="width:500px;height:80px;overflow-y:hidden"></textarea></br>
    <input type='button' value="迅雷下载" onClick="Linkchanger.Enurlcode('thunder','text')">
    <input type='button' value="快车下载" onClick="Linkchanger.Enurlcode('Flashget','text')">
    <input type='button' value="旋风下载" onClick="Linkchanger.Enurlcode('qqdl','text')">   
    <input type='button' value="地址复原" onClick="Linkchanger.Dnurlcode('text')">  
    <input type='button' value="本地复制" onClick="Linkchanger.copycode('text')">
    2、非高速专用下载及判断思路(不一定正确)——
    迅雷:<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <script type=text/javascript>
    function Thload(o){
       try{
           new ActiveXObject("ThunderAgent.Agent") || new ActiveXObject("ThunderAgent.Agent.1");
           o.href = o.path;
       }catch(e){
           alert("请先安装迅雷");
           o.href="http://down.sandai.net/Thunder5.9.16.1306.exe";
       }
    }
    </script>
    <a href="#" onclick=Thload(this) path="thunder://QUFodHRwOi8vZG93bi5zYW5kYWkubmV0L1RodW5kZXI1LjkuMTYuMTMwNi5leGVaWg==">迅雷下载</a>快车:<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <script type=text/javascript>
    function Fhload(o){
       try{
           new ActiveXObject("JetCar.Netscape");
           o.href = o.path;
       }catch(e){
           alert("请先安装快车");
           o.href="http://down5.flashget.com/flashget3.4.0.1098cn.exe";
       }
    }
    </script>
    <a href="#" onclick=Fhload(this) path="Flashget://W0ZMQVNIR0VUXWh0dHA6Ly9kb3duNS5mbGFzaGdldC5jb20vZmxhc2hnZXQzLjQuMC4xMDk4Y24uZXhlW0ZMQVNIR0VUXQ==">快车下载</a>
      

  6.   

    <script language="javascript">
    <!--//
    if (new ActiveXObject("Outlook.Application")){
        alert("恭喜,您的电脑可以正常使用Outlook!");
    }
    else{
        alert("因为默认邮件客户端没有正确安装,所以无法执行该操作!");
    }
    //-->
    </script>这是outlook有没有安装的代码,看看是不是对你有帮助
      

  7.   

    谢谢各位,我想我大概知道原理了,也就是说在安装迅雷、快车、Outlook时,会同时安装一个控件,名字分别叫ThunderAgent.Agent、JetCar.Netscape、Outlook.Application,然后只要能在Javascript代码中用new ActiveXObject()方法new出来,就说明已安装了。
    那么请问,这个控件就是一般的ActiveX控件吗?有什么特别需要满足的接口或者标准吗?
      

  8.   

    那请问如何得到这些控件的名称,比如说ThunderAgent.Agent