JSON with Internet Explorer (resolved)

Today I noticed a strange behavior with jQuery and Internet Explorer…

The jQuery function below worked just fine in Firefox & Chrome …
but on Internet Explorer it somehow never triggered the ‘success’ event callback:

$.ajax({
   type:"GET",
   url:"handler.php?id="+$.id,
   dataType:"json",
   success:function(json){
      /* do something */
   }
});

In case you don’t use jQuery, this is the required request header (it’s identical to dataType:”json”):

xhr.setRequestHeader("Accept","application/json");



As it turned out, IE has certain compatibility issues when delivering with the correct headers.
For example, this response header causes the AJAX request to fail dearly on Internet Explorer:

<?php
   header("content-type: application/json; charset=utf8");
   echo json_encode($json);
?>

But when sending out the response without any header – the JSON gets parsed on IE:

<?php
   echo json_encode($json);
?>



Some people on the jQuery forum wrote, that IE even requires that content header,
but the trick definitely is: not to send out the content-type response header to IE.


One method to handle this behavior is browser-detection on AJAX:

$.ajax({
   type:"GET",
   url:"handler.php?browser="+
   (($.browser.msie)?"ie":"dom")+"&id="+$.id,
   dataType:"json",
   success:function(json){
      /* do something */
   }
});

… and a simple fall-through switch statement within the AJAX-handler:

<?php
switch($_GET['browser']){

    case "dom": /* sending out the correct headers */
                header("content-type: application/json; charset=utf8");
		
                /* fall-back to IE compatibility */
     case "ie": $arr = $obj->get_some_array($id);
                echo json_encode($arr);
                break;
}
?>



Or alternatively: detect Internet Explorer server-side and just skip the header in that case:

<?php
if(!preg_match("/msie\s(\d+).(\d+)/", strtolower($_SERVER["HTTP_USER_AGENT"]), $arr)){
   header("content-type: application/json; charset=utf8");
}
echo json_encode($obj->get_some_array($id));
?>



This makes JSON applications even work on IE6, believe it or not :)