![](/img/trans.png)
[英]Will browsers choke if the response header of a JSONP payload has content type of “application/jsonp”?
[英]Setting response content type header in JSONP request?
我有一個使用案例,其中我提出了跨域JSONP請求。
$.ajax({
url: "http://anyorigin.com/get/?url=<any_website_url>&callback=?'",
dataType: 'jsonp',
success: function(data) {
console.log(data);
}});
一切正常,但我注意到中國網站的數據亂碼。 我對此進行了調試,發現響應頭始終設置為:
Response Header: Content-Type:text/javascript; charset=ISO-8859-1
現在,此字符集ISO-8859-1產生了問題。 應該是UTF-8。 我基本上想始終將此字符集重寫為UTF-8。 我知道我可以使用ajax做到這一點。 我嘗試使用以下代碼-
$.ajax({
url: "http://anyorigin.com/get/?url=www.google.com&callback=?'",
dataType: 'jsonp',
beforeSend: function(xhr) {
console.log(xhr);
xhr.overrideMimeType("text/javascript; charset=utf-8");
},
success: function(data) {
console.log(data);
}});
但這並不能解決問題。 我猜因為JSONP請求不使用XHR對象,這將無法正常工作。
誰能告訴我如何實現這一目標,或者甚至可以實現? TIA。
jsonp請求本質上是使用<script>
標記包含的外部javascript文件。 幸運的是, <script>
-element具有一個charset
屬性,可以設置UTF-8
。 因此,這看起來像
<script
src="http://anyorigin.com/get/?url=<any_website_url>&callback=myCallbackFunction"
charset="UTF-8"
></script>
其中myCallbackFunction
先前已定義,並將與請求的數據一起調用。 所以你得到的是
<script>
window.myCallbackFunction = function(data){
}
// Dynamically insert the previously describe <script> tag here.
</script>
事實證明,這也可以通過設置scriptCharset
屬性直接在jQuery.ajax
函數opts上scriptCharset
。
僅在使用“腳本”傳輸時才適用(例如,具有“ jsonp”或“ script” dataType和“ GET”類型的跨域請求)。 在請求中使用的腳本標簽上設置
charset
屬性。 當本地頁面上的字符集與遠程腳本上的字符集不同時使用。
您是正確的,JSONP不使用XHR對象,它使用script
標簽。
但是,這可以通過使用scriptCharset
選項的jQuery JSONP包裝器來scriptCharset
。
scriptCharset
類型:字符串
僅在使用“腳本”傳輸時才適用(例如,具有“ jsonp”或“ script” dataType和“ GET”類型的跨域請求)。 在請求中使用的腳本標簽上設置
charset
屬性。 當本地頁面上的字符集與遠程腳本上的字符集不同時使用。
scriptCharset: 'UTF-8'
jQuery將UTF-8
charset
屬性添加到JSONP script
標簽中,您scriptCharset: 'UTF-8'
在您的AJAX設置對象中添加scriptCharset: 'UTF-8'
。
$.ajax({
url: "http://anyorigin.com/get/?url=<any_website_url>&callback=?'",
dataType: 'jsonp',
scriptCharset: 'UTF-8',
success: function(data) {
console.log(data);
}});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.