Compartir a través de


UpdatePanel postbacks asincrónicos lentos en Internet Explorer

Advertencia

La aplicación de escritorio de Internet Explorer 11, retirada y sin soporte, ha sido deshabilitada permanentemente a través de una actualización de Microsoft Edge en ciertas versiones de Windows 10. Para obtener más información, consulte Preguntas frecuentes sobre la retirada de la aplicación de escritorio de Internet Explorer 11.

En este artículo se presenta una solución alternativa para resolver el problema que experimenta un retraso al visitar una página y seleccionar un elemento de página.

Versión original del producto: Internet Explorer
Número de KB original: 2000262

Síntomas

Cuando se usa Internet Explorer para navegar una página que contiene un UpdatePanel, hay un retraso (a menudo entre 10 segundos y 45 segundos o más) después de hacer clic en un elemento de la página que inicia un postback asincrónico. El retraso no se experimenta cuando se usan exploradores distintos de Internet Explorer.

Causa

El PageRequestManager's _destroyTree método recorre en iteración los elementos DOM dentro de UpdatePanel antes de iniciar una postback asincrónica para eliminar elementos DOM. La _destroyTree implementación específica del método es lenta en Internet Explorer cuando se trabaja con un árbol DOM grande en algunas condiciones debido a la forma en que el visor HTML (mshtml.dll) de Internet Explorer almacena elementos DOM en memoria.

Solución alternativa

Puede agregar el siguiente JavaScript inmediatamente antes del elemento de cierre </body> de la página que experimenta un retraso.

<script language="javascript" type="text/javascript">

    function disposeTree(sender, args)
    {
        var elements = args.get_panelsUpdating();
        for (var i = elements.length - 1; i >= 0; i--)
        {
            var element = elements[i];
            var allnodes = element.getElementsByTagName('*'),
                length = allnodes.length;
            var nodes = new Array(length)
            for (var k = 0; k < length;
                {
                    nodes[k] = allnodes[k];
                }
            for (var j = 0, l = nodes.length; j < l;
            {
                var node = nodes[j];
                if (node.nodeType === 1)
                {
                    if (node.dispose && typeof (node.dispose) === "function")
                    {
                        node.dispose();
                    }
                    else if (node.control && typeof (node.control.dispose) === "function")
                    {
                        node.control.dispose();
                    }
                    var behaviors = node._behaviors;
                    if (behaviors)
                    {
                        behaviors = Array.apply(null, behaviors);
                        for (var k = behaviors.length - 1; k >= 0; k--)
                        {
                            behaviors[k].dispose();
                        }
                    }
                }
            }
            element.innerHTML = "";
        }
    }
Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(disposeTree);
</script>

Más información

Este script usa el getElementsByTagName método , que es mucho más rápido en Internet Explorer que la implementación original.

Este artículo solo se aplica a versiones anteriores de asp.net e Internet Explorer 8 o versiones anteriores.