IE9 poprawnie wykonuje wywołanie Ajax dopiero po naciśnięciu klawisza F12


Mam ten kod jQuery na mojej stronie JSP (jQuery 1.7.2):
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 = resu<
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");
}
} );
}
}

Odbiorniki
ajaxSend
i
ajaxError
są rejestrowane przed wykonaniem tego kodu. Lubię to:
$( "#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 w dziale

http://alpha.sertal.ch:8181/Vi ... 00923
http://alpha.sertal.ch:8181/Vi ... 00923
możesz się nawet zalogować, jeśli chcesz. użytkownik: alsoft03 hasło: hasło
co powinno się wydarzyć przy pierwszym wywołaniu Ajax to błąd 401, ponieważ użytkownik nie jest zalogowany. I w tym miejscu IE zawodzi. Wywoływany jest odbiornik
ajaxSend
, ale odbiornik
ajaxError
nie. Jeśli ustawię wywołanie zwrotne błędu w samym $ .ajax, to również nie zostanie wywołane.
kiedy otwieram stronę w prawdziwej przeglądarce (FF, Chrome, Opera) działa dobrze i prosi o hasło. IE tego nie robi, chyba że naciśniesz F12, w takim przypadku strona również działa zgodnie z oczekiwaniami.
To jest naprawdę dziwne. Załadujesz stronę przy otwartej konsoli i działa. Gdy konsola jest zamknięta, wyświetla tylko pusty tytuł. Po załadowaniu strony możesz zamknąć konsolę, a ładowanie będzie kontynuowane.
Przetestowałem to na różnych maszynach i uzyskałem ten sam wynik.
Doprowadza mnie to do szału. Nie mogę debugować, ponieważ jeśli otworzę debugger za pomocą F12, działa dobrze.
Wiem, że wywołanie zwrotne Ajax nie jest wykonywane, ponieważ umieszczam wiersze
alert („Mam do tej pory”)
w różnych pozycjach.
Jeśli ktoś ma wskazówkę, jest bardzo wdzięczna.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wszystkie
Console.log ()
muszą zostać usunięte ze skryptu, dzięki czemu działa w IE9 bez przełączania się na tryb dewelopera.

Aktualizacja

Cieszę się, że ta odpowiedź pomogła kilku osobom. Pomyślałem, że zaktualizuję tę odpowiedź prostym rozwiązaniem, którego używam

HTML5 Boilerplate
http://html5boilerplate.com/
:
// 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;
}
}
}());

Umieść to przed swoim kodem, a pomoże ci to uniknąć błędów konsoli w przeglądarkach, które nie mają konsoli.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

console.log jest niezdefiniowana poza trybem programisty w IE. Lubię tworzyć zmienną
var console = {log: function(){}};

w przypadkach, w których nie debuguję.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem ten problem i wszystkie linki konsoli zostały wykomentowane w skryptach, ale nadal zawodziło to tylko w IE (11). Odkryłem, że rozwiązaniem jest dodanie fałszywej pamięci podręcznej do moich połączeń AJAX.
$.ajax({
**cache: false,**
type : 'GET',})

Wszystkie moje dane wejściowe mają autocomplete = „off”
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

w istocie zaoszczędził mi to czas, w IE 11 musimy umieścić cache: false, aby get ajax, aby rozwiązać ten problem

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się