Могу ли я получить версию usercript и использовать ее на другой веб-странице? - PullRequest
0 голосов
/ 19 ноября 2018

Итак, я знаю, что вы можете получить информацию о версии скрипта пользователя и использовать ее в качестве переменной в скрипте пользователя, например ...

// @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>

У меня есть пользовательский скрипт, связанный с помощью тега script на странице install.html (это может быть причиной того, что это не работает):

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

со строкой кода

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

Что я делаю не так или это вообще возможно.

Примечание: я хочу, чтобы это работало, даже если у человека нетПользовательский скрипт установлен.

1 Ответ

0 голосов
/ 19 ноября 2018

Да, вы можете отображать данные пользовательского сценария на веб-странице при условии, что веб-страница или ваш хост-сервер могут видеть и GET сценарий (возможно, междоменный).

Но <script src="Scripts/scriptName.user.js"> не будет работать, потому что:

  1. Он читает и запускает скрипт как ванильный javascript. У вас нет возможности прочитать исходный код или комментарии, где скрываются метаданные скрипта.
  2. Многие хосты скриптов, такие как GitHub, вообще не будут передавать файл в тег <script> (CORS заблокирован). Или некоторые делают, но отправляют неправильный тип пантомимы.
  3. Tampermonkey не может запускать для <script> узлов , и это могло бы стать серьезной катастрофой для безопасности, если бы это было возможно.
  4. Очевидно, что GM_info не будет доступен.
  5. Фактически, если скрипт использует какие-либо нативные функции Tampermonkey функции , он будет аварийно завершать работу, даже если он загружается. Обратите внимание, что это не означает метаданные. Это само по себе безвредно.
  6. То же самое, если нужны активы @require или @resource. (И не загружается независимо от страницы.)


Вы должны прочитать в тексте пользователя как текст , а затем проанализировать строку для получения информации о версии.

Например, для этот пользовательский скрипт :

// ==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>
...