IE10-避免javascript在全局范围内使用表单名称
我有一个带有搜索框的web应用程序,一个onKeypress事件调用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中的对象文本。有关信息,搜索框
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个这样的地球人了。