sirve - ¿Por qué JavaScript solo funciona después de abrir las herramientas de desarrollador en IE una vez?
salto de linea consola chrome (12)
Además del problema de uso de la " console
" mencionado en la respuesta aceptada y en otras, hay al menos otra razón por la que a veces las páginas de Internet Explorer funcionan solo con las herramientas de desarrollador activadas.
Cuando las Herramientas de desarrollador están habilitadas, IE realmente no usa su caché HTTP (al menos de manera predeterminada en IE 11) como lo hace en el modo normal.
Significa que si su sitio o página tiene un problema de almacenamiento en caché (si almacena más de lo que debería, por ejemplo, ese fue mi caso), no verá ese problema en el modo F12. Por lo tanto, si el javascript realiza algunas solicitudes AJAX en caché, es posible que no funcionen como se espera en el modo normal y que funcionen bien en el modo F12.
IE9 Bug: JavaScript solo funciona después de abrir las herramientas del desarrollador una vez.
Nuestro sitio ofrece descargas de pdf gratuitas para los usuarios, y tiene una función simple de "ingresar contraseña para descargar". Sin embargo, no funciona en absoluto en Internet Explorer.
Puedes verlo por ti mismo en este example .
El pase de descarga es "makeuseof". En cualquier otro navegador, funciona bien. En IE, ambos botones no hacen nada.
Lo más curioso que he encontrado es que si abres y cierras la barra de herramientas del desarrollador con F12, todo comienza a funcionar de repente.
Hemos intentado el modo de compatibilidad y eso, nada hace la diferencia.
¿Cómo hago para que esto funcione en Internet Explorer?
Aquí hay otra razón posible además del problema console.log
(al menos en IE11):
Cuando la consola no está abierta, IE realiza un almacenamiento en caché bastante agresivo, así que asegúrese de que cualquier llamada de $.ajax
o XMLHttpRequest
tenga el almacenamiento en caché configurado en falso.
Por ejemplo:
$.ajax({cache: false, ...})
Cuando la consola del desarrollador está abierta, el almacenamiento en caché es menos agresivo. Parece ser un error (o tal vez una característica?)
Esto resolvió mi problema después de que le hice un cambio menor. Agregué lo siguiente en mi página html para solucionar el problema de IE9:
<script type="text/javascript">
// IE9 fix
if(!window.console) {
var console = {
log : function(){},
warn : function(){},
error : function(){},
time : function(){},
timeEnd : function(){}
}
}
</script>
Nos encontramos con este problema en IE 11 en Windows 7 y Windows 10. Descubrimos cuál era exactamente el problema al activar las capacidades de depuración para IE (IE> Opciones de Internet> pestaña Avanzadas> Navegación> Desmarcar Deshabilitar depuración de scripts (Internet Explorer) ). Esta característica generalmente está activada en nuestro entorno por los administradores del dominio.
El problema fue porque estábamos usando el método console.debug(...)
dentro de nuestro código JavaScript. La suposición hecha por el desarrollador (yo) era que no quería que se escribiera nada si la consola de herramientas de desarrollo del cliente no estaba explícitamente abierta. Si bien Chrome y Firefox parecían estar de acuerdo con esta estrategia, a IE 11 no le gustó ni un poco. Al cambiar todas las declaraciones de console.log(...)
a las declaraciones de console.log(...)
, pudimos continuar registrando información adicional en la consola del cliente y verla cuando estaba abierta, pero de lo contrario, la mantuvimos oculta del usuario típico.
Parece que podría tener algún código de depuración en su javascript.
La experiencia que estás describiendo es típica del código que contiene console.log()
o cualquiera de las otras funciones de la console
.
El objeto de la console
solo se activa cuando se abre la barra de herramientas de desarrollo. Antes de eso, llamar al objeto de la consola hará que se informe como undefined
. Después de que se haya abierto la barra de herramientas, la consola existirá (incluso si la barra de herramientas se cierra posteriormente), por lo que las llamadas de la consola funcionarán.
Hay algunas soluciones a esto:
La más obvia es ir a través de su código eliminando referencias a la console
. No deberías dejar cosas así en el código de producción de todos modos.
Si desea mantener las referencias de la consola, puede envolverlas en una declaración if()
, o algún otro condicional que compruebe si el objeto de la consola existe antes de intentar llamarla.
Pongo la resolución y la solución para mi problema. Parece que la solicitud de AJAX que puse dentro de mi javascript no se estaba procesando porque mi página tenía algún problema de caché. Si su sitio o página tiene un problema de almacenamiento en caché, no verá ese problema en el modo de desarrolladores / F12. mi javascript AJAX en caché solicita que no funcione como se esperaba y que la ejecución se rompa, lo que F12 no tiene ningún problema. Así que acaba de agregar un nuevo parámetro para hacer que el caché sea falso.
$.ajax({
cache: false,
});
Parece que IE específicamente necesita que esto sea falso para que la actividad de AJAX y javascript funcione bien.
Si está utilizando angular
y es decir 9, 10
o uso de edge
:
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'';
}]);
Para deshabilitar completamente el cache
.
Si está utilizando la versión 1.X de AngularJS, puede usar el servicio $ log en lugar de usar console.log directamente.
Sencillo servicio de registro. La implementación predeterminada escribe de forma segura el mensaje en la consola del navegador (si está presente).
https://docs.angularjs.org/api/ng/service/$log
Así que si tienes algo similar a
angular.module(''logExample'', [])
.controller(''LogController'', [''$scope'', function($scope) {
console.log(''Hello World!'');
}]);
puedes reemplazarlo con
angular.module(''logExample'', [])
.controller(''LogController'', [''$scope'', ''$log'', function($scope, $log) {
$log.log(''Hello World!'');
}]);
Angular 2+ no tiene ningún servicio de registro incorporado .
Sucedió en IE 11 para mí. Y estaba llamando a la función de carga jquery. Así que lo hice a la antigua usanza y puse algo en la URL para deshabilitar el almacenamiento en caché.
$("#divToReplaceHtml").load(''@Url.Action("Action", "Controller")/'' + @Model.ID + "?nocache=" + new Date().getTime());
Supongo que esto podría ayudar, agregando esto antes de cualquier etiqueta de javascript:
try{
console
}catch(e){
console={}; console.log = function(){};
}
HTML5 Boilerplate tiene un buen código prefabricado para solucionar problemas de la consola:
// 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;
}
}
}());
Como @ plus- señala en los comentarios, la última versión está disponible en su página de GitHub
runeks otra alternativa para las soluciones ofrecidas por runeks y todotresde que también evita los inconvenientes discutidos en los comentarios a la respuesta de Spudley :
try {
console.log(message);
} catch (e) {
}
Es un poco desaliñado pero, por otro lado, es conciso y cubre todos los métodos de registro cubiertos en la respuesta de runeks y tiene la gran ventaja de que puede abrir la ventana de la consola de IE en cualquier momento y los registros aparecen.