2

私は現在、さまざまな製品を評価する必要がある e コマース ショッピング サイトで作業しています。星評価スクリプトを使用しています。

すべて正常に機能していますが、製品は訪問者の IP に従って 1 回だけ評価する必要があります。また、訪問者が (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)onloadイベント ( body タグを見てください) で呼び出され、データベースからTemp1.php取得する Ajax リクエストを実際に呼び出し、rating_num名前付きの非表示フィールドに格納しrating_valueますTemp.phpalert(rating);

の値がデータベースrating_numで変更されたときの実際の問題はここにあります。

理由は何ですか?この問題の解決策はありますか? 私の言いたいことを理解していただけると幸いです。

4

1 に答える 1

6

Internet Explorer は、キャッシュを使って面白いことをすることがあります。他のブラウザよりもキャッシュに対してより強力なアプローチを取る傾向があります。通常、同じリソースに 2 回、3 回、またはそれ以上アクセスする場合、キャッシュは非常に役立ちます。静的コンテンツの場合、ブラウザが既に取得したデータを要求しないように十分に賢くする必要があります。これにより、時間と帯域幅が節約されます。

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

ただし、AJAX リクエストに関しては、IE の強力なキャッシュが問題になります。ブラウザは、AJAX リクエストを静的で変化のない画像に対するリクエストと同じように処理し、何も変更されていないかのように、そのリクエストの以前の結果をキャッシュから取得します。

もちろん、これは Internet Explorer で実行したいことではありません。したがって、IE に新しいデータを強制的に取得させるために使用できる最も迅速で簡単な手法は、毎回 URL をわずかに変更することです。

幸運なことに、時間は常に前進するものであり、その性質上、唯一無二であることが保証されています。この問題を回避する方法は次のとおりです。

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

クエリ文字列の末尾にエポック タイムを追加することで、URL が常に一意になるようにし、ブラウザーが常にサーバーから新しいコンテンツを取得できるようにします。

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

于 2012-05-06T07:15:48.147 に答える