Perché JavaScript funziona solo dopo aver aperto gli strumenti per sviluppatori in IE una volta?


638

Bug IE9: JavaScript funziona solo dopo aver aperto gli strumenti per sviluppatori una volta.

Il nostro sito offre agli utenti download gratuiti di pdf e ha una semplice funzione "inserisci password per scaricare". Tuttavia, non funziona affatto in Internet Explorer.

Puoi vedere di persona in questo esempio .

Il pass per il download è "makeuseof". In qualsiasi altro browser, funziona benissimo. In IE, entrambi i pulsanti non fanno nulla.

La cosa più curiosa che ho trovato è che se apri e chiudi la barra degli strumenti per sviluppatori con F12, tutto inizia improvvisamente a funzionare.

Abbiamo provato la modalità di compatibilità e simili, nulla fa la differenza.

Come faccio a farlo funzionare in Internet Explorer?


3
usa il wrapper cross-browser: github.com/MichaelZelensky/log.js
Michael Zelensky,

1
Una buona alternativa, se hai un passo di costruzione, è usare qualcosa di simile gulp-strip-debug. Rimuove tutti i console.*metodi, ottimi per build di produzione o test in IE.
knownasilya,

15
Per i futuri googler: ho avuto gli stessi sintomi, ma in IE11. Bene, si è scoperto che la risposta non era correlata console, ma al mio uso dell'angolazione e della memorizzazione nella cache delle richieste di ricezione. Vedi le risposte qui e qui per ulteriori informazioni.
Christoffer Lette,

@ChristofferLette Sì, ho lo stesso problema, controlla stackoverflow.com/questions/31428126/… il codice funziona correttamente all'apertura degli strumenti per sviluppatori ..
Pranav Bilurkar,

6
La cosa più fastidiosa di problemi come questo? Sono quasi impossibili da eseguire il debug perché inizia a funzionare non appena si apre la console per sviluppatori.
jlewkovich,

Risposte:


815

Sembra che potresti avere del codice di debug nel tuo javascript.

L'esperienza che stai descrivendo è tipica del codice che contiene console.log()o uno qualsiasi degli altriconsole funzionalità.

L' consoleoggetto viene attivato solo quando viene aperta la barra degli strumenti Dev. Prima di ciò, la chiamata all'oggetto console comporterà la sua segnalazione comeundefined . Dopo che la barra degli strumenti è stata aperta, la console esiste (anche se la barra degli strumenti viene successivamente chiusa), quindi le chiamate della console funzioneranno.

Ci sono alcune soluzioni a questo:

Il più ovvio è esaminare il codice rimuovendo i riferimenti console. Non dovresti comunque lasciare cose del genere nel codice di produzione.

Se si desidera conservare i riferimenti della console, è possibile racchiuderli in if()un'istruzione o in qualche altro condizionale che controlli se l'oggetto console esiste prima di provare a chiamarlo.


8
Esistono soluzioni alternative per lasciare il codice di debug? IE è l'unico browser con questo comportamento
insano

94
if(!console) {console={}; console.log = function(){};}
Meekohi,

80
@Meekohi if(!console)causerà lo stesso errore - dovrebbe leggereif(!window.console)
mindplay.dk il

9
quindi ... IE non avrebbe dovuto implementare una funzionalità che ogni nuovo sviluppatore js utilizza continuamente, per evitare fastidiosi alcuni sviluppatori che hanno usato uno script per risolvere ciò che avrebbe dovuto funzionare in primo luogo ... ma non è giusto bussare a IE per quello? Sei una persona molto generosa Spudley !!! :)
Jordan Davis,

7
Succede ancora con IE11
Michael,

162

HTML5 Boilerplate ha un bel codice predefinito per la risoluzione dei problemi della console:

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

Come sottolineato da @ plus nei commenti, l'ultima versione è disponibile sulla loro pagina GitHub


9
Il link nel commento di @plus non è più valido. Il codice è stato inserito in una srcsottodirectory: github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
Christoffer Lette,

153

Ecco un'altra possibile ragione oltre al console.logproblema (almeno in IE11):

Quando la console non è aperta, IE esegue una memorizzazione nella cache piuttosto aggressiva, quindi assicurati che tutte le $.ajaxchiamate o le XMLHttpRequestchiamate siano impostate su false.

Per esempio:

$.ajax({cache: false, ...})

Quando la console per sviluppatori è aperta, la memorizzazione nella cache è meno aggressiva. Sembra essere un bug (o forse una funzionalità?)


9
Questo mi ha appena salvato;) Grazie! Direi che è un bug poiché dovresti avere le stesse condizioni per testare ed eseguire il debug del tuo sito Web con la console aperta e chiusa.
Chnoch,

Ha funzionato per me. In particolare: stackoverflow.com/questions/13391563/...
user1062589

2
questo dovrebbe essere più alto poiché penso che sia la risposta effettiva ... la risposta accettata per quanto riguarda console.log in alcune versioni di IE genererà un errore, non causato il comportamento descritto qui.
Migs

63

Ciò ha risolto il mio problema dopo averlo apportato una piccola modifica. Ho aggiunto quanto segue nella mia pagina HTML per risolvere il problema IE9:

<script type="text/javascript">
    // IE9 fix
    if(!window.console) {
        var console = {
            log : function(){},
            warn : function(){},
            error : function(){},
            time : function(){},
            timeEnd : function(){}
        }
    }
</script>

1
Questa soluzione non funziona su IE 11 su Windows 7 a 64 bit.
Vikram,

