17

この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");
            }
         } );
      }
   }

このコードが実行される前に、ajaxSendajaxErrorリスナーが登録されます。そのようです:

  $( "#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からアクセスできます。

必要に応じてログインすることもできます。ユーザー:alsoft03パスワード:password

ajax呼び出しが最初に行われたときに何が起こるかは、ユーザーがログインしていないために401エラーです。これがIEが失敗する場所です。ajaxSendリスナーは呼び出されますが、呼び出されませajaxErrorん。それ自体にエラーコールバックを設定した場合、$.ajaxそれも呼び出されません。

実際のブラウザ(Firefox、Chrome、Opera)でページを開くと、正常に動作し、パスワードを要求されます。IEは、を押さない限り機能しません。を押すF12と、サイトも期待どおりに機能します。

本当に変です。コンソールを開いた状態でページをロードすると、機能します。コンソールを閉じると、空のヘッダーのみが表示されます。ページが読み込まれると、コンソールを閉じることができ、引き続き読み込まれます。

これをさまざまなマシンでテストしたところ、同じ結果が得られました。

それは私を夢中にさせます。F12でデバッガーを開くと正常に動作するため、デバッグできません。

さまざまな位置に行を配置しているため、ajaxコールバックが作成されないことはわかっていますalert("I got so far")

手がかりがあれば大歓迎です。

4

4 に答える 4

51

スクリプトを開発者モードでなくてもIE9で機能させるには、すべてのインスタンスをconsole.log()スクリプトから削除する必要があります。

更新この回答が数人の人々を助けてくれてうれしいです。HTML5ボイラープレートから使用している簡単なソリューションでこの回答を更新すると思っただけです。

// 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;
        }
    }
}());

これをコードの前に配置すると、コンソールがないブラウザーでのコンソールエラーを回避するのに役立ちます。

于 2012-06-21T22:17:05.423 に答える
2

console.logは、IEの開発者モード以外では未定義です。変数を作るのが好きです

var console = {log: function(){}};

デバッグしていないときのために。

于 2012-06-21T22:18:12.627 に答える
1

この問題が発生し、すべてのコンソール参照がスクリプトでコメントアウトされましたが、IEでのみ失敗していました(11)。解決策は、AJAX呼び出しにキャッシュfalseを追加することであることがわかりました。

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

私のすべての入力には、属性autocomplete="off"があります

于 2015-03-30T16:40:01.110 に答える
0

本当にそれは私の時間を節約しました、IE 11では、この問題を解決するためにajaxを取得するためにcache:falseを置く必要があります

于 2017-01-17T10:40:19.907 に答える