我有一个由多个用户脚本使用的库脚本。这个库做了一些繁重的工作(即CPU密集型操作),所以我想只运行该库的一个实例。
这是一个最小的例子:
lib.js
let callbacks = [];
document.addEventListener('click', function(event){
// pretend that something expensive happens in here
for (callback of callbacks)
callback();
});
script1.user.js
// @match foo.bar
// @require lib.js
callbacks.push(function(){
console.log('Script 1: '+callbacks.length+' callback(s) registered');
});
script2.user.js
// @match foo.bar
// @require lib.js
callbacks.push(function(){
console.log('Script 2: '+callbacks.length+' callback(s) registered');
});
使用此设置,鼠标单击后的输出将为:
Script 1: 1 callback(s) registered
Script 2: 1 callback(s) registered
因为每个用户脚本都有自己的库实例。我可以做些什么来使它们使用相同的库实例,所以我得到这样的输出:
Script 1: 2 callback(s) registered
Script 2: 2 callback(s) registered
注意:
@grant none
答案 0 :(得分:1)
最简单的方法是让库脚本将自己分配给窗口,如果它还不存在,标准单例样式。
<强> lib.js 强>
// @require lib.js
const { myLib } = window;
myLibrary.callbacks.push(function(){
console.log('Script 1: ' + myLib.callbacks.length + ' callback(s) registered');
});
<强> script1.user.js 强>
// @require lib.js
const { myLib } = window;
myLibrary.callbacks.push(function(){
console.log('Script 2: ' + myLib.callbacks.length + ' callback(s) registered');
});
<强> script2.user.js 强>
unsafeWindow
根据用户脚本管理员的不同,您可能需要在某些情况下使用Random _rnd = new Random();
int[] input = { 90, 180, 270, 360 }; // dictionary of available numbers
List<int> result = Enumerable.Range(0, 200).Select(x => input[_rnd.Next(0, input.Length)]).ToList();
。