IE9 JavaScript错误:SCRIPT5007:无法获取属性“ui”的值:对象为空或未定义。

44

我的网站在Chrome、Firefox和Internet Explorer 8上运行良好。但是在Internet Explorer 9上,只要将鼠标悬停在组件上,就会触发非常奇怪的错误。

SCRIPT5007: 无法获取属性“ui”的值:对象为 null 或未定义 ScriptResource.axd?d=sTHNYcjtEdStW2Igkk0K4NaRiBDytPljgMCYpqxV5NEZ1IEtx3DRHufMFtEMwoh2L3771sigGlR2bqlOxaiwXVEvePerLDCL0hFHHUFdTOM0o55K0&t=ffffffffd37cb3a1,第181行第1914个字符

跟随javascript中的链接可以看到以下代码:

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

我对如何解决这个错误有点糊涂。 我看到这个解决方案,但对我来说并没有解决问题。 有什么想法吗?


许多JavaScript库(特别是非最新版本)在处理IE9时表现不佳,因为它在处理许多事情上与IE8有所不同。检测IE的JS代码在IE9中经常会失败,除非这样的代码被重写以专门处理IE9。在更新JS代码之前,您应该使用“X-UA-Compatible”元标记将您的网页强制转换为IE8模式。 - Stephen Chung
非常感谢,这解决了我的问题。请将该评论作为答案提供,我会接受它。 - Soroush Hakami
8个回答

149

许多JavaScript库(尤其是旧的库)在处理IE9时存在问题,因为它与IE8在许多方面的处理方式不同。

检测IE的JS代码会在IE9中经常失败,除非这些代码被重写以专门处理IE9。

在JS代码更新之前,您应该使用“X-UA-Compatible”元标签将您的网页强制转换为IE8模式。

编辑:真不敢相信,3年后我们已经使用IE11,并且仍然有人点赞。:-)现在大多数JS库至少支持IE9,而且大多数都支持IE10,因此您现在不太可能需要这个元标签,除非您不打算升级您的JS库。但要注意,IE10更改了有关跨域脚本编写的内容,一些基于CDN的库代码会出错。检查您的库版本。例如,CDN上的Dojo 1.9会在IE10上出错,但是1.9.1解决了这个问题。

编辑2:您真的需要把您的工作做好了。现在已经是2014年中期了!我仍然得到了推荐!修订您的站点以消除对旧版IE的依赖!

叹气...如果我知道这将成为我最受欢迎的答案,我可能会花更多时间来打磨它......

编辑3:现在已经接近2016年了。推荐仍在不断增加...我想可能还有很多遗留代码...总有一天我们的程序将超越我们...


1
好的,那么如何更新js代码以使它在IE9中工作,而不是设置那个糟糕的meta标签呢?在某些情况下,设置meta标签不是一个选项。 - giorgio79
1
大多数JavaScript库现在已更新以支持IE9+。只需升级到库的最新版本,摆脱meta标签,就可以轻松搞定。 - Stephen Chung
有一天我们的程序将超越我们的寿命... 悲伤但却是真实的。 - naXa stands with Ukraine
1
到目前为止,这是我在Stackoverflow上找到的最好的编辑历史记录))) - Chuck Norris
这并不完全是遗留代码,而是因为我们需要支持旧电脑/旧系统。对于我们来说,IE9用户群体虽然很高,但这是一个现实。 - Edgar Carvalho
显示剩余4条评论

14
我在IE9上遇到了同样的问题。我按照上面的答案并添加了以下代码行:
<meta http-equiv="X-UA-Compatible" content="IE=8;FF=3;OtherUA=4" />

我把它放在了我的<head>里,它起作用了。


我正在尝试在我的jsp页面中包含exporting.src.js,我已经在<head>标签内添加了<meta http-equiv="X-UA-Compatible" content="IE=8;FF=3;OtherUA=4" />标签,但在IE9中问题仍然存在。有人可以帮忙吗?应该怎么做才能避免这个问题? - Disera

5

我已经编写了代码,可以嗅探IE4或更高版本,并且在我的公司客户的网站以及我自己的个人网站上正常运行。

请将以下枚举常量和函数变量包含在您页面的javascript包含文件中...

//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) {
    }
};

那么,您只需要使用任何条件功能,例如...
例如: value = (Browser() >= BrowserTypes.IE) ? node.text : node.textContent; 或者 WindowWidth = (((Browser() >= BrowserTypes.IE9) || (Browser() < BrowserTypes.IE)) ? window.innerWidth : document.documentElement.clientWidth); 或者 sJSON = (Browser() >= BrowserTypes.IE) ? xmlElement.text : xmlElement.textContent; 明白了吗?希望这能有所帮助。
哦,你可能想记住,在IE10发布后,要测试浏览器(Browser())函数,以验证他们没有改变规则。

2

这个方法在IE 11中对我有效:

<meta http-equiv="x-ua-compatible" content="IE=edge; charset=UTF-8">

1
检查是否在末尾有逗号。
                            },
                            {
                                name: 'МОФ. Перелив из баков. м3/ч',
                                data: graph_high3,
                                dataGrouping: {
                                    units: groupingUnits,
                                    groupPixelWidth: 40,
                                    approximation: "average",
                                    enabled: true,
                                    units: [[
                                            'minute',
                                            [1]
                                        ]]
                                }
                            }   // if , - SCRIPT5007

我受到了你的解决方案的启发,于是我更仔细地检查了我的JS缩进,发现它真的很差(由他人编写)。所以我对JS代码进行了正确的缩进,错误消失了。你知道我正在强制 X-UA = IE11。 - Tassoman

0

-1

嗯,你也应该尝试将Javascript代码添加到一个函数中,然后在文档主体加载后调用该函数...这对我有用 :)


-3

我也遇到了同样的问题。

我在 .aspx 页面中使用了下面的代码,但没有在 web.config 文件中编写身份验证配置。在 Web.config 中编写设置后,我能够运行我的代码。

<% If Request.IsAuthenticated Then%>
     <table></table>
<%end if%> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接