1
Ciò ha risolto il mio problema su IE 11 su Windows 7 a 64 bit.
zonyang,

29

Oltre al ' console' problema di utilizzo menzionato nella risposta accettata e altri, c'è almeno un altro motivo per cui a volte le pagine in Internet Explorer funzionano solo con gli strumenti di sviluppo attivati.

Quando Strumenti per gli sviluppatori è abilitato, IE non utilizza realmente la sua cache HTTP (almeno per impostazione predefinita in IE 11) come fa in modalità normale.

Significa che se il tuo sito o pagina ha un problema di memorizzazione nella cache (se memorizza nella cache più di quanto dovrebbe ad esempio - era il mio caso), non vedrai quel problema in modalità F12. Pertanto, se javascript esegue alcune richieste AJAX memorizzate nella cache, potrebbero non funzionare come previsto in modalità normale e funzionare correttamente in modalità F12.


1
Vedere stackoverflow.com/questions/3984961/… per come disabilitare la memorizzazione nella cache delle richieste xmlHttpReq.
Michael Ross,

1
Dolce. Questo ha funzionato sorprendentemente. Immagino che il servizio $ http di Angular non metta in cache bust come pensavo.

17

Immagino che questo possa aiutare, aggiungendolo prima di qualsiasi tag di javascript:

try{
  console
}catch(e){
   console={}; console.log = function(){};
}

11
try catchrilevare che esiste una variabile è una cattiva idea. Non solo è lento, ma se hai più di un'istruzione nel tuo blocco try, potresti ottenere un'eccezione per un motivo diverso. Non usare questo, per lo meno usaif (typeof console == 'undefined')
Juan Mendes

8

Se si utilizza AngularJS versione 1.X, è possibile utilizzare il servizio $ log anziché utilizzare direttamente console.log.

Servizio semplice per la registrazione. L'implementazione predefinita scrive in modo sicuro il messaggio nella console del browser (se presente).

https://docs.angularjs.org/api/ng/service/$log

Quindi se hai qualcosa di simile a

angular.module('logExample', [])
  .controller('LogController', ['$scope', function($scope) {
    console.log('Hello World!');
 }]);

puoi sostituirlo con

angular.module('logExample', [])
  .controller('LogController', ['$scope', '$log', function($scope, $log) {
    $log.log('Hello World!');
 }]);

Angular 2+ non ha alcun servizio di registro integrato .


questo mi ha aiutato, grazie - per chiunque altro usasse il dattiloscritto, questo è "ILogService" nelle definizioni angolari
DannykPowell,

IIRC usando $ log fa sì che la posizione dell'istruzione log sia oscurata, diversamente da quando si utilizza console.log. Non eccezionale dalla mia esperienza durante lo sviluppo.
JesseDahl,

5

Se stai usando angulare cioè 9, 10o edgeusi:

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }    

    // Answer edited to include suggestions from comments
    // because previous version of code introduced browser-related errors

    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
    // extra
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);

Per disabilitare completamente cache.


4

È successo in IE 11 per me. E stavo chiamando la funzione jload di .load. Quindi l'ho fatto alla vecchia maniera e ho inserito qualcosa nell'url per disabilitare la cache.

$("#divToReplaceHtml").load('@Url.Action("Action", "Controller")/' + @Model.ID + "?nocache=" + new Date().getTime());

2

Ho ottenuto un'altra alternativa per le soluzioni offerte da Runeks e Todotresde che evita anche le insidie ​​discusse nei commenti alla risposta di Spudley :

        try {
            console.log(message);
        } catch (e) {
        }

È un po 'trasandato, ma d'altra parte è conciso e copre tutti i metodi di registrazione trattati nella risposta di Runeks e ha l'enorme vantaggio di poter aprire la finestra della console di IE in qualsiasi momento e che i registri entrano.


0

Abbiamo riscontrato questo problema su IE 11 su Windows 7 e Windows 10. Abbiamo scoperto quale fosse esattamente il problema attivando le funzionalità di debug per IE (IE> Opzioni Internet> scheda Avanzate> Navigazione> Deseleziona Disabilita debug script (Internet Explorer) ). Questa funzione è generalmente controllata nel nostro ambiente dagli amministratori di dominio.

Il problema era perché stavamo usando il console.debug(...)metodo nel nostro codice JavaScript. Il presupposto dello sviluppatore (me) era che non volevo che nulla fosse scritto se la console degli strumenti di sviluppo del client non era esplicitamente aperta. Mentre Chrome e Firefox sembravano concordare con questa strategia, IE 11 non piaceva un po '. Modificando tutte le console.debug(...)istruzioni in console.log(...)dichiarazioni, siamo stati in grado di continuare a registrare ulteriori informazioni nella console del client e visualizzarle quando erano aperte, ma altrimenti tenerle nascoste all'utente tipico.


0

Ho messo la risoluzione e la correzione per il mio problema. Sembra che la richiesta AJAX che ho inserito nel mio JavaScript non sia stata elaborata perché la mia pagina aveva qualche problema di cache. se il tuo sito o pagina ha un problema di memorizzazione nella cache, non vedrai quel problema in modalità sviluppatori / F12. il mio JavaScript cache AJAX richiede che potrebbe non funzionare come previsto e causare l'interruzione dell'esecuzione che F12 non ha alcun problema. Quindi ho appena aggiunto un nuovo parametro per rendere falsa la cache.

$.ajax({
  cache: false,
});

Sembra che IE abbia specificamente bisogno che questo sia falso in modo che l'attività AJAX e javascript funzioni correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.