Подтвердить что ты не робот

Почему IE 10 отказывается отправлять данные POST через jQuery $.ajax

В моей среде разработки и производства IE 10 отказывается отправлять любые данные POST с помощью простого вызова $.ajax.

Мой script выглядит следующим образом:

d = 'testvar=something';
$.ajax({
    data: d,
    success: function(h){
        console.log(h);
    }
});

Выполняется фактический запрос ajax, но нет данных post

Заголовки запросов выглядят нормально:

Request POST /steps/~do HTTP/1.1
Accept  */*
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/steps/
Accept-Language en-GB,en-AU;q=0.7,en;q=0.3
Accept-Encoding gzip, deflate
User-Agent  Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host    localhost:8080
Content-Length  0
DNT 1
Connection  Keep-Alive
Cache-Control   no-cache

Но тело запроса пусто! (Я использую вкладку сети IE в своей панели F12 dev для захвата запросов). В PHP script, print_r($_POST); возвращает пустой массив.

Это отлично работает в IE 7-9, хром, FF и сафари, но ломается в IE10?

Я не уверен, что я что-то пропустил, или если IE 10 просто глючит?

ИЗМЕНИТЬ

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

$.ajaxSetup({
    url: ROOT+'~do', // ROOT is either http://localhost/.../~do or http(s)://www.steps.org.au/~do depending on production or development environment
    type: 'POST'
});

Дальнейшее редактирование

Использование IE версии 10.0.9200.16384 для Windows 8 Pro 64 бит

Прямая копия/вставка заголовков запроса:

Key Value
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-GB,en-AU;q=0.7,en;q=0.3
Cache-Control   no-cache
Connection  Keep-Alive
Content-Length  0
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Cookie  __utma=91949528.1947702769.1348201656.1353212510.1353237955.6; __utmz=91949528.1348201656.1.1.utmcsr=localhost|utmccn=(referral)|utmcmd=referral|utmcct=/coconutoil.org.au/; __utmb=91949528.2.10.1353237955; __utmc=91949528; cartID=8b3b2b9187cfb1aeabd071d6ec86bbbb; PHPSESSID=bl57l7fp0h37au7g0em7i3uv13
DNT 1
Host    www.steps.org.au
Referer https://www.steps.org.au/
Request POST /~do HTTP/1.1
User-Agent  Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
X-Requested-With    XMLHttpRequest

Тело запроса является emtpy.

Заголовки откликов:

Key Value
Response    HTTP/1.1 200 OK
Server  nginx/0.7.65
Date    Sun, 18 Nov 2012 11:23:35 GMT
Content-Type    text/html
Transfer-Encoding   chunked
Connection  close
X-Powered-By    PHP/5.3.5-1ubuntu7.2ppa1~lucid
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma  no-cache

Инициатор

Property    Value
Stage   Document Processing
Element XMLHttpRequest
Action  Processing
Document ID 0
Frame ID    0
Frame URL   https://www.steps.org.au/Shop/Health-Products/

Страница, которая реплицирует проблему (на самом деле весь сайт):

Шаги к жизни, продукты для здоровья

4b9b3361

Ответ 1

Edited

Тем не менее для Microsoft нет исправления, кроме использования

<meta http-equiv="x-ua-compatible" content="IE=9" >

добавив выше метатег, IE10 будет запускать ваш javascript в IE9 совместимый режим.

Старый ответ.

Я отправляю образец кода для теста, который я сделал, и вы также можете использовать тот же код для своего кода.

<html>
<head runat="server">
    <script src="../Scripts/jquery-1.8.3.js"></script>
<script type="text/javascript">
    var xmlHttp = null;
    var XMLHTTPREQUEST_MS_PROGIDS = new Array(
      "Msxml2.XMLHTTP.7.0",
      "Msxml2.XMLHTTP.6.0",
      "Msxml2.XMLHTTP.5.0",
      "Msxml2.XMLHTTP.4.0",
      "MSXML2.XMLHTTP.3.0",
      "MSXML2.XMLHTTP",
      "Microsoft.XMLHTTP"
    );

    function makePOSTRequest(url, parameters) {

        if (window.XMLHttpRequest != null) {
            //xmlHttp = new window.XMLHttpRequest();
            xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
        } else if (window.ActiveXObject != null) {
            // Must be IE, find the right ActiveXObject.
            var success = false;
            for (var i = 0; i < XMLHTTPREQUEST_MS_PROGIDS.length && !success; i++) {
                alert(XMLHTTPREQUEST_MS_PROGIDS[i])
                try {
                    xmlHttp = new ActiveXObject(XMLHTTPREQUEST_MS_PROGIDS[i]);
                    success = true;
                } catch (ex) { }
            }
        } else {
            alert("Your browser does not support AJAX.");
            return xmlHttp;
        }
        xmlHttp.onreadystatechange = alertContents;
        xmlHttp.open('POST', url, true);
        xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
        //xmlHttp.setRequestHeader('Content-type', 'application/json;');
        xmlHttp.setRequestHeader('Content-Length', parameters.length);
        xmlHttp.setRequestHeader('Accept', 'text/html,application/xhtml+xml')
        //xmlHttp.setRequestHeader('Connection', "close");
        xmlHttp.send(parameters);
    }

    function alertContents() {
        // alert( this.status );
        if (xmlHttp.readyState == 4) {
            //alert( this.responseText );
            if (xmlHttp.status == 200) {
                var result = xmlHttp.responseText;
                //  document.getElementById('result').innerHTML = result;
                //  document.getElementById('submitbutton').disabled = false;
                alert(result);
            } else {
                //alert( this.getAllResponseHeaders() );
                alert("There was a problem with the request.");
            }
        }
    }
</script>
</head>
<body>
<a href="javascript:makePOSTRequest('/api/jobs/GetSearchResult','jtStartIndex=0&jtPageSize=10&jtSorting=jobDescription ASC&jobDescription=')">Click me please</a>
    GetJobDetail

    <br/><br/>
    Url: <input type="text" id="url" value="/api/jobs/GetSearchResult"/><br/>
    parameters: <input type="text" id="parameters" value="jtStartIndex=0&jtPageSize=10&jtSorting=jobDescription ASC&jobDescription="/><br/>
    submit : <input type="button" id="callMethod" value = "call" onclick="javascript: makePOSTRequest($('#url').val(), $('#parameters').val())"/>
</body>
</html>

Ответ 2

У меня такая же проблема. Я думаю, что это ошибка, то есть 10 настольных версий. работает на windows 8 pro 64bit. похоже, что метод xhr.send не передает данные через. он отлично работает во всех других браузерах, т.е. в 10 в режиме метро, ​​или если вы измените стандарт на 9 в режиме рабочего стола.

Ответ 3

Извините, но все мои попытки воспроизвести ваши проблемы были безуспешными. Другими словами, все POST были с телом HTTP, и запросы Ajax работали правильно. Поэтому я не смог воспроизвести описанную вами проблему. Я провел все тесты в Internet Explorer 10, Windows 8 W64 RTM Enterprise со всеми текущими обновлениями Windows.

Если я добавлю какой-нибудь элемент (например, первый) в чат на странице, на которую вы ссылаетесь, я вижу, что POST-запрос будет создан следующий заголовок:

Anforderung       POST /~do HTTP/1.1
Accept            */*
Content-Type      application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With  XMLHttpRequest
Referer           https://www.steps.org.au/
Accept-Language   de-DE,de;q=0.8,ru;q=0.7,en-US;q=0.5,en;q=0.3,ja;q=0.2
Accept-Encoding   gzip, deflate
User-Agent        Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)
Host              www.steps.org.au
Content-Length    81
DNT               1
Connection        Keep-Alive
Cache-Control     no-cache
Cookie            __utmc=91949528; __utma=91949528.365135675.1353268932.1353268932.1353268932.1; __utmb=91949528.1.10.1353268932; __utmz=91949528.1353268932.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=ka4shsgkfvnvfdcath2klh9un0; cartID=4a90a72a379989f597276ca30c79c6f6

