Проблема AJAX с IE9 (и другими версиями IE) - PullRequest
1 голос
/ 25 апреля 2011

У меня проблема с объектом XMLHttpRequest в IE9, IE8 и, вероятно, IE7, хотя еще не проверял в IE7.Это работает без проблем в FF4, Opera 11.01 и Chrome 10. Сначала я хотел бы объяснить, для чего я использую этот код.У меня есть HTML-тег выбора, с опцией Time, определенной в нем.Затем, когда пользователь нажимает кнопку, он динамически обновляет выбранные значения времени из базы данных.Теперь вот код для создания объекта XMLHttpRequest:

var xmlhttp = false;
if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                xmlhttp = false;
            }
        }
    }

Как видите, если создание объекта XMLHttpRequest завершается неудачно, он пытается создать ActiveXObject.

Теперь код для отправки запросаи получаю ответ:

xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            document.getElementById(time).innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET", "getTime.php?d=" + str, true);
      xmlhttp.send();

Я отправляю параметры в getTime.php, и ответ записывается обратно, чтобы выбрать тег с id = время.Теперь в IE9 и IE8 он не хочет заполнять тег select временем из БД.

РЕДАКТИРОВАТЬ: я добавлю код из getTime.php:

<?php
$username="something";
$password="";
$database="somethingDB";

$date = $_GET["d"];
$timestamp = strtotime($date);
$nextDay= $timestamp + (1 * 24 * 60 * 60);// 7 days; 24 hours; 60 mins; 60secs
$date2 =  date('Y/n/j', $nextDay);


$link = mysql_connect('localhost', $username, $password);
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db($database, $link);
$query="SELECT TIME(Date) FROM someTable WHERE Date >= '" .$date. "' AND Date < '" .$date2. "'";
$result=mysql_query($query);
if (!$result) {
    die('Could not query:' . mysql_error());
}
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    echo "<option>" .$row[0]."</option>";
}

mysql_free_result($result);

mysql_close($link);
?>

EDIT2: Хорошо, ядобавили обертку, согласно это .Теперь я также опубликую тег выбора кода, который теперь обернут:

<div id="wrap">
        <select id="Time1" name="Time1" disabled="disabled">
            <?php if (empty($_GET['Time1'])) { echo "<option>Ura</option>"; } else { echo '<option>' . $_GET['Time1'] . '<option>'; } ?>
        </select>
    </div>

Код в getTime.php теперь также изменен, я опубликую только тот раздел, который был изменен:

echo '<select id="Time1" name="Time1">';
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    echo "<option>" .$row[0]."</option>";
}
echo '</select>';

Как видите, я только добавил эхо '....' до и после проверки.Угадай, что происходит сейчас.В FF, Opera и Chrome он работает без проблем, но в IE9 он теперь получает значения, но не помещает их в выпадающее меню, он просто печатает их как фактический текст.Также раскрывающееся меню исчезает, когда значения печатаются как текст.Похоже, он не хочет включать тег выбора.Я не понимаю, почему это только с IE?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

В IE есть проблема с тегом select. Вы не можете просто заменить теги «option» только внутри, вы также должны заменить открывающий и закрывающий теги «select».

0 голосов
/ 26 апреля 2011

Я нашел правильное решение здесь .У меня уже был тег select в поле div, отсутствующим кодом была эта часть:

document.getElementById('box').style.display = 'block';

Очевидно, что без этого IE будет просто печатать его как фактический текст вместо заполнения объекта select.

...