Tengo una función simple que causa un error de desbordamiento de pila en IE 8. El problema no parece ocurrir en ningún otro navegador aunque no he probado IE 7 o 6.¿Por qué mi función jQuery causa un error de "desbordamiento de pila" en IE 8?
El error exacto es el siguiente: -
SCRIPT28: Out of stack space
jquery.min.js, line 2 character 7498
SCRIPT2343: Stack overflow at line: 2
la función de que se trate:
function switchImage(size, objid, prefix, fullimage){
if(size !== 'full'){
var image = prefix + size + '/' + size +'_' + fullimage;
}
else {
var image = prefix + size + '/' + fullimage;
}
$('#' + objid).data('type', size)
.append('<img id="preload" src="' + image + '" style="display:none;" />')
.find('#preload').load(function(){
$('#' + objid).find('img').attr('src', image);
$(this).remove();
});
}
Para dar una visión general del caso de uso voy a explicar el propósito de esta función:
Cuando un usuario cambia el tamaño de una imagen (usando el tamaño de jqueryUI), el ancho/alto se compara en otra función.
Una vez que la imagen crezca, se llama a esta función que, como puede ver, agrega un elemento oculto <img>
al DOM con el atributo 'src' de una versión de resolución superior (o inferior) si la imagen está siendo redujo por el usuario.
Una vez que se ha cargado el atributo src del elemento visible se actualiza y se retira el elemento oculto.
Esto resultó excelente conmutación dinámica de las imágenes como los redimensiona usuario manteniendo la calidad de imagen buena durante todo el proceso ....
Parece que no puedo averiguar qué está causando el problema en IE 8. Con esta función eliminada no se producen errores, y aunque el error está presente, la función sigue funcionando como debería (aunque el rendimiento de tamaño es pobre de todos modos en IE 8).
Cualquier ayuda sería muy apreciada.
ACTUALIZACIÓN: que parecen haber resuelto el problema original reescribiendo la función a lo siguiente: -
function switchImage(size, objid, prefix, fullimage){
var $el = $('#' + objid);
if(size !== 'full'){
var image = prefix + size + '/' + size +'_' + fullimage;
}
else {
var image = prefix + size + '/' + fullimage;
}
$el.data('type', size);
$('<img id="preload" src="' + image + '" style="display:none;" />')
.appendTo($el)
.one('load', function(){
$('#' + objid).find('img').attr('src', image);
$(this).remove();
});
}
Como se puede ver, la única diferencia real es que estoy usando .appendTo() en lugar de .append(), así como el uso del método jQuery .one() para garantizar que el evento de carga solo se produzca una vez. Sin embargo, dado que el elemento se elimina directamente después, no entiendo por qué esto debería marcar la diferencia.
Realmente me interesaría ver si alguien puede arrojar algo de luz sobre esto para que pueda aprender cómo evitar estos problemas en el futuro. Aclamaciones.
¿Qué sucede cuando utiliza una versión no minimizada de jQuery? Al menos de esa manera obtendrá una referencia más significativa para el error. – RobG
Pasa lo mismo ... Créalo o no cinco minutos después de publicar la pregunta ... Lo he resuelto. Pero no tengo idea de por qué ... actualizaré mi pregunta, ya que realmente me gustaría entender por qué esta ligera reescritura ha marcado la diferencia. – gordyr
@gordyr ¿Puede darnos el código que llama a la función switchImage() para darme un contexto? –