Ajax没有在IE上工作

时间:2014-02-24 08:10:50

标签: javascript html ajax

有这个网站 - > http://www.secureshop.gr/POOL/acrosshotels/website/ 如果您在左侧边栏上查看“侧面有一个酒店”侧边栏,从下拉菜单中选择位置时,酒店菜单会更改选项。这适用于ajax。问题是它不适用于所有版本的IE。当您选择目的地时,酒店下拉菜单为空/空白。 javascript代码是这样的。非常简单,可以点击目的地选项

<script type="text/javascript">

    function selecthotel(str)   {
    if (window.XMLHttpRequest)  {

      xmlhttp=new XMLHttpRequest();

    }else  {

      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    }

    xmlhttp.onreadystatechange=function()  {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)    {

        document.getElementById("hotelselection").innerHTML=xmlhttp.responseText;

      }
    }

    if(str == 0) {
        str = 0;
    }
    xmlhttp.open("GET","includes/ajaxlocationsearch.php?location="+str+"&language=<?php echo $language; ?>",true);
    xmlhttp.send();

    }

</script>

ajax文件是这个

$language = $_GET["language"]; 
  $location = $_GET['location'];

if($location == "0") {

    $result = mysql_query("Select * from eshop_articles where
category='/WEBSITE/SEARCHENGINE/HOTELS' order by
appearance",$link_id);  

}else {

    $result = mysql_query("Select * from eshop_articles where
category='/WEBSITE/SEARCHENGINE/HOTELS' and
short_description='$location' order by appearance",$link_id);   

} ?>

<option value="0"><?php $a = $language."_choose_hotel"; echo ${$a};
?></option>

<?php while($row = mysql_fetch_assoc($result)) {    ?>

    <option value="<?php echo $row['appearance']; ?>"><?php echo
$row['title']; ?></option>

<?php } ?>

提前谢谢你:)

3 个答案:

答案 0 :(得分:1)

Ajax请求缓存在Internet Explorer中。尝试删除缓存,然后将随机参数添加到request-URL:

var url = "http://example.com/ajax.php?random="+new Date().getTime();

答案 1 :(得分:1)

你不应该重新发明轮子,已经有一些成熟的跨浏览器解决方案。

你应该尝试使用jQuery库,它是ajax方法。

https://api.jquery.com/jQuery.ajax/

如果您不想使用库,您可以找到问题的一些解决方案,它涉及为IE创建不同类型的对象:

http://www.quirksmode.org/js/xmlhttp.html

Internet Explorer会缓存很多内容,因此您可能需要强制它获取新数据而不是从缓存中获取数据。您可以添加一个GET参数,其中包含客户端生成的时间戳到您指向的URL。

在jQuery中你可以这样做:

jQuery.ajax({
    type: "GET",
    url: "http://example.com/",
    cache: false,
    success: function (data) {
       // do something here
    }
});

如果没有jQuery,您需要手动将其添加到url:

var url = "http://example.com" + "?_=" + (newDate()).getTime();

答案 2 :(得分:1)

我做了一些测试,我发现你的代码在结构方面存在一些问题。您应该始终正确格式化代码,以便更快地找到错误和问题。我格式化了代码,发现了嵌套和查询的一些问题。

我还想警告你,你有一个非常严重的SQL注入问题,我在这段代码中使用预处理语句和一个额外的preg_replace来修复查询和表中的所有不需要的字符。一般。你应该完全去学习一些防止SQL注入的知识。这里有很多专门讨论这个主题的主题,我给你写了这些文章的清单:

这是我格式化和修复的代码。我通过不使用参数,空参数,数据库中不存在的值以及数据库中存在的值来测试它。每个都相应地返回值:三个第一个返回null,而真实查询返回true;在这种情况下,如果找不到,则返回“No hotels available”,如果找到则返回这些酒店的列表。如果数据库查询失败,它将默认返回null,然后返回“找不到酒店”。

我很抱歉稍微改变代码布局,随意编辑它,这取决于你。我强烈建议使用正确的格式(可能是因为你的代码编辑器也是如此)。

<强>的index.php

<?php
    $language = "en";
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Hotel Selection</title>
    </head>
    <body>
        <select id="hotelselection">
            <option value="null">No hotels available</option>
        </select>

        <script>
            function selecthotel(str) {
                if (window.XMLHttpRequest) {
                    xmlhttp = new XMLHttpRequest();
                }else{
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }

                xmlhttp.onreadystatechange = function(){
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                        document.getElementById("hotelselection").innerHTML = xmlhttp.responseText;
                    }
                }

                if (typeof(str) == "undefined" || str == null) {
                    str = "";
                }

                xmlhttp.open("GET", "run.php?location=" + str + "&language=<?php echo($language); ?>", true);
                xmlhttp.send();
            }

            selecthotel();
        </script>
    </body>
