Arhn - архитектура программирования

требовать jQuery для безопасной переменной в скрипте и консоли Tampermonkey

Обычно я использую следующий фрагмент кода, и он обычно работает:

(function () {
    function main() {
        //...script body...
    }

    var OGloboCSS = { // var could be named anything, appropriate to the page
        addJQuery: function (callback) {
            var script = document.createElement("script");
            script.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js");
            script.addEventListener('load', function () {
                var script = document.createElement("script");
                script.textContent = "window.jQ=jQuery.noConflict(true);(" + callback.toString() + ")();";
                document.body.appendChild(script);
            }, false);
            document.body.appendChild(script);
        }
    };

    OGloboCSS.addJQuery(main);

})();

Но иногда я получаю подобную ошибку на https://steamcommunity.com:

Отказался загружать скрипт 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js», поскольку он нарушает следующую директиву Content Security Policy: «script-src 'unsafe-eval' 'self' 'unsafe-inline' 'unsafe-eval' https://steamcommunity-a.akamaihd.net/ https://api.steampowered.com/ http://www.google-analytics.com https://ssl.google-analytics.com https://www.google.com https://www.gstatic.com https://apis.google.com".

И решение в основном заключается в том, что вместо этого вы должны использовать директиву заголовка TamperMonkey @require, что-то вроде этого:

// @require      https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// ==/UserScript==

window.jQ = $;

(function () {
/*this used to be: function main() */
    //...same script body, without container function...

})();

И это прекрасно работает, но небезопасно загружает jQuery в переменную jQ, он стирает $. Это действительно проблема? Да, вы можете видеть это по тому, как разбивается пагинация в ветках обсуждений на steamcommunity.com.

Есть ли какой-то способ @require jQ=, а затем @grant jQ, который по-прежнему дает мне jQ как в скрипте Tampermonkey, так и в консоли, без затирания переменных на странице?


  • вы можете использовать tampermonkey для отправки внешнего скрипта, и в этом внешнем скрипте используйте JQ без конфликтов вверху или загруженный amd. 13.02.2015

Ответы:


1

Помимо предотвращения конфликтов версий и разрыва страницы содержимого, я делаю несколько других вещей в своем шаблоне пользовательского скрипта по умолчанию, который включает jQuery.

Приведенный ниже шаблон направлен на достижение следующих целей в интересах того, чтобы быть универсальным шаблоном для включения jQuery в новые сценарии независимо от текущего или будущего статуса страницы содержимого в отношении собственного включения или отсутствия jQuery любой версии.

  • избегайте изолированной программной среды безопасности с помощью @grant none
  • в целом не обращайте внимания на то, где скрипт вставляется/когда он выполняется
  • включить конкретную версию jQuery для нашего UserScript
  • Сохраните ссылки $ и jQuery на странице содержимого, какими бы они ни были, jQuery или нет.
  • Разрешить нашему скрипту использовать псевдоним $ для своей версии jQuery.

Использование @grant none здесь является ключевым

//@grant          none

@grant none работает для 99% моих скриптов. Это позволяет легко получить доступ к переменным, функциям и объектам страницы содержимого, поддерживая глобальную область действия для UserScript (это) и предоставляя неквалифицированный доступ к глобальной области действия (окну) страницы содержимого путем поиска переменных, идентификаторов функций в обеих областях в этом , порядок окон. Таким образом, если вы избегаете дублирования идентификаторов, существующих на странице содержимого, вы можете получить доступ к переменным, функциям и возвращаемым значениям страницы содержимого без уточнения ("это" или "окно"). И вы можете сделать это из любого места в вашем скрипте.

Это подчеркивает оригинальную проблему ОП. Удобство, которое обеспечивает @grant none, также является причиной того, что директива @require перезаписывает ссылки $ и jQuery окна при его загрузке. Библиотека jQuery уже давно включает функцию noConflict() для решения только этой проблемы.

Мы можем сразу же внести некоторые быстрые улучшения в ответ выше, чтобы повысить нашу безопасность/совместимость/повторное использование.

