Error de JavaScript de IE9: SCRIPT5007: No se puede obtener el valor de la propiedad ‘ui’: el objeto es nulo o indefinido

Mi sitio web funciona bien en Chrome, Firefox e Internet Explorer 8. Pero en Internet Explorer 9, se activan errores muy extraños cuando simplemente se pasa el cursor sobre los componentes.

SCRIPT5007: No se puede obtener el valor de la propiedad ‘ui’: el objeto es null o indefinido ScriptResource.axd?d=sTHNYcjtEdStW2Igkk0K4NaRiBDytPljgMCYpqxV5NEZ1IEtx3DRHufMFtEMwoh2L3771sigGlR2bqlOxaiwXVEvePerLDCL0hFHHUFdTOM0o55K0&t=ffffffffd37cb3a1, línea 181 carácter 1914

Y siguiendo el enlace al error en el javascript me muestra estos bits de código:

onNodeOver:function(B,A){A.ui.onOver(B)},onNodeOut:function(B,A){A.ui.onOut(B)}

No tengo ni idea de cómo resolver este error. He visto esta solución, pero eso no resolvió el problema para mí.

¿Alguna idea?

Respuestas:8 Respuestas 8
Tiempo:hace 11 años, 5 meses
Última modificación:hace 2 años, 5 meses

Solución

Muchas bibliotecas de JavaScript (especialmente las no recientes) no manejan bien IE9 porque rompe con IE8 en el manejo de muchas cosas.

El código JS que olfatea para IE fallará con bastante frecuencia en IE9, a menos que dicho código se reescriba para manejar IE9 específicamente.

Antes de actualizar el código JS, debe usar la metaetiqueta «X-UA-Compatible» para forzar su página web en modo IE8.

EDITAR: No puedo creer eso, 3 años después y estamos en IE11, y todavía hay votos positivos para esto. 🙂 Muchas bibliotecas JS ahora deberían al menos admitir IE9 de forma nativa y la mayoría admitir IE10, por lo que es poco probable que necesite la metaetiqueta en estos días, a menos que no tenga la intención de actualizar su biblioteca JS. Pero tenga en cuenta que IE10 cambia las cosas con respecto a las secuencias de comandos entre dominios y algunos saltos de código de biblioteca basados en CDN. Comprueba la versión de tu biblioteca. Por ejemplo, Dojo 1.9 en la CDN se romperá en IE10, pero 1.9.1 lo resuelve.

EDICIÓN 2: REALMENTE necesitas juntar tus actos ahora. Ahora estamos a mediados de 2014!!! ¡TODAVÍA estoy recibiendo votos para esto! ¡Revise sus sitios para deshacerse de las dependencias codificadas antiguas de IE!

Suspirar… Si hubiera sabido que esta sería, con mucho, mi respuesta más popular, probablemente habría pasado más tiempo puliéndola …

EDITAR 3: Ahora es casi 2016. Los votos positivos siguen aumentando… Supongo que hay mucho código heredado por ahí … Un día nuestros programas nos sobrevivirán…

Otras respuestas

He escrito código que olfatea IE4 o superior y actualmente funciona perfectamente en sitios para los clientes de mi empresa, así como en mis propios sitios personales.

Incluya las siguientes variables de constante y función enumeradas en un archivo de inclusión javascript en su página…

//methods
var BrowserTypes = {
    Unknown: 0,
    FireFox: 1,
    Chrome: 2,
    Safari: 3,
    IE: 4,
    IE7: 5,
    IE8: 6,
    IE9: 7,
    IE10: 8,
    IE11: 8,
    IE12: 8
};

var Browser = function () {
    try {
        //declares
        var type;
        var version;
        var sVersion;

        //process
        switch (navigator.appName.toLowerCase()) {
            case "microsoft internet explorer":
                type = BrowserTypes.IE;
                sVersion = navigator.appVersion.substring(navigator.appVersion.indexOf('MSIE') + 5, navigator.appVersion.length);
                version = parseFloat(sVersion.split(";")[0]);
                switch (parseInt(version)) {
                    case 7:
                        type = BrowserTypes.IE7;
                        break;
                    case 8:
                        type = BrowserTypes.IE8;
                        break;
                    case 9:
                        type = BrowserTypes.IE9;
                        break;
                    case 10:
                        type = BrowserTypes.IE10;
                        break;
                    case 11:
                        type = BrowserTypes.IE11;
                        break;
                    case 12:
                        type = BrowserTypes.IE12;
                        break;
                }
                break;
            case "netscape":
                if (navigator.userAgent.toLowerCase().indexOf("chrome") > -1) { type = BrowserTypes.Chrome; }
                else { if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) { type = BrowserTypes.FireFox } };
                break;
            default:
                type = BrowserTypes.Unknown;
                break;
        }

        //returns
        return type;
    } catch (ex) {
    }
};

Entonces todo lo que tienes que hacer es usar cualquier funcionalidad condicional como…

Ie. value = (Browser() >= BrowserTypes.IE) ? node.text : node.textContent;

o WindowWidth = (((Browser() >= BrowserTypes.IE9) || (Browser() < BrowserTypes.IE)) ? window.innerWidth : document.documentElement.clientWidth);

o sJSON = (Browser() >= BrowserTypes.IE) ? xmlElement.text : xmlElement.textContent;

¿Tienes la idea? Espero que esto ayude.

Oh, es posible que desee tener en cuenta el control de calidad de la función Browser() después de que se lance IE10, solo para verificar que no cambiaron las reglas.

Deja un comentario