</html>

<强> run.php

<?php
    $phrases = array(
        "en_error_db" => "No hotels available...",
        "en_choose_hotel" => "Choose a hotel..."
    );

    $link_id = mysqli_connect("localhost", "", "", "");

    if (mysqli_connect_errno($link_id)) {
        die("Error occurred when attempting to connect to database (" . mysqli_connect_errno() . ": " . mysqli_connect_error() . ").");
        error_log("Error occurred when attempting to connect to database (" . mysqli_connect_errno() . ": " . mysqli_connect_error() . ").");
        exit(1);
    }

    $language_raw = isset($_GET["language"]) ? $_GET["language"] : "en"; 
    $location_raw = isset($_GET['location']) ? $_GET["location"] : "";

    $language = preg_replace("/[^\w.-]/", "", $language_raw);
    $location = preg_replace("/[^\w.-]/", "", $location_raw);

    if (empty($location)) {
        $query = "SELECT * FROM `eshop_articles` WHERE `category` = '/WEBSITE/SEARCHENGINE/HOTELS' ORDER BY `appearance` ASC";
    }else{
        $query = "SELECT * FROM `eshop_articles` WHERE `category` = '/WEBSITE/SEARCHENGINE/HOTELS' AND `short_description` = ? ORDER BY `appearance` ASC";
    }

    if ($stmt = mysqli_prepare($link_id, $query)) {
        if (!empty($location)) {
            mysqli_stmt_bind_param($stmt, "s", $location);
        }

        mysqli_stmt_execute($stmt);

    // Thanks to Bruce Martin on php.net for the SELECT * via _fetch (http://www.php.net/manual/en/mysqli-stmt.fetch.php#107034)
        $metaResults = mysqli_stmt_result_metadata($stmt);
        $fields = mysqli_fetch_fields($metaResults);
        $statementParams = "";

        foreach ($fields as $field) {
            $statementParams .= (empty($statementParams) ? "\$column['" . $field->name . "']" : ", \$column['" . $field->name . "']");
        }

        $statment = "\$stmt->bind_result($statementParams);";
        eval($statment);
        print('<option value="0">' . $phrases[(isset($phrases[$language . "_choose_hotel"]) ? $language : "en") . "_choose_hotel"] . '</option>');

        while (mysqli_stmt_fetch($stmt)) {
            print('<option value="' . $column['appearance'] . '">' . $column['title'] . '</option>');
        }

        exit(1);
    }else{
        print('<option value="0">' . $phrases[(isset($phrases[$language . "_choose_hotel"]) ? $language : "en") . "_error_db"] . '</option>');
        error_log("The script was unable to prepare a MySQLi statement (" . $query . ").");
        exit(1);
    }
?>

我切换到MySQLi数据库扩展名而不是deprecated MySQL extension。它不应该再通过PHP错误日志返回PHP错误。如果可能,我强烈建议您切换到MySQL PDO。在我看来,它非常简单,容易并且效果更好!

另外,关于XMLHttpRequest / ActiveXObject用法的说明:如果您希望能够支持IE 5,请为此创建一个类并在客户端使用该浏览器时加载脚本,否则使用jQuery Ajax,这非常容易使用,您不必担心查询字符串等。将ActiveXObject脚本放在那里的原因是因为IE 5不支持jQuery,尽管存在已知的安全问题,但它仍然是常见的浏览器。旧计算机,一些银行,办公室和其他没有查看安全细节的企业使用IE 5。

希望这有助于你。