window.jQ = $.noConflict(true);
  • Этот вызов не указывает явно $ на область
  • И это не будет работать особенно хорошо, если страница контента также включает какую-то другую библиотеку с псевдонимом $. Особенно, если страница содержимого уже вызвала jQuery noConflict до того, как мы сюда доберемся. Это ненужная кроличья нора, в которую можно попасть.
  • Этот код несколько тревожно помещает ссылку на нашу библиотеку в область действия окна, где она вполне может быть позже каким-то образом изменена страницей содержимого. Как правило, показывать что-либо в области действия окна по очевидным причинам — плохая практика.

Этот код вместо

this.$ = window.jQuery.noConflict(true);
  • Сохраняет нашу библиотеку в нашей области, где она принадлежит
  • дает нам псевдоним $ в нашей области видимости для дальнейшего использования в нашем скрипте
  • восстанавливает псевдонимы окна $ и jQuery до тех, которые были, когда наш jQuery загружался, независимо от того, были ли они на самом деле jQuery или нет
  • дает нам лучший шанс использовать объект jQuery, загруженный сценарием, для вызова noConflict

Этот последний пункт, вероятно, является излишним, но почему бы не быть явным и не использовать идентификатор jQuery для вызова noConflict. Хотя на данный момент это была бы наша вина, если бы $ не был jQuery, когда этот вызов запускается (@require для другой библиотеки, которая использует $, используя ее самостоятельно перед запуском этого кода и т. д.), это бесплатное предотвращение последующей отладки.

Хотя мы могли бы быть довольны этим, мы также можем пойти немного дальше, чтобы обеспечить совместимость на самом широком спектре страниц и на самых разнообразных изменениях страниц контента.

(function ($, undefined) {
  $(function () {
    //Your code here;
  });
})(window.jQuery.noConflict(true));

Хотя это еще не гарантируется, этот шаблон дает вашему функциональному коду наилучшие шансы на выполнение в самых разнообразных возможностях жизненного цикла страницы, сохраняя псевдоним $ из глобальной области видимости и используя событие jQuery DOM Ready для обеспечения завершения страницы. Кроме того, это также обеспечивает согласованное неопределенное значение для вашего кода.

// ==UserScript==
// @name          jQuery safe inclusion template
// @description   include jQuery and make sure window.$ is the content page's jQuery version, and this.$ is our jQuery version.
// @version       0.0.1
// @author        Sonic Beard
// @match         http://*.site.com/*
// @require       http://cdn.jsdelivr.net/jquery/2.1.3/jquery.min.js
// @grant         none
// ==/UserScript==

(function ($, undefined) {
  $(function () {
    //Your code here;
  });
})(window.jQuery.noConflict(true));
31.03.2015
  • позвольте мне посмотреть, как наградить вас тоже ... это был такой хороший ответ, что он заслуживает признания. 01.04.2015

  • 2

    TamperMonkey, похоже, не имеет такой функциональности, но альтернативой может быть немедленный вызов $.noConflict с Аргументу removeAll присвоено значение true. Это приведет к тому, что jQuery вернет исходные $ и jQuery к исходным значениям.

    Пример пользовательского скрипта:

    // ==UserScript==
    // @name         jQuery noConflict test
    // @namespace    http://example.com/
    // @version      0.1
    // @description  test jQuery noConflict
    // @author       You
    // @match        https://steamcommunity.com/
    // @require      https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
    // @grant        none
    // ==/UserScript==
    
    window.jQ = $.noConflict(true);
    

    И вы можете видеть из примера ввода консоли ниже, jQ — это jQuery 2.1.3, который был загружен @require, jQuery — это версия jQuery, которую загружает страница, а $ по-прежнему является исходным объектом библиотеки прототипов, о чем свидетельствует отсутствие jQuery. fn собственность.

    Пример консольного ввода/вывода:

    > jQ.fn.jquery
    < "2.1.3"
    > jQuery.fn.jquery
    < "1.11.1"
    > $.fn
    < undefined
    
    07.02.2015
  • спасибо Александр. Я занят сегодня, но посмотрю, как применить это завтра (2.10.2015) — я ценю помощь и дам вам кредит, если это сработает для меня, даже если вы не можете точно сказать о функциональности Tampermonkey. 10.02.2015
  • хахха, я почти не смог заставить его работать, потому что мне не удалось скопировать самый первый символ в комментарии UserScript — еще раз спасибо, работает так, как рекламируется. 11.02.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..