IE抛出JavaScript错误:属性“googleMapsQuery”的值为null或未定义,不是函数对象(在其他浏览器中正常工作)

12

我在IE 9中遇到了JavaScript作用域的真正问题。

这段代码位于我的文档主体内(是的,我知道脚本应该放在头部以便于正确的HTML,但我以前从未因此破坏过脚本)。脚本位于主体内部,因为我不想改动一个共享的页眉页面,而这个脚本只与该页面相关:

<script type="text/javascript">
function googleMapsQuery(accountNum) {
    // function code is here (omitted for brevity)
}
</script>

这段代码位于一个 form 块内部的 table 块内部的 tbody 块内部的 tr 块内部的 td 块中,并在 body 块内:

<button id="google-422111" onclick="googleMapsQuery(422111)" type="button">Google This!</button>

我甚至将脚本块移动到表单之上,以防万一脚本函数声明的顺序很重要(但实际上并不重要)。

这个脚本在FireFox和Chrome中完美地工作,但是在IE 9中(无论兼容视图是否开启)我收到以下错误:

SCRIPT5007:属性'googleMapsQuery'的值为null或undefined,而不是函数对象

我研究了JavaScript的作用域,但无法弄清楚为什么IE认为'googleMapsQuery'是一个属性,而且它为什么是未定义的。它是一个函数,并且我已经定义了它!


2
正文是脚本的完美位置,实际上最好放在正文底部 :) - Patrick Lee Scott
在 HEAD 中的脚本标签是同步(串行)处理的,会在处理 body 之前完成。而在 body 中的脚本标签则是异步加载的,与其他脚本和 DOM 节点一起加载...我不使用 <button> 标签,我使用 <input type="button">。 - Steve H.
6个回答

23

我遇到了一个类似的问题,即某个属性为空或未定义。

最终发现是因为IE的文档模式被默认设置为IE7标准。这是由于兼容性视图自动设置为用于所有公司内部网站(工具 > 兼容性视图设置 > 在兼容性视图中显示公司内部网站)。


3
这对我有很大帮助——这个页面是我在谷歌搜索“属性的值为null或undefined,不是函数对象”的时候找到的第一个结果,并且这正是我需要的解决方案。所以非常感谢! - benshepherd

12

我找到了答案,尽管我之前报告的不是浏览器特定的问题。这个错误在我的函数代码中,任何浏览器都会出现这个问题。问题的根本是:我的代码中有两行是针对Firefox/Firebug特定的,它们使用console.log。在IE浏览器中,它们会抛出一个错误,所以我注释掉了它们(或者我当时是这样认为的)。但我注释得很糟糕,导致我的函数括号配对出错。

原始代码(包含console.log):

if (sxti.length <= 50) console.log('sxti=' + sxti);
if (sxph.length <= 50) console.log('sxph=' + sxph);

错误代码(注释中括号放错位置):

if (sxti.length <= 50) { //console.log('sxti=' + sxti); }
if (sxph.length <= 50) { //console.log('sxph=' + sxph); }

修正后的代码(将括号放在注释外面):

if (sxti.length <= 50) { }//console.log('sxti=' + sxti);
if (sxph.length <= 50) { }//console.log('sxph=' + sxph);

所以,这是我的代码不够仔细造成的。因为语法错误没有被正确关闭,所以函数实际上并没有被定义。

好吧,活到老学到老。 ;)


2
在我的情况下,我在我们组织中使用的一个遗留网站上遇到了类似的错误。为了解决这个问题,我必须将该网站列为“受信任的站点”。
操作步骤如下:
- 点击工具按钮,然后选择Internet选项。 - 进入安全选项卡。 - 点击“受信任的站点”,然后点击站点按钮。 - 输入网站的URL,然后点击“添加”。
我把这些信息留在这里,以防万一能帮助到他人。

我发现这对我的情况很有用。我正在维护一些非常老的系统,它们使用vbscript和ocx(该系统过于复杂,无法进行改进),花了3个工作日搜索为什么用户无法访问该站点。nginx访问日志没有显示任何异常,这个答案帮了我一个大忙。给它加上一个赞。 - Mace

2

你是否尝试在onclick="googleMapsQuery(422111);"中添加分号。我没有足够的代码来测试缺少分号是否会导致错误,但ie对语法更加挑剔。


1
这不是分号的问题。函数实际上是未定义的,因为我在注释和括号方面有些粗心。这是真正的语法错误,如果它是可执行代码,将会使我的脚本无法编译。;) - chriv

1

我之前遇到了类似的问题,同样是出现了错误。我忘记了在我的开发机上更改了兼容模式,并且我的javascript代码中也有一个console.log命令。我将IE的兼容模式改回来,并删除了console.log命令。问题解决了。


-1

就在几分钟前,我也遇到了同样的问题。我的问题是,在放置jQuery后立即开始其他jQuery脚本。最终,它会正常工作。


11
我不理解这个回答的意思。 - James Drinkard

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