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