Pull to refresh

UserJS. Часть I: Введение

Opera
Это первая статья из серии, посвященной написанию пользовательских скриптов для Opera. Изначально планировалась одна единственная статья, но она уже перевалила за 10 экранов и все ещё дописывается.
  • Первая статья является кратким описанием пользовательских скриптов (далее userjs), их возможностей и соответствующих настроек Opera. Это вольный пересказ официальной документации. Все, кто написал хоть один userjs, могут с чистой совестью эту часть пропустить.
  • Вторая статья посвящена вопросам переиспользования кода в userjs, а также различным трюкам при написании пользовательских скриптов (далее userjs) для Opera, вроде сохранения настроек, доступа к буферу обмена и кросс-доменных запросов.
  • Третья статья посвящена вопросам безопасности при написании userjs, особенно при использовании продвинутых трюков, которые дают доступ к важным данным или файловой системе.
  • Четвертая статья посвящена userjs framework'у, который является готовой реализацией описанных трюков.

Статьи расчитаны на аудиторию, хорошо знающую javascript и DOM. Описаны только особенности использования javascript в userjs.

Определение


Userjs — это скрипты на javascript, выполняемые Opera перед загрузкой каждой страницы, и позволяющие модифицировать её содержимое.

Настройка Opera


Изначально после установки Opera путь к скриптам в настройках не прописан, таким образом, для использования userjs необходимо зайти в настройки (вкладка «Дополнительно» → пункт «Содержимое» → кнопка «Настроить JavaScript» → поле «Папка пользовательских скриптов JavaScript») и указать путь к папке со скриптами.
Это можно сделать также на странице настроек по адресу «opera:config#UserPrefs|UserJavaScriptFile».

Выполнение userjs при доступе по https по умолчанию выключено для безопасности. При необходимости это можно изменить в настройках («opera:config#UserPrefs|UserJavaScriptonHTTPS»).

Порядок выполнения userjs


Opera загружает и выполняет все файлы «*.js» в указанной папке. Таким образом, для отключения скрипта достаточно изменить его разширение. Порядок загрузки не определен в Opera 9, в Opera 10 — в алфавитном порядке.

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

Все userjs выполняются до загрузки страницы, за исключением скриптов, имя которых оканчивается на «.user.js» — они выполняются после загрузки страницы для совместимости с GreaseMonkey.

Написание userjs


Шапка

Шапка необязательна. В шапке указывается различная информация о скрипте и авторе, а также шаблоны адресов, на которых скрипт должен выполняться ( include) или же не выполняться (@exclude). По умолчанию скрипт выполняется на всех страницах.

Если скрипт полезен только на определенном сайте — используйте include вместо проверки адреса, это быстрее.

// ==UserScript==
// @name Cool script
// @description Does some cool thing.
// @author some@cool.programmer.com
// @include http://some.host/*
// @exclude http://some.host/path/*
// ==/UserScript==


Код

Скрипты выполняются в контексте загружаемой страницы и разделяют с ней глобальный объект window, поэтому во избежание конфликтов не следует создавать глобальные переменные. Обычно для определения новой области видимости используется анонимная функция, которая немедленно исполняется. Внутри следует использовать «var» для объявления переменных.

(function() {
  var CONST = "const";
  // do something.
})();


Дополнительные возможности

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

defineMagicVariable

window.opera.defineMagicVariable(name, getter, setter) позволяет переопределить глобальную переменную с помощью функций получения и установки значения. Позволяет обманывать скрипты на сайтах. setter необязателен (укажите null).

window.opera.defineMagicVariable('isIE', function(val) { return true; });


defineMagicFunction

window.opera.defineMagicFunction(name, func) переопределяет глобальную фунцию.

window.opera.defineMagicFunction('setTitle', function(original, _this, title) {
  window.status = 'Setting title';
  return original.apply(_this, title);
});


addEventListener

window.opera.addEventListener(name, handler, capture) совместима по интерфейсу с window.addEventListener, но поддерживает дополнительные события. Не буду описывать все, самыми важными являются «BeforeEvent.type» и «AfterEvent.type», где вместо «type» нужно подставить имя события («DOMContentLoaded», «click», «load», …)

Типовой скрипт

Наиболее распространены userjs, модифицирующие код страницы для удаления рекламы, добавления ссылок и т.д. В этом случае необходимо дождаться загрузки страницы. Типовой код:

(function() {
  opera.addEventListener('BeforeEvent.DOMContentLoaded', function(ev) {
    var elem = document.getElementById('ad'); // блок с рекламой
    elem.style.display = 'none';
  }, true);
})();
Tags: operauserjsjavascript
Hubs: Opera
Total votes 16: ↑15 and ↓1 +14
Comments 13
Comments Comments 13

Popular right now