用JavaScript检测ie11中的Adobe Reader

时间:2014-01-31 16:49:44

标签: javascript detect acrobat internet-explorer-11

我正在尝试检测IE11的Adobe Reader插件,但由于某种原因它总是返回null。我认为这是因为IE11不使用与旧版Internet Explorer相同的插件名称,但我不确定。

我直接从这个网站(这个网站的用户)获得了我的代码!):http://thecodeabode.blogspot.com/2011/01/detect-adobe-reader-plugin.html

代码在Windows 7上运行得非常出色,在getAcrobatVersion中返回null。

这是完整的代码,所以对你们来说更容易:

var getAcrobatInfo = function() {

      var getBrowserName = function() {
        return this.name = this.name || function() {
          var userAgent = navigator ? navigator.userAgent.toLowerCase() : "other";

          if(userAgent.indexOf("chrome") > -1)        return "chrome";
          else if(userAgent.indexOf("safari") > -1)   return "safari";
          else if(userAgent.indexOf("msie") > -1)     return "ie";
          else if(userAgent.indexOf("firefox") > -1)  return "firefox";
          return userAgent;
        }();
      };

      var getActiveXObject = function(name) {
        try { return new ActiveXObject(name); } catch(e) {}
      };

      var getNavigatorPlugin = function(name) {
        for(key in navigator.plugins) {
          var plugin = navigator.plugins[key];
          if(plugin.name == name) return plugin;
        }
      };

      var getPDFPlugin = function() {
        return this.plugin = this.plugin || function() {
          if(getBrowserName() == 'ie') {
            //
            // load the activeX control
            // AcroPDF.PDF is used by version 7 and later
            // PDF.PdfCtrl is used by version 6 and earlier
            return getActiveXObject('AcroPDF.PDF') || getActiveXObject('PDF.PdfCtrl');
          }
          else {
            return getNavigatorPlugin('Adobe Acrobat') || getNavigatorPlugin('Chrome PDF Viewer') || getNavigatorPlugin('WebKit built-in PDF');
          }
        }();
      };

      var isAcrobatInstalled = function() {
        return !!getPDFPlugin();
      };

      var getAcrobatVersion = function() {
        try {
          var plugin = getPDFPlugin();

          if(getBrowserName() == 'ie') {
            var versions = plugin.GetVersions().split(',');
            var latest   = versions[0].split('=');
            return parseFloat(latest[1]);
          }

          if(plugin.version) return parseInt(plugin.version);
          return plugin.name

        }
        catch(e) {
          return null;
        }
      }
      // The returned object
      return {
        browser:        getBrowserName(),
        acrobat:        isAcrobatInstalled() ? 'installed' : false,
        acrobatVersion: getAcrobatVersion()
      };
    };

    var info = getAcrobatInfo();
    if(info.acrobat){
        //IE11 will return false even if you have adobe reader because it's a terrible browser.
        document.write('<img src="img/sysChkErr.gif" alt="" border="0">');
        document.write('<span style="color: ' + errCol + '"><strong>Not Installed</strong></span>');
        document.write('<br /><br />Some of our applications require Adobe Reader. You can download Adobe Reader ');
        document.write('<a href="http://get.adobe.com/reader/" target="_blank">here</a>.');
    }else{
        document.write('<img src="img/sysChkPas.gif" alt="" border="0">');
        document.write('<span style="color: ' + pasCol + '"><strong>Installed</strong></span>');
        document.write('<br /><br />Version ' + info.acrobatVersion + ' is installed.');
    }

3 个答案:

答案 0 :(得分:3)

if(userAgent.indexOf("msie") > -1)将不再在IE11中完成工作,因为the user agent string has changed。对于IE11,您必须查找Trident

MediaElement.js worked around this喜欢这样:

t.isIE = (nav.appName.match(/microsoft/gi) !== null) || (ua.match(/trident/gi) !== null);

所以我猜这可能会对你有所帮助?

  else if(userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1)  return "ie";

答案 1 :(得分:1)

你不需要做一堆疯狂的浏览器检测。 IE11使这更容易,因为它们现在支持navigator.plugins。如果您看到该对象只使用适用于Chrome或Firefox的相同方法。

http://msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx

答案 2 :(得分:0)

userAgent.indexOf("msie")在IE11中不起作用。嘿改变了用户代理字符串。所有其余的都是由此完成的,因为所有getBrowserName() == ie测试都将失败。

更改您的检测代码以适用于所有IE版本(查找trident而不是/以及msie),或者使用其他方法来确定要执行的操作(检测存在activeX对象可能是一个很好的选择)