2012-05-06 84 views
2

我目前正在使用電子商務購物網站,其中需要對不同產品進行評分。我正在使用星級評分腳本。Ajax無法在Internet Explorer中正常工作

一切工作正常,但根據訪問者的IP,產品應僅評分一次,一旦訪問者點擊一顆星星(五顆星之一),應禁用所有星星,以便同一產品的重複評級與可以防止相同的IP(我也使用服務端驗證),根據來自數據庫的新值的平均評分應由相同的星號(剛剛被禁用)指示。

它在Firefox上工作,沒有任何問題。當訪問者點擊星號時,會向數據庫傳遞一個新值(使用Ajax),並根據新值計算並顯示平均評級,但Internet Explorer無法使用Ajax從數據庫檢索新值。

我只是用非常簡單的代碼演示了這個問題,如下所示。

以下是Temp.php文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 

<script type="text/javascript" language="javascript"> 
    var xmlhttp;   
    function ajax() 
    { 
     if(window.XMLHttpRequest) 
     { 
      xmlhttp=new XMLHttpRequest(); 
     } 
     else 
     { 
      xmlhttp = new ActivexObject("Microsoft.XMLHTTP"); 
     } 
    } 

    function loadStars(prod_id) 
    { 
     ajax(); 

     xmlhttp.onreadystatechange=function() 
     {   
      if(xmlhttp.readyState==4 && xmlhttp.status==200) 
      {        
       document.getElementById("ajax_response").innerHTML=xmlhttp.responseText; 
       var rating= document.getElementById("rating_value").value;    
       alert(rating); //Rating value of hidden field from the ajax response is alered.    
      } 
     } 

     var queryString="Temp1.php?prod_id="+prod_id; 
     xmlhttp.open("GET", queryString, true); 
     xmlhttp.send();    
    } 
</script> 
</head> 

<body onload="loadStars(11);"> 
    <span id="ajax_response"></span> 
</body> 
</html> 

和下面是Temp1.php


<?php 
    include_once("../Connection.php"); 
    $con=new Connection(); 
    $con->get_connection(); 

    if(isset($_GET['prod_id'])) 
    {   
     $result=mysql_query("select rating_num from rating where prod_id=".$_GET['prod_id'].""); 
     $rating=mysql_result($result, 'rating_num');   
     echo "<input type='hidden' id='rating_value' name='rating_value' value='$rating'/>";                  
    } 
?> 

在這兩個文件中的代碼有沒有關係。 JS的功能loadStars(prod_id)是呼籲onload事件(看身體標記),它實際調用Ajax請求,從數據庫中檢索rating_num和簡單存儲到一個名爲rating_value一個隱藏字段這是使用在Temp.php文件終於驚動了Temp1.phpalert(rating);

實際的問題是,在這裏當rating_num值在數據庫改變,火狐顯示更新的值,它是必不可少的,但的Internet Explorer(8)仍顯示舊值,即使頁面刷新和重新加載一次又一次。

應該是什麼原因?有沒有解決這個問題的方法?希望你能明白我的意思。

回答

6

Internet Explorer有時候會使用緩存來做一些有趣的事情。它傾向於採用比其他瀏覽器更加激烈的緩存方法。當我們正常訪問相同的資源兩次,三次或更多時,緩存是一件好事。在靜態內容的情況下,我們實際上希望瀏覽器足夠聰明,不要請求已經檢索的數據,因爲這樣可以節省時間和帶寬。

但是,AJAX請求是不同的,因爲它們通常是動態的。同一時間發出的同一請求當然可能在另一時刻產生完全不同的結果。因此,我們通常不想緩存AJAX請求。

但是,當涉及到AJAX請求時,IE的強烈緩存成爲一個問題。瀏覽器像處理靜態,不變圖像的請求一樣處理AJAX請求,並將該請求的先前結果從其緩存中提取出來,就像沒有任何更改一樣。

這當然不是您希望Internet Explorer執行的操作。因此,您可以用來強制IE獲取最新數據的最快最簡單的技術是每次對URL進行一些修改。

對我們來說幸運的是,時間是不斷前進的東西,而且就其性質而言,保證是唯一的。這裏是你如何避免這個問題:

var queryString="Temp1.php?prod_id="+prod_id + "&t=" + new Date().getTime(); 

通過追加出現時間查詢字符串的結尾,我們確保網址永遠是獨一無二的,確保瀏覽器總是從服務器抓取新鮮內容。

我在我所有的AJAX請求中使用這種技術,並發現它非常有價值。

+1

什麼是解決方案!我可以給+1000,但非常不幸,我只有+1。 – Bhavesh

+1

我很高興能夠提供幫助。 – jmort253

相關問題