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?

3
Jack Cole 28 wrzesień 2012, 05:22

2 odpowiedzi

Najlepsza odpowiedź

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,
4
jgillich 8 sierpień 2014, 01:11

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)

0
D.S 26 maj 2014, 09:21