2

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

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

4

5 回答 5

1

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

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

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

更新

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

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

最终会在 node.js 中出现引用错误。正确的方法是

var isBrowser = ('window' in this);

或者,正如我所指出的

var isBrowser = ('navigator' in this);
var isBrowser = ('location' in this);
于 2012-05-05T23:08:15.140 回答
1

[object Window]不可靠。一些较旧的浏览器只是说[object][object Object]不管对象的类型。

试试这个:

var isBrowser = this instanceof Window;

或者,因为我从来没有使用过 Node.js,这个怎么样?

var isBrowser = typeof Window != "undefined";
于 2012-05-05T23:12:18.697 回答
0

为简单起见,我认为您无法击败:

if('window' in this) {
    // It's a browser
}
于 2012-05-05T23:25:07.723 回答
0

基本上,您是在问如何在脚本中检测 Node.js =x

以下是从 Underscore.js 修改和扩展的,我也为我的一些客户端/服务器模块代码使用了一个变体。它基本上会扫描 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;
    }
};
于 2012-05-06T02:10:01.747 回答
0

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

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

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

于 2012-05-05T23:13:23.343 回答