2012-04-03 24 views
1

更新:謝謝羅布W代表指出有什麼不對的代碼。在傳遞標頭()時尚未定義CHARSET的情況下,發現後端存在錯誤。 IE瀏覽器對此很敏感,而Chrome和FF則不是。jQuery.ajax()字符集的錯誤9

這種情況下可用於具有動態字符集支持的平臺上的AJAX調用。

-----------------

[原帖]

我認爲jQuery的整理出適合我們的瀏覽器的差異。我完全不知道爲什麼這個工程在Chrome和FF中完美無瑕,但不是IE。

在鉻和FF:

腳本帖一個ISO-8859-1完全編碼AJAX請求。結果是iso-8859-1編碼並很好地返回。

在IE9

在後端,這取決於(get_address.json.php)的頭,我得到不同的結果:

// Throws readyState 0 error in IE. 
header('Content-type: application/json; charset=iso-8859-1'); 

// Works in IE9 but strips foreign characters. 
header('Content-type: application/json; charset=utf-8'); 

// Same result as utf-8 above 
header('Content-type: application/json'); 

腳本:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script> 
    $(document).ready(function() { 
    $("input:button[name=get_address]").click(function() { 
     $.ajax({ 
     url: "get_address.json.php", 
     type: "POST", 
     data: $("input:text[name=crn]").serialize(), 
     cache: false, 
     async: false, 
     dataType: "json", 
     beforeSend: function(xhr) { 
      xhr.overrideMimeType("application/x-www-form-urlencoded; charset=<?php echo CHARSET; ?>"); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert(jqXHR.readyState + '\n' + textStatus + '\n' + errorThrown.message); 
     }, 
     success: function(data) { 
      if (!data) { 
      alert("Error: No response"); 
      return; 
      } 
      if (data.error) { 
      alert(data.error); 
      return; 
      } 
      $("input:text[name=firstname]").val(data.firstname); 
      $("input:text[name=lastname]").val(data.lastname); 
      $("input:text[name=street_address]").val(data.street); 
      $("input:text[name=postcode]").val(data.postcode); 
      $("input:text[name=city]").val(data.city); 
     }, 
     complete: function() {} 
     }); 
    }); 
    }); 
</script> 

<input type="text" name="crn"> <input type="button" name="get_address" value="Get Address" /> 

模擬JSON響應(使用ISO-8859-1外來字符):

<?php 
header('Content-type: application/json; charset='. CHARSET); 
echo '{"census":"1","protected":"0","crn":"19000000-1234","firstname":"Åke","lastname":"Jönsson","co":"","street":"Testvägen 1","postcode":"72344","city":"Göteborg"}'; 
?> 

錯誤警報()在IE中說:

[object Error] 
error 
[object Error] 

我不喜歡的字符集轉換,除非這是唯一可行的解​​決方案花哨的解決方案。後端是osCommerce,純粹是iso-8859-1。

我們如何防止在沒有字符轉換的情況下爲iso-8859-1內容拋出錯誤?

+0

您是否嘗試過轉換字符集? – jrummell 2012-04-03 17:46:50

+1

像IE6,7和8中的魅力一樣工作:http://jsfiddle.net/4cPes/。你能顯示生成的HTML代碼嗎?此外,而不是提醒'errorThrown',使用'errorThrown.message'。這將顯示更有用的錯誤信息... – 2012-04-03 19:29:16

+0

Rob W,感謝您的確認。這導致我在後端最易怒的簡單錯誤。請參閱後續文章。 – tim 2012-04-03 20:18:08

回答

0

確保被調用的腳本返回有效的內容類型字符集。

<?php 
// make sure CHARSET is defined before output. 
header('Content-type: application/json; charset='. CHARSET); 
?>