1

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

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

Error: Object doesn't support property or method 'keyPress'

我发现一些屏幕有一个查询表单,其名称和 ID 为“查询”。在 IE10 中,这似乎出现在全局范围内,并覆盖了 javascript 中的对象文字。有关信息,搜索框不在此表单内。

我已经用 onKeypress 代码替换了alert(Query);,我看到[object HTMLFormElement]它确认了正在发生的事情。

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

4

2 回答 2

2

这个问题可以通过使用你自己的命名空间来解决,而不是一次又一次地污染全局作用域。

var MY_STUFF = {};

MY_STUFF.Query = function () {};
MY_STUFF.MY_CONST = 4;
MY_STUFF.utilityFunction = function () {};

...这样,如果您添加一个名为 的表单元素,一切都会中断MY_STUFF,但如果您添加名为 的表单元素,它不会中断QueryMY_CONST或者utilityFunction(不是最好的名称,但您明白了要点)。

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


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

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

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

// Note you can't use it outside of the closure.
于 2013-04-18T11:57:28.040 回答
0

可能,这应该工作。声明变量 Query 时,在它之前提供一个 var 关键字。

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

Query = new Object (); //wrong practice
于 2013-04-18T11:49:22.287 回答