2012-05-06 26 views
2

現在、さまざまな製品の評価が必要な電子商取引ショッピングサイトで作業しています。私は星評価スクリプトを使用しています。AjaxがInternet Explorerで正しく動作しない

すべてはうまくいっていますが、製品は訪問者のIPに従って一度だけ評価され、訪問者が(5つの星の中の)星をクリックすると、すべての星が無効になり、同じ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)Temp1.phpへのAjaxリクエストを実際に呼び出すonloadイベントで呼び出され(ボディタグを参照)、データベースからrating_numを取得し、Temp.phpファイルで最終的に警告されるrating_valueという名前の隠しフィールドに格納します。 rating_numの値がデータベースに変更されたときalert(rating);

実際の質問はここにある、Firefoxは不可欠ですが、ページが更新されるとリロードにもかかわらず、インターネットエクスプローラ(8)はまだ古い値を表示する更新された値を表示しました何回も何回も。

どのような理由がありますか?この問題の解決策はありますか?あなたが私の言いたいことを理解できることを願っています。

答えて

6

Internet Explorerは時々キャッシュを使って面白いことをします。それは他のブラウザよりもはるかに強力なキャッシングアプローチをとる傾向があります。通常、同じリソースに2回、3回、またはそれ以上アクセスすると、キャッシュは素晴らしいことです。静的コンテンツの場合、実際にはブラウザーが既にスマートになっていて、既に検索したデータを要求しないようにします。これにより、時間と帯域が節約されます。

ただし、AJAXリクエストは一般に動的である点で異なります。 1つの瞬間に行われた同じ要求は、もちろん、別の瞬間に全く異なる結果をもたらすことがあります。その結果、通常はAJAXリクエストをキャッシュしたくありません。

しかし、AJAXリクエストではIEのキャッシュが問題になります。ブラウザはAJAXリクエストを静的で不変なイメージのリクエストと同様に扱い、そのリクエストの以前の結果を何も変更されていないかのようにキャッシュから取り出します。

これはもちろん、Internet Explorerで行うことではありません。したがって、IEに新鮮なデータを引き込ませるために使用できる最速で簡単な手法は、毎回URLをわずかに変更することです。

私たちのために幸運なことに、時間は絶えず前進しているものであり、その本性によって、ユニークであることが保証されています。ここでは、この問題を回避する方法です。

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

クエリ文字列の末尾にエポックタイムを付加することにより、我々は、ブラウザは常にサーバからの新鮮なコンテンツをつかむことを保証し、URLが常に一意であることを保証。

私はすべてのAJAXリクエストに対してこの手法を使用しており、非常に価値があると判断しました。

+1

解決方法私は+1000を与えることができたが、残念なことに、私は+1しか持っていない。 – Bhavesh

+1

私は手伝ってくれてうれしいです。 – jmort253

関連する問題