2012-06-21 4 views
16

Ich habe diesen jQuery-Code in meiner JSP-Seite (jQuery 1.7.2):IE9 macht richtig Ajax-Aufruf nur often F12 schlagen

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

bevor dieser Code ausgeführt wird, ein ajaxSend und eineine ajaxError Zuhörer registriert sind. Wie so:

$("#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.'; 
    } 
    }); 

die ganze Seite können Sie unter http://alpha.sertal.ch:8181/VisionWeb/data-details/#data:12300923

zugegriffen werden kann, auch anmelden, wenn Sie mögen. user: alsoft03 passwort: passwort

was passieren sollte, wenn der ajax call zum ersten mal gemacht wird, ist ein 401 fehler weil der user nicht eingeloggt ist. Und hier kommt der IE nicht an. Der ajaxSend Listener wird aufgerufen, aber die ajaxError ist nicht. Wenn ich einen Fehlerrückruf auf $ .ajax selbst setze, wird es auch nicht aufgerufen.

Wenn ich die Seite mit einem echten Browser (FF, Chrome, Opera) öffne, funktioniert es gut und fragt nach einem Passwort. IE funktioniert nicht, wenn Sie F12 drücken. In diesem Fall funktioniert die Site auch wie erwartet.

Es ist wirklich komisch. Sie laden die Seite mit geöffneter Konsole und es funktioniert. Wenn die Konsole geschlossen ist, wird nur eine leere Kopfzeile angezeigt. Sobald die Seite geladen wurde, können Sie die Konsole schließen und sie wird weiter geladen.

Ich testete dies auf verschiedenen Maschinen und bekam das gleiche Ergebnis.

Es macht mich verrückt. Ich kann nicht debuggen, denn wenn ich den Debugger mit F12 öffne, funktioniert es gut.

Ich weiß, dass der Ajax-Rückruf nicht gemacht wird, weil ich alert("I got so far") Zeilen an verschiedenen Positionen gesetzt habe.

Wenn jemand eine Ahnung hat, ist es sehr willkommen.

Antwort

50

Alle Instanzen von console.log() müssen aus Ihrem Skript entfernt werden, damit es im IE9 funktioniert, ohne dass es sich im Entwicklermodus befindet.

UPDATE Ich bin froh, diese Antwort hat ein paar Leute geholfen. Ich dachte, ich diese Antwort mit einer einfachen Lösung aktualisieren würde ich von HTML5 Boilerplate verwendet haben:

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

Dieses vor Ihrem Code und es sollten Sie alle Konsole Fehler in Browsern vermeiden helfen, die eine Konsole fehlen.

+0

Wenn Es läuft ohne die Konsole geöffnet es wirft einen Fehler, denn, nun, es gibt keine Konsole geladen. Warum laden Sie einen für das regelmäßige Surfen? Die meisten Leute sind keine Entwickler. – TheZ

+3

hätte ich nie gedacht !! Wie dumm von ihnen, wirklich. Ich denke, man könnte darüber streiten, aber ich habe nur einen Tag mit dieser Scheiße verloren. Eins ist sicher, das werde ich nicht vergessen :-) –

+0

Ich bin froh, dass ich helfen konnte! = D – eivers88

2

console.log ist außerhalb des Entwicklermodus in IE undefined. Ich möchte nur eine Variablen

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

für wenn ich nicht debuggen.

+0

Dies ist nicht sehr freundlich, muss diese Zeile jedes Mal bearbeiten. Wie wäre es mit 'if (! Window.console) console = {log: funktion() {}, info: funktion() {}, warn; funktion() {}, error: function() {}} 'Sie könnten Ihre schreiben eigene Implementierung, die es irgendwo auf der Seite –

+0

@JuanMendes ausgibt Ich würde lieber nicht die Konsole verschmutzen, wenn es Produktionscode ist. – matt3141

+0

Alle anderen Browser haben bereits eine globale Konsole, es ist nicht viel Verschmutzung. Verhindert, dass Ihr Code bricht, wenn Sie ihn dort vergessen. –

1

Ich hatte dieses Problem und ich hatte alle Konsolen-Referenzen in den Skripts auskommentiert, aber es war immer noch nur in IE (11). Ich fand die Lösung, meinen AJAX Anrufen Cachespeicher falsch hinzuzufügen.

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

Alle meine Eingaben haben das Attribut zur automatischen Vervollständigung = "off"

0

wirklich es meine Zeit gespeichert, IN 11 IE, sollten wir Cache setzen: false für get Ajax, um dieses Problem gelöst zu bekommen