3

JSONPを使用してクロスドメインリクエストを作成しています。スクリプトはFirefoxとChromeで完全に機能しますが、IE9以下では次のエラーが発生します。

Request failed: parsererror
Error: jQuery1720027601653975035778_1348794800150 was not called

dataTypeをからに設定しようとしましjsonptext/jsonが、ChromeまたはFirefoxでは機能しません。IEで呼び出しが成功している間、null応答が返されます。

コード

$.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が送信しました

([{"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":""}])

この問題を修正するにはどうすればよいですか?

4

2 に答える 2

4

Internet Explorerを使用するには、JSOPを機能させるためにcrossDomain変数を明示的に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,
于 2012-09-28T16:55:26.460 に答える
0

誰かがジャックの説明どおりに問題を抱えているが、ジャックの答えで問題を解決できなかった場合に備えて、このページの提案を試してみてください。

基本的に、私にとっての問題の実際の原因は、サーバー側の文字エンコードを「utf8」に設定していたことでした。これは「utf-8」および「UTF-8」と同等であるはずです。IE9以前のバージョンのようです。そうは思わない:)

私のJS開発者の友人の一人が私に言っていたように、コンマまたはマイナスは、JavaScript開発(特にIE)であなたを泣かせる可能性があります

于 2014-05-26T05:21:22.550 に答える