Можно видеть, что Content-Length равно 81, а не 0. Тело

i=1211&q=1&token=00f5e9f5768d09ae67f2016ebcb62e99a0d75345&cmd=addToCart&sideBar=1

На запрос будет дан фрагмент HTML, а кнопка станет зеленой.

Чтобы быть точным во время добавления элемента в чат, он будет исполнен другим кодом, который вы отправили в свой вопрос. Он будет исполнен следующий код (строки 49-74) из shop.1352417874.js:

var n;
function inCart(i,t){
    var a = $('#add'+i);
    var q = t?1:$('#qty'+i).val();
    setLoader(a,(t?60:0),0);
    if(!t) a.addClass('loading').html('').attr('href','javascript:;');
    // d = 'i='+i+'&q='+q+'&token='+TOKEN+'&cmd=addToCart&sideBar=1';   
    $.ajax({
        data: {
            i:i,
            q:q,
            token:TOKEN,
            cmd:"addToCart",
            sideBar: 1
        },
        success: function(h){
            $('#sideCartContents').replaceWith(h);
            mkButtons();
            jsEnhance();
            setLoader();
            n=0;
            if(!t) a.removeClass('loading').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('<strong>x'+q+'</strong> <span class="inC">in cart</span>');
            flashCart();
        }
    });
}

