在javascript中检测[对象窗口]的“窗口”部分

时间:2012-05-05 23:05:24

标签: javascript node.js

在javascript中检测[对象窗口]的“窗口”部分和/或判断代码是否在节点服务器或浏览器上运行

更多垃圾。我正在为nodejs编写一个模块,该模块应该在客户端和服务器上运行。我需要在几个地方做不同的事情,所以我需要检测它在哪里运行。现在我将“this”传递给init函数,它给出了服务器上的[object Object]和浏览器中的[object Window]。 ...但我不知道如何检查Window / Object部分。 typeof似乎只是检查领先的'对象'部分。思考? 提前致谢

5 个答案:

答案 0 :(得分:1)

如果您确定在node.js中收到[object Object],在浏览器中收到[object Window],那么请检查

var isBrowser = (this.toString().indexOf('Window') != -1);
var isServer = !isBrowser;

字符串的indexOf方法检查该字符串中其参数的位置。返回值-1表示该参数不作为子字符串出现。

更新

正如其他人建议只检查window对象是否存在一样,您可以等效地检查您希望在浏览器中出现的其他对象,例如navigator或{{1} }。但是,这种检查,已在上面提出过:

location

将以node.js中的引用错误结束。正确的方法是

var isBrowser = (this.window == this);

或者,正如我所说的那样

var isBrowser = ('window' in this);

答案 1 :(得分:1)

[object Window]不可靠。无论对象的类型如何,一些旧浏览器只会说[object][object Object]

请改为尝试:

var isBrowser = this instanceof Window;

或者,既然我从未使用过Node.js,那怎么样?

var isBrowser = typeof Window != "undefined";

答案 2 :(得分:0)

如果您只是想知道自己是否在Node上运行,请查看是否this === this.window

if (this === this.window) {
    // Browser
} else {
    // Node
}

这比希望toString的实现是一致的更可靠,但事实并非如此。

答案 3 :(得分:0)

为简单起见,我认为你不能打败:

if('window' in this) {
    // It's a browser
}

答案 4 :(得分:0)

基本上,您正在询问如何在script = x

中检测Node.js.

以下内容是从Underscore.js修改和扩展的,我也使用了一些客户/服务器模块代码的varient。它基本上扫描了node.js有些独特的全局变量(除非你在客户端创建它们= x)

这是为了提供一个替代答案,以防所有需要。

(function() {
    //this is runned globally at the top somewhere
    //Scans the global variable space for variables unique to node.js
    if(typeof module !== 'undefined' && module.exports && typeof require !== 'undefined' && require.resolve ) {
        this.isNodeJs = true;
    } else {
        this.isNodeJs = false;
    }
})();

或者,如果您只想在需要时调用它

function isNodeJs() {
    //this is placed globally at the top somewhere
    //Scans the global variable space for variables unique to node.js
    if(typeof module !== 'undefined' && module.exports && typeof require !== 'undefined' && require.resolve ) {
        return true;
    } else {
        return false;
    }
};