恢复Bilibili旧版页面,为了那些念旧的人。
< Σχολιασμός για τον κώδικα Bilibili 旧播放页
感谢反馈,大佬不敢当,只是由于本脚本的缘故造成其他同域脚本功能异常才是十分抱歉
原理我也不清楚,只知道就算是本脚本document.write()
之后直接调用GM_setValue
也是失效的,进一步测试似乎有办法可以规避,代码如下:
document.open();
document.write("Loading...");
document.close();
GM_setValue("aaaaaaaaaaaaaaaa", 1);
setTimeout(() => GM_setValue("bbbbbbbbbbbbbbbbbbb", 2), 1000);
unsafeWindow.onclick = () => {GM_setValue("ccccccccccccccccccccccc", 3)}
无论是否启用run-at document-start
,只要前面调用了document.write()
,那么aaaaaaaaaaaaaaaa
便无法写进存储,而bbbbbbbbbbbbbbbbbbb
和ccccccccccccccccccccccc
可以。
对比一下三者的差别:第一个是直接调用,第二个是写在setTimeout
回调里调用,第三个是event
回调调用。
是不是说明其他同域脚本绕道异步调用是可行的,比如加一个很短的setTimeout
回调,而不是像我之前提议的使用临时设置什么的?
进一步测试表明:上述是同在一个脚本中的情况,异步是可行的。
但如果是另一个脚本在启用run-at document-start
的情况下,异步调用也是没用的……
我就奇怪了,先GM_setValue
后GM_getValue
获取到的明明是修改过后的数值,然而实际又没有写进脚本存储里,那是写进了哪里?
很抱歉!看来目前由本脚本所导致的无法储存设置数据进脚本储存的问题时无法根本上解决了。
缓和的办法;
document.write()
之前)GM_setValue
,如非必要,尽量不以run-at document-start
运行脚本(如果不像本脚本一样要动整个网页框架run-at document-body
或许是个不错的替代)用 Tampermonkey 调试一下,找到出现问题的原因了。
在 Tampermonkey 的源代码中其实提到了这个问题,文件大概在这样的路径下:...\Extensions\dhdgffkkebhmkfjojejmpbldmpobfkfo\4.10_0\content.js
。
'use strict';(t=>{const f=t.rea;if(void 0!==f.globals._content)console.warn('content: Stop here, cause a second Tampermonkey instance was detected!\nThis can be caused by using "document.write" at Userscripts.\nSee https://code.google.com/p/chromium/issues/detail?id=253388 for more information');
......
也就是说在使用了 document.write()
之后,会创建新的 Tampermonkey 实例,使用 "GM_" 函数可能会重复执行导致页面崩溃。所以作者采取了中断操作。
感谢,看来document.write()
终究不是完美的操作,可惜除此之外我也找不到其他替代实现,兼容问题只能由其他脚本方主动兼容了
GM_setValue
问题。// @run-at document-start
的脚本中,当脚本在页面内使用document.write()
后, 其他脚本中的GM_setValue
等 GM 函数能否生效似乎是与各脚本间的执行顺序 (即脚本在 Tampermonkey 的位置) 是有关联的,这个顺序(位置)默认就是按脚本安装的先后顺序排列的。document.write()
后,其他脚本位置靠后的脚本如 "Bilibili Evolved" 此时是无法保存设置到存储当中的。而反之其他脚本便可正常运作。GM_setValue
等函数"失效"。😂