IE8 jQuery AJAX rareza

Tengo una aplicación Zend Framework. Parece que tengo un problema con IE8 y jQuery que culmina después de varias (muchas) publicaciones. Es decir, empeora cada vez más a medida que aumenta la cantidad de publicaciones. Lo que está sucediendo es que, después de un tiempo haciendo la entrada de datos sin recargar la página, si trato de navegar fuera o recargar la página, IE8 actúa realmente raro / glitchy / shifty y algunas veces me dice que ha intentado todo lo que puede hacer y dejará de intentarlo. cargar la página. Cuando recargo desde allí, se reinicia y todo funciona bien durante un tiempo hasta que se acumula y vuelve a suceder.

Para explicar un poco más sobre lo que sucede, digamos que tengo algunas otras pestañas abiertas en IE8; si intento navegar a otra página en la aplicación, IE8 muestra alguna otra pestaña y parpadea un poco antes de volver a cargar la página y mostrar eso. Si recargo en este punto, hace lo que normalmente esperarías. Si NO recargo en este punto, la próxima vez que la maldad se acumule de nuevo e intente recargar, IE8 me dirá que no volverá a intentarlo, y tengo que escribir manualmente la URL en la barra de navegación para poder volver a la aplicación.

Tengo la sensación de que tiene que ver con el enlace de mi pulsación de tecla, pero no estoy seguro de por qué. ¿Alguien más ha experimentado esto y se ha dado cuenta de lo que va mal?

Aquí está mi $(document).ready() función donde se produce el enlace de pulsación de tecla:

$(document).ready(function(){

    running = false;
    offset = $("#quantity").html();

    $("#boxNumber").focus();

    $(document).bind("keypress" , function(e){
        var firstName = document.getElementById('firstName');
        var middleName = document.getElementById('middleName');        
        if (e.which == 13 && (!$("#notes").is(":focus")) && (!$("#submit").is(":focus"))) {
            if (running == false) {
                running = true;
                middleName.value = middleName.value.toUpperCase();
                firstName.value = firstName.value.substring(0, 1).toUpperCase() + 
                                    firstName.value.substring(1, firstName.value.size);
                submitForm();
                return false;
            } else {
                return false;
            }
        } else if (e.which != 13 && $("#middleName").is(":focus") && $("#middleName").val() != '') {
            firstName.focus();
            firstName.value = firstName.value + " " + middleName.value.toUpperCase();
            middleName.value = '';
        }

    });
    bindTdClick();
    bindAutoComplete('oof_name');
    bindAutoComplete('pro_title');
    bindAutoComplete('tags');


    $("#submit").click(function(){
        if (running == false) {
            running = true;
            submitForm();
        } else {
            return false;
        }
    });
});

El problema también puede estar en el submitForm() función:

function submitForm() {
    $.post("/ajax/files" , $("#files").serialize(), function(data){
        filesReset();
        if (data != "") {
            $("#lastInsert table tbody:last").prepend(data);
            $("#lastInsert table tbody:last tr:first").find("td").hide();
            $("#lastInsert table tbody:last tr:first").find("td").fadeIn(1000, function(){ bindTdClick(); });
            $("#lastInsert table tbody:last tr:first").effect("highlight" , {"color": "aqua"}, 1000);

            $("#lastInsert table tbody:last tr:last").remove();
        } else {
            alert("Insert rejected by the server: either inadequate criteria or the server is down.");
            $("#hidden").click();
        }
        running = false;
    });
}

O tal vez el filesReset() función:

function filesReset(){
    var lastName = $("#lastName").val();
    if (lastName.indexOf(',') != -1) {
        lastName = lastName.substring(0, lastName.indexOf(','));
    }
    $("#lastName").val(lastName).focus().select();
    $("#firstName").val("");
    $("#middleName").val("");
    $("#fil_will_recorder_rec_id").val("");
    $(".errors").remove();
    $("#lastInsert table").css({"border-right":"1px solid #D9D9D9"});
    $("#notes").val("");
    //$("#tags").val("");
    $("span").html("");
}

preguntado el 08 de noviembre de 11 a las 15:11

porque no conozco nada mejor, supongo. -

tal vez porque jQuery IS js? JavaScript nativo es en realidad más rápido en la mayoría de los casos. que clase de pregunta es esa... -

De un vistazo, no veo nada malo, pero sospecho que en algún momento de su código algo está vinculado a la misma acción una y otra vez (posiblemente presionar una tecla). Es posible que desee agregar algunas alertas o puntos de interrupción de firebug para ver qué segmento se llama repetidamente, luego volver a IE para realizar pruebas. -

¿El uso de js en lugar de jquery en realidad no devuelve diferentes objetos? es decir getElementById('foo') devuelve un elemento DOM pero $('#foo') devuelve un objeto jquery (contenedor). -

@DisgruntledGoat es cierto, pero no en todos los casos. Ver el filesReset() función anterior: $("#lastName").val() que luego usa el indexOf() método, que no es peculiar de jQuery, creo. -

1 Respuestas

Eso es bastante pesado para el acceso DOM por cada vez que presiona una tecla. Si tiene una aplicación con una gran cantidad de tablas, probablemente esté haciendo que la pobre y pequeña cabeza de guisante desafiada por manipular DOM de IE8 explote tratando de arreglar las cosas.

Me parece que estás haciendo algunas cosas de formateo automático que tendrían más sentido en un evento de enfoque o desenfoque al presionar una tecla en la condición! == 13. Saque eso de la pulsación de tecla si comentarlo revela que es el culpable.

Las cosas en la primera condición no serán afectadas en el segundo === 13 la comprobación falla, por lo que debería estar bien.

Otra cosa para mejorar el rendimiento que probablemente no se solucionará, pero no estaría de más, es almacenar en caché todas esas selecciones de jQuery en los casos en que HTML no se extraiga y vuelva a colocar. Simplemente asigne todos los objetos jq permanentes en juego a los que se accede más de una vez a vars antes de hacer cualquier otra cosa. p.ej

var $_someId = $('#some_id');

Las identificaciones son realmente muy rápidas, pero pueden marcar una gran diferencia para selecciones más complicadas. Lo mismo ocurre con los métodos DOM API regulares que jQuery está usando bajo el capó.

Respondido 13 Feb 13, 16:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.