読者です 読者をやめる 読者になる 読者になる

Minibufferで複数のPinを開くとブロックされる件の対応

Minibuffer

id:seltsam より、setTimeoutでずらして回避というアイディアを頂きました。Thx!
そういえば、LDRもそれでポップアップブロックを回避してました。

というわけで、以前書いたeachLater関数を使ってみました。

window.Minibuffer.addCommand({
	name: 'open',
	command: function(stdin){
		var target = this.args.shift();
		if(target == 'top' || target == 'blank') target = '_' + target;
		eachLater(stdin,100,function(url){
			if(target){
				window.open(url, target);
			}else{
				GM_openInTab(url);
			}
		});
		return stdin;
	}
});

ここはforEach関数をeachLater関数に置き換えただけ。

function eachLater(arr,ms,call,callback,ob) {
	var self = arr;
	var obj = ob || typeof(callback) != 'function' ? callback : null;
	var res = {
		complete: false,
		cancel: function(){
			clearInterval(PID);
		},
		notify: function(){
			clearInterval(PID);
			if (callback && typeof(callback) == 'function') callback.call(obj,self);
		}
	};
	var len = self.length;
	var i = 0;
	var PID = setInterval(function(){
		try{
			call.call(obj,self[i],i);
		} catch (e) {
		} finally {
			i++;
			if (i >= len) {
				clearInterval(PID);
				res.complete = true;
				if(callback && typeof(callback) == 'function') callback.call(obj,self);
			}
		}
	},ms);
	return res;
}