上面提供了两个基本模块的两种使用方法。
脚本分为三个部分。
1. 脚本信息部分
此部分是脚本管理器识别脚本的重要组成部分。
// ==UserScript==
// @name 合并扩展模块
// @namespace showav-sideload-mods
// @version 1.0
// @description 一次添加多个扩展模块
// @author CKylinMC
// @match https://www.bilibili.com/video*
// @match https://www.bilibili.com/medialist/play/*
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
这是一个示例脚本信息块,包含脚本名@name
、命名空间@namespace
、版本号@version
等信息,其中脚本名和命名空间最好不要重复,@match
代表脚本在哪里运行。
根据需要,可以自己增加运行的页面。*
是通配符,代表任意字符。
@grant
是授权。脚本想要访问页面内容需要声明权限具体可以参考下面的文档。@run-at
是指脚本运行时机,时机错误可能导致模块失效。
脚本信息文档:https://www.tampermonkey.net/documentation.php#metadata
下方脚本代码全部运行于闭包模式((function(){})()
),这段不再讲述。
2. 模块缺省声明
if(!unsafeWindow.ShowAVModules) unsafeWindow.ShowAVModules = {};
如果模块是第一个运行的模块,那么页面中可能还没有创建用于存储模块信息的对象,这里提前判断和创建这个对象。
3. 模块内容
模块内容又可以分为4个部分,模块信息(模块ID、模块名、模块介绍),模块加载运行函数,模块点击运行函数,模块长按运行函数。
3.1 模块信息
以前一种模块定义方式为例。
//...
unsafeWindow.ShowAVModules['showVideoCate'] = {
name: "投稿分区",
description: "投稿所在分区",
//...
这里在模块根(ShowAVModules)下创建ID为showVideoCate
的模块,定义模块显示名为投稿分区
,描述为投稿所在分区
。
模块ID必须是唯一的,后定义的会覆盖先定义的模块。
模块名和模块描述用于在设置中显示模块,不产生实际效果。模块描述可以不写。
3.2 加载函数
//...
onload: function(){
return document.createTextNode("分区:"+(unsafeWindow.channel?unsafeWindow.channel:"未知"));
},
//...
此段代码创建键onload
,并定义了函数作为值。
当ShowAV载入信息条时,此处方法将被调用,其返回值将被插入到信息条中显示,因此返回值必须是有效的HTML节点。
模块可以使用脚本提供的很多预置工具,如CKTools等,它们被传递到了this中。使用方法是将它们从this中解构出来,然后直接调用。
一些常用的工具:
* av_root : 容器HTML节点
* config : 脚本的配置
* av_infobar : 原本信息条HTML节点
* infos : 视频API信息
* CKTools : CKTools组件(domHelper, modal, bili等)
* popNotify : 右上角浮动信息条组件
* tools : 其他工具,比如 copy : 复制,copy('要复制的文本')
使用方法:
const {infos,CKTools,tools}=this;
infos.xxx//...
推荐使用CKTools.domHelper创建DOM。
modal和popNotify分别对应弹窗和提示条,参考脚本示例即可。
3.3 点击函数和长按函数
//...
onclick: function (e){
const {infos,CKTools}=this;
CKTools.modal.alertModal('投稿分区','此投稿所在分区为'+(unsafeWindow.channel?unsafeWindow.channel:"未知"),'OK');
},
onhold: ()=>{}
//...
点击函数onclick
和长按函数onhold
是可选操作,但是必须填写。onclick函数在定义的模块被点击时触发,而长按函数在鼠标左键长按时触发。
与onload
相同,这两个函数中也可以使用this解构出工具,但是这两个函数不要求返回值。
若不需要,填写()=>{}
即可忽略。