Greasy Fork is available in English.

Bilibili 旧播放页

恢复Bilibili旧版页面,为了那些念旧的人。

< 脚本Bilibili 旧播放页的反馈

评价:好评 - 脚本一切正常

§
发表于:2020-06-19
  • 😉 感谢大佬的答疑解惑,我来反馈一下测试过程中所发现的关于 GM_setValue 问题。
  • 在使用"Tampermonkey"作为脚本管理器时
    • 其他同域下且 // @run-at document-start 的脚本中,当脚本在页面内使用 document.write() 后, 其他脚本中的 GM_setValue 等 GM 函数能否生效似乎是与各脚本间的执行顺序 (即脚本在 Tampermonkey 的位置) 是有关联的,这个顺序(位置)默认就是按脚本安装的先后顺序排列的。
    • 当 "Bilibili 旧播放页" 的位置在前,且在该页面(比如主页)下使用了 document.write() 后,其他脚本位置靠后的脚本如 "Bilibili Evolved" 此时是无法保存设置到存储当中的。而反之其他脚本便可正常运作。
  • 在使用"暴力猴"作为脚本管理器时
    • 即使调整了各脚本间的执行顺序,其他脚本还是会在类似页面上出现无法保存设置到存储的问题,即 GM_setValue 等函数"失效"。😂
§
发表于:2020-06-19

感谢反馈,大佬不敢当,只是由于本脚本的缘故造成其他同域脚本功能异常才是十分抱歉

原理我也不清楚,只知道就算是本脚本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便无法写进存储,而bbbbbbbbbbbbbbbbbbbccccccccccccccccccccccc可以。
对比一下三者的差别:第一个是直接调用,第二个是写在setTimeout回调里调用,第三个是event回调调用。
是不是说明其他同域脚本绕道异步调用是可行的,比如加一个很短的setTimeout回调,而不是像我之前提议的使用临时设置什么的?

§
发表于:2020-06-19
编辑于:2020-06-19

进一步测试表明:上述是同在一个脚本中的情况,异步是可行的。 但如果是另一个脚本在启用run-at document-start的情况下,异步调用也是没用的……

我就奇怪了,先GM_setValueGM_getValue获取到的明明是修改过后的数值,然而实际又没有写进脚本存储里,那是写进了哪里?

很抱歉!看来目前由本脚本所导致的无法储存设置数据进脚本储存的问题时无法根本上解决了。
缓和的办法;

  • 如你上面所测试的,Tampermonkey中,其他同域脚本优先级比本脚本高(猜测优先级更高所以运行在了document.write()之前)
  • 若要使用GM_setValue,如非必要,尽量不以run-at document-start运行脚本(如果不像本脚本一样要动整个网页框架run-at document-body或许是个不错的替代)
  • 使用浏览器自带的api存储数据或者作为中转(比如LocalStorage)
§
发表于:2020-06-19

用 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_" 函数可能会重复执行导致页面崩溃。所以作者采取了中断操作。

§
发表于:2020-06-19

感谢,看来document.write()终究不是完美的操作,可惜除此之外我也找不到其他替代实现,兼容问题只能由其他脚本方主动兼容了

发表回复

登录以发表回复。