GM_Polyfill

Provide GM_functions in non-ScriptManager-environment

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/429613/975941/GM_Polyfill.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

作者
PYUDNG
版本
0.3
建立日期
2021-07-19
更新日期
2021-10-03
尺寸
8.1 KB
授權條款
未知

GM_Polyfill

在没有脚本管理器环境下提供常用的GM_函数和对象,目前提供的函数和对象有:

  • GM_setValue
  • GM_getValue
  • GM_listValue
  • GM_deleteValue
  • GM_xmlhttpRequest
  • GM_openInTab
  • GM_setClipboard
  • unsafeWindow

用法

引用/热加载/引入此js库

请务必确保GM_Polyfill库在您的代码调用相关GM_函数前加载完毕。如果您的脚本运行环境不支持@require,那么您就应动态加载GM_Polyfill库(下为动态加载可用代码),或者将本库的代码复制到您的脚本中。

// Load GM_Polyfill
loadJS('https://greasyfork.org/scripts/429613/code/GM_Polyfill.js', function() {
	// Your code here...
})

// Load javascript from given url
function loadJS(url, callback, oDoc = document) {
	var script = document.createElement('script'),
		fn = callback || function () {};
	script.type = 'text/javascript';

	//IE
	if (script.readyState) {
		script.onreadystatechange = function () {
			if (script.readyState == 'loaded' || script.readyState == 'complete') {
				script.onreadystatechange = null;
				fn();
			}
		};
	} else {
		//其他浏览器
		script.onload = function () {
			fn();
		};
	}

	script.src = url;
	oDoc.getElementsByTagName('head')[0].appendChild(script);
}


使用GM_Polyfill库填补缺失的GM_函数

GM_Polyfill库仅仅提供一个接口:GM_PolyFill函数(注意大小写),调用此函数就会自动填充缺失的GM_函数。
返回值:一个对象,标明了各个函数是否因为缺失而被GM_Polyfill库填补,其结构如下:


const GM_POLYFILLED = {
	GM_setValue: boolean,
	GM_getValue: boolean,
	GM_deleteValue: boolean,
	GM_listValues: boolean,
	GM_xmlhttpRequest: boolean,
	GM_openInTab: boolean,
	GM_setClipboard: boolean,
}
GM_PolyFill函数仅接受一个字符串参数:name。此参数将作为存储空间中访问您的脚本储存空间的凭据,不同的name对应着不同的储存空间。所有的GM_存储函数都将在此name所对应的存储空间下工作。如果不提供此参数,将默认此参数值为'default'。如果您不知道此参数应该填写什么,那么建议填写脚本名称(即@name)+脚本命名空间(即@namespace)



有关name的更多说明
类比来说,就像Tempermonkey存储空间的沙盒机制——即每个脚本的存储空间与其他脚本的存储空间相互独立一样,GM_Polyfill库提供的存储机制和也力图将不同的脚本的储存空间区分开来;但是由于GM_Polyfill库运行在一个没有脚本管理器的低权限环境下,无法区分不同的脚本,于是就通过脚本调用时主动提供一个name参数,依此来区分不同的脚本,并提供不同的储存空间;但请注意,这仅仅能大概率上防止储存空间的意外冲突,但并不能阻止其他脚本甚至是网页代码来试图读取您储存的信息,任何脚本或代码都可以从localStorage中读取您的脚本储存的信息,并修改这些信息(无论是无意的还是有意的)。



说明

有关功能

本程序的工作原理为通过原生js实现了部分GM_函数,所以会有诸多功能上的限制,具体的限制如下:

  • GM_setValue GM_getValue GM_listValue GM_deleteValue的所有数据均存储在localStorage['GM_STORAGE_POLYFILL'][name]下,任何其他代码均能任意访问、修改和删除存储空间内的数据。使用时,应当使用不同的name参数以避免冲突,并且避免存储敏感数据以降低恶意的访问带来的风险。
  • GM_xmlhttpRequest不能执行跨域请求。不支持details参数的synchronous binary nocache revalidate context fetch属性,不支持onload事件处理器函数参数的finalUrl属性
  • GM_openInTab仅仅是通过window.open简单地打开新窗口,仅仅支持参数一(url),不支持参数二
  • GM_setClipboard仅仅在事件处理函数中有效

示例(使用了GM_Polyfill库的)脚本:

轻小说文库+:使用了GM_Polyfill库使其可以完全脱离脚本管理器的执行环境,甚至可以直接通过书签动态加载到页面并正常执行。