0

情况:有大量的 JavaScript 文件。我想在 Node.js 上运行它们。

但是有几个地方alert()使用了 eg,这会导致 Node.js 失败。

当然,有办法查看每个文件并添加导入,例如

alert = require('console').log

但这会阻止那些文件在客栈浏览器(在客户端)工作。

有没有办法注入不同的实现alert那就是在不修改源的情况下更改/添加功能实现?

4

2 回答 2

2

在代码的开头,写:

global.alert = console.log;

于 2013-09-17T08:37:03.100 回答
1

基础版

在一个文件里面silentalert.js

if(typeof global != "undefined"){
  global.alert = typeof console != "undefined" && console.log ? console.log.bind(this) : function(){};
}

在您的 NodeJS 脚本中:

require('./silentalert');

此代码将在 NodeJS 中打印警报消息,但在浏览器中运行时console.log仍会使用。alert

下一个实现提供了一种更通用的方法。


跨平台版本

在一个文件里面silentalert.js

var g           = typeof global != "undefined" ? global : (typeof window != "undefined") ? window : {};
var c           = typeof console != "undefined" && console.log ? console.log.bind(this) : function(){};
var _old        = g.alert;
var silentalert = function(activate){
  g.alert       = activate ? c : _old;
};
if(typeof module !== "undefined"){module.exports = silentalert;}

在 NodeJS 脚本中:

var silentalert = require('./silentalert');
silentalert(true); 
// or silentalert(typeof window == "undefined") if you just want to silent alert() on NodeJS
// your script...
silentalert(false);

您甚至可以直接在 HTML 页面中包含 silentalert.js:

<script src="./silentalert.js" type="text/javascript"></script>
<script type="text/javascript">
silentalert(true);
// your script...
silentalert(false);
</script>

注意:如果您需要支持 IE8 ,在这种情况下.bind将不可用,请替换:

var c = typeof console != "undefined" && console.log ? console.log.bind(this) : function(){};

var c = typeof console != "undefined" && console.log ? function(){console.log.apply(console, arguments);} : function(){};

这两个脚本都允许您在 NodeJS 中静默警报,同时仍然能够在客户端使用它们。

于 2013-09-18T10:35:23.993 回答