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 usarlog()
no estándarlog()
- admite múltiples argumentos, por ejemplo,
console.log(''foo'', ''bar'')
- también puede usar
console.error
,console.warn
yconsole.info
(aunque los genera comoconsole.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);
}