我可以获取用户脚本的版本并将其用于其他网页吗?

时间:2018-11-19 06:01:27

标签: javascript html version-control tampermonkey

所以我知道您可以获取用户脚本的版本信息,并将其用作用户脚本中的变量,就像...

// @version      1.2.1
// @grant        GM_info

var version = GM_info.script.version;
console.log(`${version}`); // 1.2.1

我认为我可以在另一个网页上使用该变量。在这种情况下,我想在安装说明页面上显示最新版本,以便说出“脚本名称v.1.2.1”的含义

我的页面(install.html)上有这样的标签

<td>Script Name v.<span id="version"></span></td>

我在install.html页面上使用脚本标记链接了用户脚本(这可能是无法正常工作的原因):

<script src="Scripts/scriptName.user.js"></script>

带有一行代码

document.getElementById("version").innerText=`${version}`;

我在做什么错,还是有可能的。

注意:即使该人尚未安装用户脚本,我也希望它能正常工作。

1 个答案:

答案 0 :(得分:1)

是的,您可以在网页上显示用户脚本数据,前提是该网页或您的托管服务器可以查看并GET脚本(可能是跨域的)。

但是<script src="Scripts/scriptName.user.js">无效,因为:

  1. 它读取并以普通javascript形式运行脚本。您无法读取脚本元数据潜伏的源代码或注释。
  2. 许多脚本托管者(例如GitHub)根本不会将文件提供给<script>标签(CORS被阻止)。或者,有些这样做,但是发送了错误的mime类型。
  3. Tampermonkey无法为<script>个节点触发,如果可能的话,这将是重大的安全灾难。
  4. 很显然,GM_info将不可用。
  5. 实际上,如果脚本使用任何Tampermonkey本机的 功能 ,即使加载该脚本也会崩溃。请注意,这并不意味着元数据。就其本身而言,这是无害的。
  6. 同上(如果需要@require@resource资产)。 (并且不是页面独立加载的。)


您必须以 text 的形式读取用户脚本,然后解析该字符串以获取版本信息。

例如,对于this userscript

// ==UserScript==
// @name        StackExchange, Add kbd, sup, and sub shortcuts
...
// @version     4.2
...

以下代码将获取版本:

$.get ("https://cdn.jsdelivr.net/gh/BrockA/SE-misc/Add_kbd_sup_sub_shortcuts.user.js", scrptTxt => {
    var versionMtch = scrptTxt.match (/\/\/\s+@version\s+([0-9.]+)/i);
    if (versionMtch  &&  versionMtch.length > 1) {
        console.log ("The script is version: ", versionMtch[1]);
    }
    else {
        console.log ("Version metadata not found.");
    }
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


或HTML,您可以将其放在网页的末尾:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
    $(document).ready ( () => {
        $.get ("https://cdn.jsdelivr.net/gh/BrockA/SE-misc/Add_kbd_sup_sub_shortcuts.user.js"
            , scrptTxt => {
            var versionMtch = scrptTxt.match (/\/\/\s+@version\s+([0-9.]+)/i);
            if (versionMtch  &&  versionMtch.length > 1) {
                console.log ("The script is version: ", versionMtch[1]);
            }
            else {
                console.log ("Version metadata not found.");
            }
        } );
    } );
</script>
</body></html>