Проблема AJAX с IE9 (и другими версиями IE)

У меня проблема с объектом 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, и ответ записывается обратно в тег select с id=time. Теперь в 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);
?>

РЕДАКТИРОВАТЬ 2: Хорошо, я добавил обертку, согласно этому. Теперь я также опубликую тег выбора кода, который теперь обернут:

<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>';

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


person Jernej Jerin    schedule 25.04.2011    source источник
comment
Вы проверили, что getTime.php? передает значение, которое не является неопределенным?   -  person clamchoda    schedule 25.04.2011
comment
Да, я забыл написать, что он действительно, вероятно, что-то возвращает, но он просто пустой. Итак, где до того, как пользователь нажал кнопку «Отправить», под тегом выбора было время, теперь есть просто пустой тег выбора. Но это не могло быть что-то не так с getTime.php, потому что тогда он не работал бы и в FF, и в Opera, и в Chrome.   -  person Jernej Jerin    schedule 25.04.2011
comment
Да, но есть такие элементы, как innerHTML, которые поддерживаются не всеми версиями/сценариями IE.   -  person clamchoda    schedule 25.04.2011
comment
Я добавил getTime.php в первый пост. Если innerHTML не поддерживается, что я могу использовать?   -  person Jernej Jerin    schedule 25.04.2011
comment
Спасибо, я не думаю, что это ваша проблема, если вы сказали, что это работает в Firefox. Когда вы получаете элемент по времени id, это переменная? Если нет, то это должно быть в кавычках. Является ли элемент с идентификатором, содержащимся во времени, текстовым полем?   -  person clamchoda    schedule 25.04.2011
comment
Да, это переменная, если вы имеете в виду время в скобках: document.getElementById(time).innerHTML. Ни один элемент не является тегом выбора. Тем временем я поискал еще и нашел это: support.microsoft.com/kb/276228, возможно ли, что эта ошибка все еще присутствует в IE9?   -  person Jernej Jerin    schedule 25.04.2011
comment
Если он отлично работает без innerHTML, то я бы сказал, что это действительно ваша проблема, мой друг :) Как я имею в виду, если вы просто измените его на alert(Response); заводится без проблем?   -  person clamchoda    schedule 25.04.2011
comment
Я обновил свой первый пост. Не могли бы вы прочитать после EDIT2. Спасибо!   -  person Jernej Jerin    schedule 25.04.2011
comment
Я ВСЕГДА предлагаю использовать сторонний JS-плагин для AJAX (например, jQuery). Это улучшает кроссбраузерность, а также сокращает объем кода как минимум в 10 раз. (api.jquery.com/jQuery.ajax)   -  person Dutchie432    schedule 25.04.2011
comment
Похоже, это вообще не имеет ничего общего с XHR, и все, что связано с использованием innerHtml для объекта SELECT. Возможно, вы захотите скорректировать свой вопрос и создать максимально простую реплику.   -  person EricLaw    schedule 26.04.2011


Ответы (2)


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

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

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

person Jernej Jerin    schedule 26.04.2011

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

person jondinham    schedule 01.11.2011