2012-06-21 7 views
16

Mam ten kod jQuery w mojej strony JSP (jQuery 1.7.2):IE9 sprawia, że ​​wywołanie ajax poprawnie tylko ofter uderzenie F12

function Header() { 
     this.add = function (parentDiv, leftToolbar, rightToolbar) { 
     hbHeader = Handlebars.compile($("#hb-header").html()); 

     $(parentDiv).html(hbHeader({user:{tenantDescription:"", firstName:"", lastName:""}, 
      leftTB:null, rightTB:null })); 

     $.ajax({ 
      url:"${pageContext.request.contextPath}/services/login/sessionUser", 
      type:"POST", 
      async:true, 
      success:function (result) { 
       app.user = result; 
       var ltHtml; 
       var rtHtml; 
       if (leftToolbar) { 
        ltHtml = new Handlebars.SafeString(leftToolbar); 
       } 
       if (rightToolbar) { 
        rtHtml = new Handlebars.SafeString(rightToolbar); 
       } 
       $(parentDiv).html(hbHeader({user:app.user, 
        leftTB:{ 
        html:ltHtml, 
        hidden:leftToolbar == null 
        }, 
        rightTB:{ 
        html:rtHtml, 
        hidden:rightToolbar == null 
        } 
       })) 
      }, 
      error:function(jqXHR, textStatus, errorThrown) { 
       alert("error in ajax"); 
      } 
     }); 
     } 
    } 

zanim ten kod jest wykonywany, ajaxSend i ajaxError słuchacz jest zarejestrowany. Tak:

$("#log-window").ajaxSend(function (event, jqXhr, ajaxOptions) { 
    console.log("handling an ajax request adding username and password to the header"); 
    jqXhr.setRequestHeader('username', $.cookie('username')); 
    jqXhr.setRequestHeader('password', $.cookie('password')); 
    }); 
    $("#log-window").ajaxError(function (errorThrown, xhr, failedReq, textStatus) { 
    alert("error in "+failedReq.url); 
    if (textStatus == 'timeout') { 
     if (!failedReq.tryCount) { 
      failedReq.tryCount = 1; 
      failedReq.retryLimit = 3; 
     } 
     if (failedReq.tryCount++ <= failedReq.retryLimit) { 
      //try again 
      $.ajax(failedReq); 
      return; 
     } 
     throw 'Es wurde ' + failedReq.retryLimit + ' Mal versucht. Die Verbindung scheint nicht zu funktionieren.'; 
     return; 
    } 
    if (xhr.status == 500) { 
     if ($.cookie('pageRefreshed') == null) { 
      $.cookie('pageRefreshed', 'true', { expires:10000 }); 
      location.reload(); 
     } 
     throw 'Der Server hatte ein Problem. Bitte melden Sie den Fehler and den Systemadministrator'; 
    } else if (xhr.status == 401) { 
     if (failedReq.url != "${pageContext.request.contextPath}/services/login") { 
      var loginData = { 
       username:$.cookie('username'), 
       password:$.cookie('password') 
      }; 
      loginAttempt(failedReq, loginData); 
     } 
    } else { 
     throw 'Oops! There was a problem, sorry.'; 
    } 
    }); 

cała strona jest dostępna pod http://alpha.sertal.ch:8181/VisionWeb/data-details/#data:12300923

można nawet się zalogować, jeśli chcesz. użytkownik: alsoft03 hasło: hasło

co powinno się zdarzyć, gdy wywołanie ajax zostanie wykonane po raz pierwszy, to błąd 401, ponieważ użytkownik nie jest zalogowany. I tu nie działa IE. Słuchacz ajaxSend jest wywoływany, ale nie jest to ajaxError. Jeśli ustawię wywołanie błędu w samym pliku $ .ajax, to nie zostanie ono również wywołane.

kiedy otwieram stronę z prawdziwą przeglądarką (FF, Chrome, Opera) działa dobrze i prosi o podanie hasła. IE nie ma znaczenia, chyba że naciśniesz klawisz F12, w takim przypadku strona działa zgodnie z oczekiwaniami.

To naprawdę dziwne. Załadujesz stronę z konsolą otwartą i działa. Gdy konsola jest zamknięta, pokazuje tylko pusty nagłówek. Po załadowaniu strony możesz zamknąć konsolę i będzie ona nadal ładowana.

Testowałem to na różnych maszynach i otrzymałem taki sam wynik.

To doprowadza mnie do szału. Nie mogę debugować, ponieważ jeśli otworzę debugger za pomocą F12, to działa dobrze.

Wiem, że wywołanie zwrotne ajax nie jest wykonane, ponieważ umieszczam linie alert("I got so far") w różnych pozycjach.

Jeśli ktoś ma jakąś wskazówkę, jest bardzo mile widziany.

Odpowiedz

50

Wszystkie wystąpienia console.log() muszą zostać usunięte ze skryptu, aby mógł działać w IE9 bez trybu programowania.

AKTUALIZACJA Cieszę się, że ta odpowiedź pomogła kilku osobom. Pomyślałem, że mogę zaktualizować tę odpowiedź za pomocą prostego rozwiązania, które były używane od HTML5 Boilerplate:

// Avoid `console` errors in browsers that lack a console. 
(function() { 
    var method; 
    var noop = function() {}; 
    var methods = [ 
     'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 
     'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 
     'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 
     'timeStamp', 'trace', 'warn' 
    ]; 
    var length = methods.length; 
    var console = (window.console = window.console || {}); 

    while (length--) { 
     method = methods[length]; 

     // Only stub undefined methods. 
     if (!console[method]) { 
      console[method] = noop; 
     } 
    } 
}()); 

Place to przed kodem i powinno pomóc uniknąć ewentualnych błędów konsoli w przeglądarkach, które nie posiadają konsolę.

+0

If działa bez konsoli, otwiera błąd, ponieważ, cóż, _nie ma załadowanej konsoli_. Po co ładować jeden do regularnego przeglądania? Większość ludzi nie jest programistami. – TheZ

+3

Nigdy bym o tym nie pomyślał! jak głupi z nich, naprawdę. Sądzę, że można się spierać, ale po prostu straciłem dzień na tym gównie. Jedno jest pewne, nie zapomnę tego :-) –

+0

Cieszę się, że mogę pomóc! = D – eivers88

2

console.log jest niezdefiniowany poza trybem programisty w IE. Lubię tworzyć zmienne , gdy nie jestem debugowania.

+0

To nie jest bardzo przyjazne, trzeba edytować tę linię za każdym razem. Co powiesz na "if (! Window.console) console = {log: function() {}, info: function() {}, warn; function() {}, error: function() {}}' Możesz napisać własna implementacja, która wyprowadza ją gdzieś na stronie –

+0

@JuanMendes Wolę jednak nie zanieczyszczać konsoli, jeśli jest to kod produkcyjny. – matt3141

+0

Wszystkie inne przeglądarki mają już konsolę globalną, to niewiele zanieczyszczeń. Utrzymuje, że twój kod nie pęka, kiedy tam zapomnisz. –

1

Miałem ten problem i miałem wszystkie odniesienia do konsoli, które zostały skomentowane w skryptach, ale nadal występowały błędy tylko w IE (11). Znalazłem rozwiązanie polegające na dodawaniu fałszywego bufora do moich wywołań AJAX.

$.ajax({ 
     **cache: false,** 
     type : 'GET',}) 

Wszystkie moje wejścia mają autouzupełnianie atrybut = "off"

0

naprawdę to uratowało mój czas, w IE 11, powinniśmy umieścić cache: false Get AJAX, aby rozwiązać ten problem

Powiązane problemy