窗口对象在Chrome和IE中表现得很奇怪

时间:2011-05-25 20:15:36

标签: javascript

考虑以下示例HTML:

<div id="about">
 <!-- content here -->
</div>

以下脚本

var about = (function ($, window, document) {
    "use strict";

     var methods;

     methods = {
        init: function () {
        // Do things here 
        }
     };

     return methods;
} (jQuery, window, document));

此时变量about应附加到window对象。

在Firefox(3.6.17)中,我可以写

window["about"] 

如果尚未处理,那么这将返回undefined如果有,它将按照我的预期返回对象。

然而,问题是Chrome和IE(7&amp; 8)中的相同代码window["about"]会返回实际的HTML对象。从上面的示例中,它将返回以下内容:

    <div id="about">
     <!-- content here -->
    </div>

为什么会这样?

此外,有没有比使用about元素更好的方法来检查window对象是否可用?我理所当然地意识到一个人不想把窗户对象扔掉,但这是一个不同的问题。

由于

4 个答案:

答案 0 :(得分:4)

WebKit浏览器似乎模仿了将元素“id”值视为window对象属性的旧IE行为。

我个人不喜欢这种行为。

答案 1 :(得分:1)

Chrome会在HTML中获取任何ID并将其转换为全局变量。你可以改写作业,但我认为你正在检查是否存在而不是覆盖?

http://jsfiddle.net/robert/Hnw7y/

答案 2 :(得分:1)

区分HTMLElement和函数的一种方法是检查对象的类型:

if (typeof window.about === 'function') {
    // the 'about' function has been defined
}

答案 3 :(得分:0)

不幸的是,唯一可以做到这一点的方法如下:

function global(name) { return eval(name); }

if( global("about") )
   ...

试试这个:http://jsfiddle.net/PMqPv/1/