views:

304

answers:

1

What changed in IE8 that makes detecting InfoCard Selector support in javascript stop working unless IE8 is put in Compatibility Mode?

And more to the point, what is the new JavaScript code to detect the presence of InfoCard support?

Here is the script that worked up through IE7, including FireFox with a plug-in in some cases:

function AreCardsSupported() {
    var IEVer = -1;
    if (navigator.appName == 'Microsoft Internet Explorer') {
     if (new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null) {
      IEVer = parseFloat(RegExp.$1);
     }
    }

    // Look for IE 7+. 
    if (IEVer >= 7) {
     var embed = document.createElement("object");
     embed.setAttribute("type", "application/x-informationcard");

     return "" + embed.issuerPolicy != "undefined" && embed.isInstalled;
    }

    // not IE (any version)
    if (IEVer < 0 && navigator.mimeTypes && navigator.mimeTypes.length) {
     // check to see if there is a mimeType handler. 
     x = navigator.mimeTypes['application/x-informationcard'];
     if (x && x.enabledPlugin) {
      return true;
     }

     // check for the IdentitySelector event handler is there. 
     if (document.addEventListener) {
      var event = document.createEvent("Events");
      event.initEvent("IdentitySelectorAvailable", true, true);
      top.dispatchEvent(event);

      if (top.IdentitySelectorAvailable == true) {
       return true;
      }
     }
    }

    return false;
}
+1  A: 

I got an answer out of band from the IE8 team:

Change

embed.setAttribute("type", "application/x-informationcard");

to

embed.type = "application/x-informationcard";
Andrew Arnott