【问题标题】:Ajax doesn't work properly with Internet ExplorerAjax 不能与 Internet Explorer 一起正常工作
【发布时间】:2012-05-06 06:52:47
【问题描述】:

我目前正在与需要对不同产品进行评级的电子商务购物网站合作。我正在使用星级评分脚本。

一切正常,但是根据访问者的 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事件上被调用(查看body标签),它实际上调用了对Temp1.php的Ajax请求,从数据库中检索rating_num并简单地存储到一个名为@987654327的隐藏字段中@ 最终在 Temp.php 文件上使用 alert(rating); 发出警报

真正的问题是当rating_num 的值在数据库中发生变化时,Firefox 显示更新后的值,这是必不可少的,但 Internet Explorer (8) 仍然显示旧值,即使页面被刷新并一次又一次地重新加载。

应该是什么原因?这个问题有什么解决办法吗?希望你能明白我的意思。

【问题讨论】:

    标签: php javascript ajax


    【解决方案1】:

    Internet Explorer 有时会通过缓存做一些有趣的事情。与其他浏览器相比,它倾向于采用更强烈的缓存方法。当我们通常访问同一个资源两次、三次或更多次时,缓存是一件很棒的事情。在静态内容的情况下,我们实际上希望浏览器足够智能,不会请求它已经检索到的数据,因为这样可以节省时间和带宽。

    但是,AJAX 请求的不同之处在于它们通常是动态的。在某一时刻提出的相同请求当然可能在另一时刻产生完全不同的结果。因此,我们通常不希望缓存 AJAX 请求。

    但是,当涉及到 AJAX 请求时,IE 的密集缓存成为一个问题。浏览器将 AJAX 请求视为对静态、不变图像的请求,并从缓存中提取该请求的先前结果,就好像没有任何变化一样。

    这当然不是您希望 Internet Explorer 做的事情。因此,您可以用来强制 IE 拉取新数据的最快和最简单的技术是每次对 URL 进行轻微修改。

    对我们来说幸运的是,时间是不断前进的东西,就其本质而言,它保证是独一无二的。以下是避免此问题的方法:

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

    通过将纪元时间附加到查询字符串的末尾,我们确保 URL 始终是唯一的,从而确保浏览器始终从服务器获取新鲜内容。

    我在所有的 AJAX 请求中都使用了这种技术,并且发现它非常有价值。

    【讨论】:

    • 多么好的解决方案!我本可以给 +1000,但很不幸,我只有 +1。
    • 我很高兴能够提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2018-11-10
    • 2014-07-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多