2012-09-12 67 views
4

我遇到ajax json請求和Internet Explorer問題。 特別是Ajax請求不正常。
我使用:
Opencart的1.5.3.1
jQuery的1.7.1.min.js
的jQuery-UI-1.8.16.custom.min.js
的Internet Explorer 9
PHP 5.2.9

這是要求功能:

function addToCart(product_id, quantity, option_id, option_value) { 
     quantity = typeof(quantity) != 'undefined' ? quantity : 1; 
     option_value = typeof(option_value) != 'undefined' ? option_value : 0; 
     option_id = typeof(option_id) != 'undefined' ? option_id : 0; 
     jQuery.ajax({ 
      url: 'index.php?route=checkout/cart/add', 
      type: 'post', 
      cache: false, 
      data: 'product_id=' + product_id + '&quantity=' + quantity + '&option_id=' + option_id + '&option_value=' + option_value+'&rnd=' + Math.random(), 
      dataType: 'json', 
      success: function(jsonObj) { 
       $('.success, .warning, .attention, .information, .error').remove(); 

       if (jsonObj['redirect']) { 
        location = jsonObj['redirect']; 
       } 

       if (jsonObj['success']) { 
        $('#notification').html('<div class="success" style="display: none;">' + jsonObj['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>'); 

        $('.success').fadeIn('slow'); 

        $('#cart-total').html(jsonObj['total']); 

        $('html, body').animate({ scrollTop: 0 }, 'slow'); 
       } 
      } 
     }); 
    } 

的PHP函數返回:

{"success":"Added to cart!","total":"1 product(s) - 52,48\u043b\u0432."} 

這一切都適用於Chrome,FF等罰款,但在IE瀏覽器失敗。

其實IE不會觸發「成功」事件。
我可以得到響應的唯一方法是通過錯誤處理程序。
然後JSON對象具有狀態= 200和狀態文本= OK

這在鉻燒製成功事件後JSON對象:

jsonObj: Object 
success: "Added to cart!" 
total: "1 product(s) - 52.48лв." 
__proto__: Object 

從中「成功」和「總」值是用過的。

這是後錯誤事件是在Internet Explorer處理的JSON對象:
Internet Explorer 9 developer tools screenshot

這個responseText是一個包含當前頁面的HTML源的字符串。我試過jQuery.ajaxSetup({cache: false});,但結果是一樣的。

有沒有人有這個問題?還是有任何提示?
我沒有更多的想法。

回答

2

嘗試使用絕對URL爲url: 'index.php?route=checkout/cart/add'

的問題是你respons是HTML或XML(我看到了開始標記的XML頁面,然後換行隨後(舊的空間(namespace標籤))的HTML開始標記)。

jQuery預計json。所以這是一個解析錯誤,導致了預期成功的錯誤回調。

確保後端發送正確的信息,並確保被叫頁面正確。您可以使用網絡選項卡捕捉來電以找到問題。

+0

謝謝你。事實證明,由於URL重寫,相對路徑指向一個不存在的位置。切換到絕對url解決了問題。 – nnikolov06

+0

很高興我可以幫忙;) – VDP

2

我已經得到這對所有我的MODS的工作方式是使用

$('base').attr('href') 

的代碼,所以你的代碼中的AJAX會(小exerpt)

option_value = typeof(option_value) != 'undefined' ? option_value : 0; 
    option_id = typeof(option_id) != 'undefined' ? option_id : 0; 
    var base = jQuery('base').attr('href'); 
    jQuery.ajax({ 
     url: base + 'index.php?route=checkout/cart/add', 
     type: 'post', 

這樣做的好處是始終是完整的URL,並且無論您使用HTTP還是HTTPS都可以正常工作

+0

這是一個很酷的解決方法。真的比在衆多文件中硬編碼的URL更好。沒有考慮在JavaScript中處理網址。尼斯。 – nnikolov06

+0

當然,將基礎放在一個變量中是個好主意,但'jQuery('base')'似乎爲我返回一個空數組......'window.location.origin'然而對我來說確實有效。這是我的測試[小提琴](http://jsfiddle.net/rhDKW/) – VDP

+0

@VDP - 大多數(如果不是所有的OC商店主題)都設置了BASE網址,所以我懷疑這就是你的代碼不能正常工作的原因 –

0

我不喜歡在Jay Gilford提供的每個負載上執行不必要的內容。用這個代替:

if ($.browser.msie) { 
    $.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
     options.url = $('base').attr('href') + options.url; 
    }); 
} 
相關問題