2

I am trying to detect the Adobe Reader plugin for IE11, but for some reason it always returns null. I am lead to believe it is because IE11 doesn't use the same plugin name as older versions of Internet Explorer, but I am not sure.

I got my code directly from this site (a user from this website!): http://thecodeabode.blogspot.com/2011/01/detect-adobe-reader-plugin.html

The code works brilliantly until IE11 on Windows 7, where it returns null in getAcrobatVersion.

Here is the full code so it's easier for you all:

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.');
    }
Mormodes
  • 25
  • 1
  • 4
  • Theoretically, IE11 should be using navigator.plugins for its addons like all other browsers. In practice, this doesn't seem to be the case all the time, so you might need to try checking both. (I encountered this with Flash - my development computer used ActiveXObject, then another person's computer had it in the browser-standard plugins list) – Katana314 Jan 31 '14 at 16:58
  • @Katana314: that sounds like it might be compatibility mode causing that? – Spudley Jan 31 '14 at 17:04
  • @Spudley For example: Here, on Stack Overflow, my navigator.plugins object is an empty array. However, on the separate computer in a nearby office (possibly where Flash was installed more recently) it's an array with a number of plugin objects, like Flash. In Developer Tools, the emulation mode shows Edge (normal) for both. Here's Microsoft's page with a good code example on how best to detect Silverlight (can be adapted to the plugin you want): http://msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx – Katana314 Jan 31 '14 at 17:08

3 Answers3

3

if(userAgent.indexOf("msie") > -1) will no longer do the job in IE11 because the user agent string has changed. For IE11, you have to look for Trident.

MediaElement.js worked around this like so:

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

So I guess this might do the trick for you?

  else if(userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1)  return "ie";
Olly Hodgson
  • 15,076
  • 3
  • 40
  • 60
  • 1
    Huzzah! This works! To be honest, I am brand new to the navigator object, and wasn't even sure what I was looking for, I just had an idea. I've learned a lot today, thank you very much for the help! – Mormodes Jan 31 '14 at 17:49
  • I know this the old question but I am facing issues for IE10. I am getting alert when I use code of above question that : "Automation Server Can't crete object." I have pdf viewer in my browser. My Issue: http://stackoverflow.com/questions/24055738/how-to-know-if-browser-has-pdf-viewer-or-not – Dhwani Jun 11 '14 at 07:05
  • Thank you so much! I never thought I would find a post where someone used the same exact file downloaded off the internet with the same exact problem with an answer that works. Here have an upvote. – DrinkJavaCodeJava Sep 22 '14 at 14:40
1

You don't need to do a bunch of crazy browser detects. IE11 has made this easier because they support navigator.plugins now. If you see that object just use the same method that works for Chrome or Firefox.

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

Dave Methvin
  • 1,458
  • 10
  • 12
  • I know this the old question but I am facing issues for IE10. I am getting alert when I use code of above question that : "Automation Server Can't crete object." I have pdf viewer in my browser. My issue: http://stackoverflow.com/questions/24055738/how-to-know-if-browser-has-pdf-viewer-or-not – Dhwani Jun 11 '14 at 07:04
0

userAgent.indexOf("msie") will not work in IE11. hey changed the user agent string. All the rest follows from that, as all your getBrowserName() == ie tests will fail.

Either change you detection code to work for all IE versions (look for trident instead of/as well as msie), or else use a different method to determine what to do (detecting the existence of the activeX object might be a good alternative)

Spudley
  • 166,037
  • 39
  • 233
  • 307
  • I know this the old question but I am facing issues for IE10. I am getting alert when I use code of above question that : "Automation Server Can't crete object." I have pdf viewer in my browser. My Issue: http://stackoverflow.com/questions/24055738/how-to-know-if-browser-has-pdf-viewer-or-not – Dhwani Jun 11 '14 at 07:06