Значения локальных переменных i и q в моем тесте были 1211 и 1.

Таким образом, я не вижу ошибок, которые вы описываете. Таким образом, вы должны отлаживать код в своей среде, где он будет воспроизводиться. Во время тестов я бы рекомендовал использовать неиндексированный код jQuery. Вы можете отладить код jQuery.ajax, чтобы локализовать вашу проблему.

Тем не менее, у меня есть несколько дополнительных советов:

  • Прежде всего, вы должны включить обратный вызов error к вызову $.ajax, а не только success обратный вызов.
  • Вам следует просмотреть код JavaScript, который вы используете. В приведенном выше фрагменте кода, например, вы указали переменную global n > , которая будет являться свойством глобального объекта window. Введение таких переменных очень опасно из-за побочных эффектов и конфликтов с другими кодами JavaScript, которые вы указываете на странице. В некоторых других местах вы устанавливаете новые свойства глобального объекта window косвенно. Например, код глобальной функции doErrors, определенный в common.1345011838.js, выглядит следующим образом
function doErrors(e,d){
    e=e.split(',');
    for(i in e){
        $((d?d+' ':'')+'[name="'+e[i]+'"]:visible').addClass('error');
    }
    errors();
}

В приведенном выше коде вы используете переменную i, не определяя ее. Таким образом, вы устанавливаете (или используете) переменную window.i в пути. Ясно, что использование цикла for-in в случае массива не очень хорошо. Можно переписать код с эквивалентным кодом, например for(var i=0,l=e.length; i<l; i++) {...}.

Кроме того, вы начинаете код common.1345011838.js с

var w,r,i,p,t,l,c,z,e,m,b,k,u,s,CPH,TOKEN;
var z = new Array();
var ROOT;

которые определяют многие переменные global с короткими именами. Это очень плохой стиль. Он может следовать за конфликтами с другими модулями, которые вы включили. Как правило, этого достаточно, чтобы определить большинство переменных, которые вам нужны внутри некоторой функции. Вы можете перемещать объявление большинства переменных внутри $(document).ready(function(){/*.HERE.*/});.

Если вам действительно нужно определить некоторые глобальные переменные, вы можете определить тот, который будет похож на пространство имен и все другие переменные, которые вы могли бы определить как свойства единственного глобального объекта. Это стандартная практика. В способе можно уменьшить количество возможных конфликтов между различными модулями, которые вы используете. Например, вы можете использовать что-то вроде

MYGLOBALCHATOBJECT = {
    root: "/",
    z: [],
};

...
// add new property
MYGLOBALCHATOBJECT.TOKEN = "some value";

