Почему этот вызов jQuery Ajax терпит неудачу ТОЛЬКО в IE9 (даже отлично работает в IE8 и IE7)

У меня есть сайт, на котором я делаю вызов ajax следующим образом:

            // perform an ajax request to generate a new subscriber account
            jQuery.ajax({
                type: 'POST',
                url: '/index.php?option=com_content&view=article&id=45&tmpl=component',
                data: postVars,
                success: handleResponse,
                error: function(jqXHR, textStatus, errorThrown) {
                    alert ('response: ' + jqXHR.responseText);
                    alert ('code: ' + jqXHR.getResponseHeader('X-Subscriber-Status'));
                }
            });

Запрошенная страница не делает ничего, кроме возврата кода состояния с одной цифрой, и она отлично работает с каждым браузером, за исключением IE9. script размещен в том же домене, что и запрашиваемая страница, поэтому не должно быть проблем с междоменным скриптом.

Наконец-то я выяснил, что происходит, но я не знаю, как это исправить. Оказывается, что запрос Ajax успешно завершается без проблем. Я проверил это, используя Fiddler, чтобы посмотреть сетевой трафик. Сервер отвечает на запрос кодом HTTP-статуса 200, а тело не содержит ничего, кроме кода ответа с одной цифрой. На этом этапе jQuery выполняет обработчик ошибок, а не обработчик успеха, как и ожидалось (в IE9). Почему это так и как я могу предотвратить это? Это ТОЛЬКО происходит в IE9. Даже IE8 и IE7 работают отлично с одним и тем же кодом! Как вы можете видеть, я, наконец, прибегнул к обнаружению IE9 и с помощью объекта XmlHttpRequest, чтобы сделать это (что прекрасно работает, кстати).

Это похоже на ошибку jQuery, но я не могу найти упоминания об этом в моих поисках. Я действительно единственный, кто испытывает это странное поведение?

Ответ 1

Ну, наконец, я выяснил проблему. Оказывается, по какой-то причине jQuery/IE не правильно urlencode двойные кавычки. URL-адрес запроса:

/search.json?callback=jQuery16105234487927080267_1313510362362&q=stocks ИЛИ "фондовый рынок" -blueprint -empireavenue.com -learn & _ = 1313510362469

В каждом другом браузере к тому времени, когда jQuery выполнил запрос ajax, он выглядел так:

/search.json?callback=jQuery16105234487927080267_1313510362362&q=stocks%20OR%20%22stock%20market%22%20-blueprint%20-empireavenue.com%20-learn& _ = 1313510362469

но по какой-либо причине во всех версиях IE это выглядело следующим образом:

/search.json?callback=jQuery16105234487927080267_1313510362362&q=stocks%20OR%20 "запас %20market" %20-план %20-empireavenue.com %20-узнать & _ = 1313510362469

что заставило сервер не возвращать данные.

Ответ 2

Вы уверены, что URL-адрес, который вы вызываете (/index.php?option=com_content&view=article&id=45&tmpl=component), работает в IE9? Если вы загружаете эту страницу PHP в IE9, возвращает ли она ожидаемый результат? Он должен это сделать, но стоит проверить, что ошибка находится в вызове jQuery, а не в PHP.

Кроме того, вызов POST обычно относится к такой странице, как index.php, с строкой запроса (option=com_content, view=article и т.д.), отправленной как переменная postVars.

Попробуйте использовать следующее:

$.ajax({
    type: "POST",
    url: "index.php",
    data: {
        option : com_content,
        view : article,
        id : 45,
        tmpl : component
    },
    success: function(msg){
        console.log(msg);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus)
    }
});

Сбросьте функцию на ее основные части, и вы сможете увидеть, откуда исходит ошибка.