IE10-避免javascript在全局范围内使用表单名称

IE10-避免javascript在全局范围内使用表单名称,javascript,html,internet-explorer,internet-explorer-10,Javascript,Html,Internet Explorer,Internet Explorer 10,我有一个带有搜索框的web应用程序,一个onKeypress事件调用Query.keyPress()。查询在包含的javascript文件中定义。大多数情况下,这是正确的 在IE10的某些屏幕上,尝试使用搜索框会出现错误: Error: Object doesn't support property or method 'keyPress' 我发现有些屏幕有一个查询表单,其名称和id为“query”。在IE10中,这似乎出现在全局范围中,并覆盖javascript中的对象文本。有关信息,搜索框

我有一个带有搜索框的web应用程序,一个onKeypress事件调用
Query.keyPress()
。查询在包含的javascript文件中定义。大多数情况下,这是正确的

在IE10的某些屏幕上,尝试使用搜索框会出现错误:

Error: Object doesn't support property or method 'keyPress'
我发现有些屏幕有一个查询表单,其名称和id为“query”。在IE10中,这似乎出现在全局范围中,并覆盖javascript中的对象文本。有关信息,搜索框不在此表单中

我已将onKeypress代码替换为
警报(查询)[object HTMLFormElement]
,它确认了正在发生的事情


有人知道如何在IE10上阻止这种情况发生吗?

也许,这应该行得通。声明变量查询时,请在其前面提供一个var关键字

var Query = new Object (); //right practice

Query = new Object (); //wrong practice

这个问题可以通过使用您自己的名称空间来解决,而不是一次又一次地污染全局范围

var MY_STUFF = {};

MY_STUFF.Query = function () {};
MY_STUFF.MY_CONST = 4;
MY_STUFF.utilityFunction = function () {};
。。。这样,如果添加名为
MY_STUFF
的表单元素,一切都会中断,但如果添加名为
Query
MY_CONST
utilityFunction
的表单元素,一切都不会中断(这不是最好的名称,但您可以理解要点)

就像我说的,它不能解决问题,但它否定了问题。污染全球范围也是一种不好的做法


当然,您可以通过闭包完全不使用全局变量。但是,如果您的应用程序分布在多个文件上,并且没有适当的构建过程来组合文件,那么这可能需要大量的重构

(function () {
    var Query = function () {};

    // Query.keyPress() as much as you want!
}());

// Note you can't use it outside of the closure.

Query
更改为
MyQuery
?自从IE支持脚本和元素ID“工作”以来,这个问题就一直存在。解决方法是声明全局变量。你说的声明全局变量是什么意思?Eliran,我当然可以这样做,但我对平台负责。使用此修复程序,只要有人使用名为MyQuery的表单编写屏幕,它就会再次中断。您可以使用
window[“Query”]
访问它,希望它能为您找到正确的对象。事实上,我们已经做到了这一点:查询本身是一个对象文本,它包含了所有与搜索相关的内容。现在只剩下大约4到5个这样的地球人了。