Używam JSONP do wysyłania żądań między domenami. Skrypt działa idealnie w Firefox i Chrome, ale w IE 9 i niższych otrzymuję następujący błąd:
Request failed: parsererror
Error: jQuery1720027601653975035778_1348794800150 was not called
Próbowałem ustawić dataType z jsonp
na text/json
, ale wtedy nie będzie działać w Chrome lub Firefox, a gdy połączenie zakończy się powodzeniem w IE, otrzymuję pustą odpowiedź.
Kod
$.ajax({ // the function that does everything
type: "GET",
url: "http://example.com/products.php?size=" + search_size + "&manufacturer=" + search_manufacturer + "&gender=" + search_gender + "&instock=Y&startat=0&results=30&callback=?", //&callback=? is required to send the offsite server the data. ? is automatically filled in by AJAX
async: true,
cache: false,
contentType: "text/json; charset=utf-8",
dataType: "jsonp",
error: function(xhr, textStatus, errorThrown){ // textStatus = Error code if it fails (parsererror = json handshake fail)
$(datastatus).empty() ;
$(datastatus).append("<b>Request failed: </b>" + textStatus + "<br>" + errorThrown); // Puts the error code in a special div.
},
success: function(data, textStatus){ // data = the json array
$(datastatus).empty();
$(datastatus).append("<b>Request succeeded: </b>" + textStatus);
$("#output").empty(); // empties the product list in preperation to be filled
alert(data);
$.each(data, function(index, value) { // cycles through every value in the array. Everything inside the Curly brackets will be run for each object in the array.
var hideproduct = value.hideproduct; // value.item is simplified down
var productcode = value.productcode;
var productname = value.productname;
var productprice = value.productprice;
var listprice = value.listprice;
var photoscode = value.photos_cloned_from;
var childof = value.ischildofproductcode;
var ProductDescriptionShort = value.productdescriptionshort;
if (ProductDescriptionShort == undefined){
var ProductDescriptionShort = ""// changes "undefined" to "" (blank) so customers wont see that error
};
childcheck = childof; // checks to see if the product is a child
if (childcheck == ""){
var childof = productcode // changes the product code value to match the child productcode
};
$("#output").append("<div class='product' code='" + productcode + "'>"
+ "<a href='http://www.skates.com/-p/" + productcode + ".htm' title='" + productname + ", " + productcode + "'>" + productname + "</a><br>"
+ "<span><font class='text colors_text'><span class='listprice'>List Price</span>: </font> $" + listprice + "</span><br/><span class='price'>Our Price</span>: </font> $" + productprice + "</span><br>"
+ "<div class='product_image'><a href='http://www.skates.com/-p/" + productcode + ".htm' title='" + productname + ", " + productcode + "'><img src='http://www.skates.com/v/vspfiles/photos/" + childof + "-1.jpg' border='0' alt='" + productname + "'></a></div>"
+ "<span class='shortdescription'>" + ProductDescriptionShort + "</span>"
+ "</div>") // Process and add the data to elements.
})
}
})
Json wysłał
([{"productcode":"K2EMY050","productname":"K2 Enemy aggressive skates - Size 5","productprice":"39.99","hideproduct":"Y","listprice":"199.99","photos_cloned_from":"K2EMY","ischildofproductcode":"K2EMY","productdescriptionshort":""},{"productcode":"S02123060","productname":"K2 Mini Enemy - Size 4-6","productprice":"49.99","hideproduct":"Y","listprice":"149.99","photos_cloned_from":"S02123","ischildofproductcode":"S02123","productdescriptionshort":""},{"productcode":"S03109050","productname":"K2 Cadence SL - Size 5","productprice":"39.99","hideproduct":"Y","listprice":"189.99","photos_cloned_from":"S03109","ischildofproductcode":"S03109","productdescriptionshort":""},{"productcode":"S03112050","productname":"K2 Skye SL Womens - Size 5","productprice":"59.99","hideproduct":"Y","listprice":"199.99","photos_cloned_from":"S03112","ischildofproductcode":"S03112","productdescriptionshort":""},{"productcode":"S03118050","productname":"K2 Spire XP Womens - Size 5","productprice":"99.99","hideproduct":"Y","listprice":"239.99","photos_cloned_from":"S03118","ischildofproductcode":"S03118","productdescriptionshort":""}])
Jak rozwiązać ten problem?
2 odpowiedzi
Aby JSOP działał, przeglądarka Internet Explorer musi mieć jawnie ustawioną zmienną crossDomain na wartość true.
$.ajax({ // the function that does everything
type: "GET",
url: "http://example.com/products.php?size=" + search_size + "&manufacturer=" + search_manufacturer + "&gender=" + search_gender + "&instock=Y&startat=0&results=30&callback=?", //&callback=? is required to send the offsite server the data. ? is automatically filled in by AJAX
async: true,
cache: false,
contentType: "text/json; charset=utf-8",
dataType: "jsonp",
crossDomain: true,
Na wypadek, gdyby ktoś miał problem dokładnie tak, jak to opisał Jack, ale odpowiedź Jacka nie mogła go rozwiązać, możesz po prostu spróbować ta strona sugeruje.
Zasadniczo, rzeczywistą przyczyną problemu było dla mnie ustawienie kodowania znaków po stronie serwera jako „utf8”, co powinno być równoważne „utf-8” i „UTF-8”, cóż, wygląda na to, że IE9 i starsze wersje nie uważa tak :)
Jak powiedział mi jeden z moich znajomych programistów JS, przecinek lub minus może sprawić, że będziesz płakać podczas tworzenia javascript (szczególnie w IE)
Podobne pytania
Nowe pytania
jquery
jQuery to biblioteka JavaScript, rozważ także dodanie tagu JavaScript. jQuery to popularna biblioteka JavaScript działająca w różnych przeglądarkach, która ułatwia przechodzenie przez Document Object Model (DOM), obsługę zdarzeń, animacje i interakcje AJAX, minimalizując rozbieżności między przeglądarkami. Pytanie oznaczone tagiem jQuery powinno być powiązane z jQuery, więc jQuery powinno być używane przez dany kod i przynajmniej elementy związane z użyciem jQuery muszą znajdować się w pytaniu.