replace copy flash on Discuz

Replace the "click here to copy" flash on Discuz

< Feedback on replace copy flash on Discuz

Review: Good - script works

§
Posted: 21.02.2020

某一论坛失效

在前几天你这个脚本还能用得好好的,但不知道为什么,突然就不行了。 这个是儿童不宜的网站,而且需要挂科学上网。

链接是 sehuatang.net,随便进高清中文字幕的一个帖子,都会有个磁链可以测试。

这个网站的问题也是非常奇怪,不用脚本的时候,点击复制代码,偶尔会弹出flash的复制界面,偶尔会直接成功复制。所以我一般在这个论坛复制磁链的时候,都会点击两次鼠标。

但近日不知为何,针对这个网站脚本不生效了,但是对卡饭论坛还是能生效的呀。不知能不能修复呢!谢谢!

环境:WIN10 X64,FF72.0.1,暴力猴v2.12.7。

§
Posted: 21.02.2020

前几天还能正常使用脚本,不会弹出flash的复制框,点一下就复制。

TestlaAuthor
§
Posted: 22.02.2020
Edited: 22.02.2020

感谢反馈。

关于脚本失效的原因

我使用 Firefox 73.0.1 进行了测试,也遇到了问题,表现为点击“复制代码”按钮时没有任何提示。我尝试说明一下我的情况,不知道对你是否有帮助。

对“复制代码”按钮右键审查元素,可以看到点击时执行的 JavaScript 代码。它先检查了window.__cfRLUnblockHandlers的值,如果为真才会执行copycode函数。这个copycode函数就是 Discuz 执行“复制代码”功能的函数,位于 /data/cache/common.js 中。这个脚本就是通过替换copycodesetCopy函数来实现的。

搜索window.__cfRLUnblockHandlers,可以知道这个网站使用了 Cloudflare 的 Rocket Loader 来延迟加载 JavaScript。在开发者工具的调试标签页下可以看到 common.js 确实没有被加载。查看控制台标签页,发现是 Rocket Loader 的 js 加载失败了,打印出了这样的日志(用“”隐去了部分信息) `Loading failed for the

TestlaAuthor
§
Posted: 22.02.2020
Edited: 22.02.2020

另外吐槽一下,官网 www.discuz.net 自己都在用旧的 Discuz! X3.3 :/ ……

§
Posted: 23.02.2020

感谢如此详细的解答! 1、无论是common.js还是 rocket-loader.min.js我是能访问的,并且已在缓存中,但是启用本脚本后,依旧无效,仍是论坛默认的复制。

2、恕我愚钝,因我对javascript一窍不通,不知将此两句代码加至何处?不知此图是否正确?如下图所示,即便添加在前或在后,本脚本仍依旧无效。点击复制代码,依旧是论坛默认的复制功能。不知脚本是否有对discuz一劳永逸的解决方案呢?谢谢!

TestlaAuthor
§
Posted: 23.02.2020

我特地加粗强调是模仿着加了,是说分别仿照各处那两句加……不过既然 rocket-loader.min.js 和 common.js 都成功加载了,那就不是 Rocket Loader 加载失败的这种情况。 稳妥起见可以先确认一下脚本有没有被执行,如果有,控制台里会输出一行finished replacing Discuz's copy flash。 测试了一下,原来 Violentmonkey 跟 Tampermonkey 表现有点不同。前者执行脚本的时间比较早,在 common.js 加载前,于是等到 common.js 加载的时候就会把setCopycopycode覆盖回去。下面这一段只改了有效的那一个分支,会等setCopy被定义了再去修改,替换原来的 61-71行(if (greasemonkey4OrGreater) {})应该就可以了。不太擅长 JavaScript,写得有点烂。

    function work() {
        if (greasemonkey4OrGreater) {
            // uses Firefox-specific hack
            // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts
            exportFunction(copyAndHint, window, {defineAs:'copyAndHint'});
            window.eval(
                'window.setCopy = function(text, hint) { copyAndHint(text); };' +
                'window.copycode = function(code_div) { copyAndHint(code_div.textContent); };');
        } else {
            if (unsafeWindow.setCopy === undefined) {
                setTimeout(work, 100);
                return;
            }
            unsafeWindow.setCopy = setCopy;
            unsafeWindow.copycode = copycode;
        }
    };
    work();

如果有空可以给 Firefox 提个 bug,为什么第一次document.execCommand(‘cut’/‘copy’)会被拒绝,能修好的话所有更新了 Discuz 代码的地方都能点一次解决了,其他使用了类似代码的地方也能受惠。其实我觉得点两次能复制还能接受。 一劳永逸当然是不可能的,Discuz 在更新,站长也会自己改(比如这次),适配大量网站成本会很高。要么忍,要么干;要么自己干,要么让别人干。

§
Posted: 24.02.2020

感谢解答! 因为我不是开发者,对firefox的BUG也不知道该怎么从头到尾描述,而且如果有其他开发者发现这个问题,想必应该早已提过吧,有可能是firefox故意而为之。

Post reply

Sign in to post a reply.