Greasy Fork

CKAutoLoader

[已弃用] CKAutoLoader用于在哔哩哔哩播放器页面延后加载脚本,参考了Pakku弹幕插件的加载方式。

目前为 2020-06-15 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/405344/816331/CKAutoLoader.js

// ==UserScript==
// @name         CKAutoLoader
// @namespace    blbljsloader.ckylin.site
// @version      0.1
// @author       CKylinMC
// @grant        unsafeWindow
// @license      GPLv3 License
// ==/UserScript==
if(!window.CKAutoLoader){
	window.CKAutoLoader = {
		loaded: false,
        loader_Started: false,
		cblist:{},
		retry_count: 50,
		reg: function(name,callback){
			if(window.CKAutoLoader.loaded){
				if(callback instanceof Function){
					callback();
				}
				return;
			}
            if(!window.CKAutoLoader.loader_Started){
               window.CKAutoLoader.loader();
            }
			window.CKAutoLoader.cblist[name] = callback;
		},
		canInject: function(){
			//参考pakku的检测加载机制
			var blplayer = document.querySelector("div.bilibili-player");
			if (blplayer && !blplayer.querySelector(".bilibili-player-auxiliary-area")) {
				blplayer = blplayer.closest("body");
			}
			if (blplayer) {
				var list_elem = blplayer.querySelector(".bilibili-player-danmaku, .player-auxiliary-danmaku-wrap")
			}
			if (!blplayer || !list_elem) {
				return false;
			}
			return true;
		},
		loader: function(){
            window.CKAutoLoader.loader_Started = true;
			console.log("CKAutoLoader: try inject...");
			if(!window.CKAutoLoader.canInject()){
				if(window.CKAutoLoader.retry_count==undefined || --window.CKAutoLoader.retry_count<=0){
					console.error("CKAutoLoader: Can NOT inject scripts.");
					return;
				}
				setTimeout(function(){window.CKAutoLoader.loader()},200);
				return;
			}
			window.CKAutoLoader.loaded = true;
			for(func in window.CKAutoLoader.cblist){
				if(window.CKAutoLoader.cblist[func] instanceof Function){
					try{
						window.CKAutoLoader.cblist[func]();
					}catch(e){
						console.error("CKAutoLoader: Errored while call: "+func+e);
					}
				}else{
					console.error("CKAutoLoader: Can NOT call: "+func);
				}
			}
		},
	};
}