usar usa requerimientos que programar programa practicar para paginas necesita herramientas entorno desarrollo javascript internet-explorer-9

requerimientos - que se necesita para usar javascript



El sitio web con JS no funciona en IE9 hasta que se activan las Herramientas de desarrollo (8)

Estoy desarrollando un sitio web complejo que aprovecha mucho jQuery y varios scripts. Al cargar el sitio, ninguno de mis scripts está funcionando (aunque puedo confirmar que otros scripts funcionan bien). No estaría publicando una pregunta tan aburrida aquí en SE excepto por una cosa:

En el instante en que presioné la tecla F12 para activar las herramientas de desarrollador para que pueda solucionar mi problema, ¡todo funciona de manera instantánea y perfecta!

Peor aún, si apago el navegador, lo inicio, enciendo Dev Tools primero y visito el sitio, todo funciona como se espera.

¡Así que ni siquiera puedo solucionar el problema porque Dev Tools lo soluciona! ¿Qué podría estar haciendo Dev Tools que haga que las cosas funcionen? ¿Cambia la UA (hago alguna detección jQuery.browser)? ¿Hace algo para doctype?

EDITAR

Todo el registro de mi consola está envuelto en la siguiente función de utilidad de envoltura:

function log(msg){ if (console){ console.log(msg); } }

Cualquier pensamiento o sugerencia que pueda intentar sería bienvenido. Voy a publicar aquí si encuentro una solución.


Aprecio que llego bastante tarde a la fiesta aquí, pero tengo una solución para IE9 que es un poco diferente.

(function() { var temp_log = []; function log() { if (console && console.log) { for (var i = 0; i < temp_log.length; i++) { console.log.call(window, temp_log[i]); } console.log.call(window, arguments); } else { temp_log.push(arguments); } } })();

Básicamente en lugar de console.log usas log . Si console.log existe, entonces funciona de manera normal, de lo contrario, almacena las entradas de registro en una matriz y las genera en el siguiente log donde está disponible la console .

Sería bueno si enviara los datos tan pronto como la console esté disponible, pero esto es menos costoso que configurar un escucha de setInterval personalizado.

Función actualizada (1 de octubre de 2012)

He actualizado este script para mi propio uso y pensé que lo compartiría. Tiene algunas mejoras dignas:

  • use console.log() como de costumbre, es decir, ya no necesita usar log() no estándar log()
  • admite múltiples argumentos, por ejemplo, console.log(''foo'', ''bar'')
  • también puede usar console.error , console.warn y console.info (aunque los genera como console.log )
  • el script busca la console nativa cada 1000 ms y genera el búfer cuando se encuentra

Creo que con estas mejoras, esto se ha convertido en un complemento bastante sólido para IE9. Echa un vistazo a la repo de GitHub aquí .

if (!window.console) (function() { var __console, Console; Console = function() { var check = setInterval(function() { var f; if (window.console && console.log && !console.__buffer) { clearInterval(check); f = (Function.prototype.bind) ? Function.prototype.bind.call(console.log, console) : console.log; for (var i = 0; i < __console.__buffer.length; i++) f.apply(console, __console.__buffer[i]); } }, 1000); function log() { this.__buffer.push(arguments); } this.log = log; this.error = log; this.warn = log; this.info = log; this.__buffer = []; }; __console = window.console = new Console(); })();


El wrapper console.log que utilicé no fue suficiente para detectar la consola en IE9. Aquí está el envoltorio que funciona a partir de una pregunta relacionada sobre SE :

function logError(msg){ try { console.log(msg); } catch (error) { throw new Error(msg); } } function log(msg){ try { console.log(msg); } catch (error) { } }

Una prueba adecuada de la disponibilidad del objeto de consola sería: if (typeof console === "undefined" || typeof console.log === "undefined")


La mayoría de las otras soluciones deberían funcionar muy bien, pero aquí hay un breve resumen si no te importa captar los mensajes de registro si la consola no está disponible.

// Stub hack to prevent errors in IE console = window.console || { log: function() {} };

Esto le permite seguir utilizando la función console.log nativa directamente en lugar de envolverla con algo o tener un condicional cada vez.


Lo he hackeado de la siguiente manera.

<script type="text/javascript"> (function () { if (typeof console == "undefined") { console = { log : function () {} } } })(); </script>

Y este es el primer elemento de script en el.


Me he encontrado con este problema muchas veces. Básicamente con variables hacemos esto para comprobar si son válidas.

var somevar; if (somevar) //do code

esto funciona porque somevar se resolverá a indefinido. Pero si está comprobando una propiedad de ventana por ejemplo. ventana.console.

if (console) <---- this throws an exception

No puedes hacer el mismo cheque. El navegador lo trata de manera diferente. Basicamente solo haciendo esto

if (window.console) <---- will NOT throw an exception if undefined //some code

Esto funcionará igual que el primer ejemplo. Así que necesitas cambiar tu código para

function log(msg){ if (window.console){ console.log(msg); } }


Me parece mucho más conveniente simplemente usar la console && console.log(''foo'', ''bar'', ''baz'') lugar de usar una función de envoltorio.

El código que proporcionó:

function logError(msg){ if (console) { console.log(msg); } else { throw new Error(msg); } }

Producirá un error para IE cuando las herramientas dev están cerradas porque la console no estará definida.


Si tiene varios archivos de script paralelos, tal vez los archivos se estén cargando / ejecutando en un orden diferente con las herramientas de desarrollador activadas / desactivadas.


Tiene llamadas a la consola, en IE fallarán si las herramientas de desarrollo no están abiertas. Una solución simple es envolver cualquier llamada de consola en una función como:

function log(msg) { if(console) console.log(msg); }