В 2023 году я уже писал про довольно простой, но полезный трюк: если нужно спрятать свой JavaScript от лишних глаз, его можно аккуратно завернуть внутрь какого-нибудь стандартного js-файла. Чаще всего под такую задачу берут jQuery, потому что на лендах и прелендах она встречается сплошь и рядом.
Здесь я решил довести эту историю до ума: показать, куда именно вставлять свой JS, как потом его вызывать, можно ли вставить свой JS не в чужой скрипт, а куда-то ещё (СПОЙЛЕР: да, можно!), и как всю эту возню автоматизировать.
Куда и как вставляем
Принцип тут всегда один и тот же (кэп!):
- берём файл, внутрь которого хотим что-то спрятать;
- находим стабильную точку вставки = создаём отдельную функцию или метод класса;
- добавляем туда свой код;
- один раз вызываем нашу функцию/метод изнутри файла.
С jQuery схема получается такой:
- в
jQuery 3.7.1ищем строкуjQuery.isArray = Array.isArray;; - в
jQuery 4.0.0ищем строкуjQuery.expr[ ":" ] = jQuery.expr.filters = jQuery.expr.pseudos;; - добавляем со следующей строки свою функцию;
- вызов этой функции в обеих версиях лучше ставить перед
jQuery.noConflict, после присваивания_$ = window.$;.
Имя функции лучше выбрать нейтральное и техническое, чтобы оно не торчало посреди файла как бельмо на глазу. Например:
jQuery.setColorScheme = function () {
console.log("Hello World");
};
Дальше эту функцию нужно один раз вызвать изнутри самого jQuery:
var
_jQuery = window.jQuery,
_$ = window.$;
jQuery.setColorScheme();
jQuery.noConflict = function( deep ) {
Куда ещё?
Если вы думаете, что свой js-код можно вставить только внутрь другого js, то…. НЕТ! Такую же историю можно провернуть и с файлами формата SVG.
Это гораздо более беспалевный вариант, поскольку редко кто смотрит в содержимое этих самых SVG. Все думают, что это просто такие хитрые картинки.
Чтобы вставить в SVG работающий JavaScript, нужно чуть-чуть схитрить. Тело скрипта необходимо обернуть в CDATA, потому что SVG — это XML: если внутри попадутся <, & и прочие спецсимволы, XML-парсер начнёт видеть в них разметку. Поэтому делаем так:
<script><![CDATA[
console.log("Hello from SVG");
]]></script>
После того, как скрипт вставлен внутрь SVG, саму «картинку» надо подключить внутрь лендинга тоже не самым обычным способом! Стандартный тег <img> не прокатит! Вместо этого у нас есть следующие вариант: inline SVG, object, embed, iframe. Вот примеры каждого.
Inline SVG
Inline — это тупо вставка всего кода SVG внутрь HTML, типа:
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="160" viewBox="0 0 320 160">
<rect width="320" height="160" fill="#ffd86b" />
<script><![CDATA[
console.log("Hello from inline SVG");
]]></script>
</svg>
Если SVG достаточно большой, то засунуть туда небольшой скрипт и пролететь под радарами вполне реально!
Object
<object
data="/assets/banner.hello-svg.svg"
type="image/svg+xml"
width="320"
height="160">
</object>
Embed
<embed
src="/assets/banner.hello-svg.svg"
type="image/svg+xml"
width="320"
height="160">
Iframe
<iframe
src="/assets/banner.hello-svg.svg"
width="320"
height="160"
frameborder="0">
</iframe>
Автоматизация
Чтобы не лезть в jQuery или в SVG руками, я собрал небольшой скрипт: embed-js.js.
У него два режима:
--jquery— встраивание payload внутрьjQuery;--svg— встраивание payload внутрьSVG.
Имя выходного файла helper собирает сам из имени исходника и имени payload.
Примеры:
jquery-4.0.0.js+ywbackfix.js->jquery-4.0.0.ywbackfix.jssvg-active.svg+hello-svg.js->svg-active.hello-svg.svg
Пример запуска для jQuery:
node embed-js.js `
--jquery jquery-4.0.0.js `
--payload ywbackfix.js `
--method setColorScheme `
--minify
Пример для SVG:
node embed-js.js `
--svg svg-active.svg `
--payload hello-svg.js
Для jQuery helper сам определяет версию библиотеки и сам подбирает нужную точку вставки для 3.7.x или 4.0.x.
Outro
При заимствовании чужих лендингов из спаев помните, что они могут содержать вот такие вот «приятные» подарки. Ну и сами не забывайте добавлять эти подарки в свои ленды для коллег! А у меня на этом всё, на связи был Жёлтый, лейте в плюс, господа!


