У меня есть этот код jQuery на моей странице 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 = 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");
}
} );
}
}
прежде чем этот код будет выполнен, регистрируются прослушиватели ajaxSend
и ajaxError
. Например:
$( "#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.';
}
} );
Доступ ко всей странице можно получить в http://alpha.sertal.ch:8181/VisionWeb/data-details/#data:12300923
вы даже можете войти в систему, если хотите. user: alsoft03 пароль: пароль
что должно произойти, когда вызов ajax выполняется впервые, это ошибка 401, потому что пользователь не входит в систему. И здесь IE терпит неудачу. Вызывается прослушиватель ajaxSend
, но ajaxError
нет. Если я установил обратный вызов ошибки для самого $.ajax, он также не будет вызван.
когда я открываю страницу с помощью реального браузера (FF, Chrome, Opera), он отлично работает и запрашивает пароль. IE не делает, если вы не нажмете F12, и в этом случае сайт работает так же, как ожидалось.
Это действительно странно. Вы загружаете страницу с открытой консолью, и она работает. При закрытой консоли отображается только пустой заголовок. После загрузки страницы вы можете закрыть консоль и продолжить ее загрузку.
Я тестировал это на разных машинах и получил тот же результат.
Это сводит меня с ума. Я не могу отлаживать, потому что, если я открываю отладчик с F12, он отлично работает.
Я знаю, что обратный вызов ajax не создан, потому что я помещал строки alert("I got so far")
в разные позиции.
Если у кого-то есть ключ, очень приветствуем.