Вы должны указать, чтобы определить многие функции внутри контекста других функций. В способе можно уменьшить необходимость определения многих глобальных переменных. Только пример. В приведенном выше коде inCart используется переменная n, определенная выше функции inCart. Переменная n будет использоваться только внутри другой глобальной функции flashCart, определенной непосредственно после inCart. Кроме того, функция flashCart будет использоваться только внутри обратного вызова success. Поэтому вы можете переписать код так, чтобы вы определяли как n, так и flashCart внутри обратного вызова success:

...
success: function (h) {
    // define LOCAL variable n
    var n = 0;
    // define LOCAL function which can use outer variable n
    function flashCart(){
        if(n<3) { 
            setTimeout("flashCart()",120);
            n=n+1;
        }
        $('#sideCartBox').toggleClass('highlighted');
    }

    $('#sideCartContents').replaceWith(h);
    mkButtons();
    jsEnhance();
    setLoader();
    if(!t) a.removeClass('loading').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('<strong>x'+q+'</strong> <span class="inC">in cart</span>');
    flashCart(); // we use LOCAL function
}

Я бы порекомендовал вам дополнительно протестировать ваш код в JSHint или JSLint.

Ответ 4

Я также столкнулся с одной и той же проблемой. Ниже меня сработали изменения.

<meta http-equiv="x-ua-compatible" content="IE=9" >

Работал для меня:)

Ответ 5

Опираясь на эту же проблему, я не смог ее решить, установив <meta http-equiv="x-ua-compatible" content="IE=9">, но, тем не менее, это принудительно, установив заголовок ответа X-UA-Compatible на IE9, который является рекомендуемым способом, поскольку мета-заголовок непризнан в валидаторах HTML5.

Для приложений J2EE это может быть достигнуто с помощью следующего фильтра:

public class IECompatibilityFilter implements Filter {
    private String compatibilityMode = "IE=10";
    public IECompatibilityFilter() {
    }
    public String getCompatibilityMode() {
        return compatibilityMode;
    }
    public void setCompatibilityMode(String compatibilityMode) {
        this.compatibilityMode = compatibilityMode;
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String mode = filterConfig.getInitParameter("compatibilityMode");
        if (StringUtils.isNotBlank(mode)) {
            this.compatibilityMode = StringUtils.trim(mode);
        }
    }
    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        if (!response.isCommitted() && response instanceof HttpServletResponse) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.addHeader("X-UA-Compatible", compatibilityMode);
        }
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
}

И зарегистрируйтесь в web.xml.

<filter>
  <filter-name>ieCompatibilityFilter</filter-name>
  <filter-class>com.foobar.web.filter.IECompatibilityFilter</filter-class>
  <init-param>
    <param-name>compatibilityMode</param-name>
    <param-value>IE=9</param-value>
  </init-param>
</filter>

Ответ 6

У меня есть что-то подобное (Проблемы с загрузкой изображений из браузеров в Amazon S3), и я обнаружил, что в моем случае объект xhr падает, запросив http://some.server.com из https://my.local.server.com:123/foo. Он выходит из строя на вызове xhr.open( "POST", httpUrl, true).

Вероятно, это ошибка IE10 (какой сюрприз;)), она разбивается как на Win7, так и на Win8.

Ответ 7

У меня была такая же проблема, но только с одним запросом, я имею в виду, что у меня есть веб-приложение, которое обрабатывает многие запросы ajax. Проверьте свою разметку. У меня была форма внутри таблицы для макета

<table>
    <form></form>
</table>

Я просто изменил это по-другому. формa > таблица.

Ответ 8

Кажется, проблема с Window 8 делает запросы междоменные https. Я не могу подтвердить, имеет ли он какое-либо отношение к действительности сертификата, поскольку тот, что на моем междоменном сервере недействителен (dev-сервер).

Эта ссылка является обходным решением, но кто хочет загружать все свое приложение, чтобы сделать запрос GET только для IE10 +? http://jonnyreeves.co.uk/2013/making-xhr-request-to-https-domains-with-winjs/