Каковы некоторые из менее известных, но полезных функций и методов, которые люди используют в своих сценариях Greasemonkey?
(Пожалуйста, только одна функция для каждого ответа.)
Похожие темы:
Каковы некоторые из менее известных, но полезных функций и методов, которые люди используют в своих сценариях Greasemonkey?
(Пожалуйста, только одна функция для каждого ответа.)
Похожие темы:
Сценарии Greasemonkey часто нуждаются в поиске содержимого на странице. Вместо того, чтобы копать через DOM, попробуйте использовать XPath для поиска интересующих узлов. Метод document.evaluate()
позволяет вам предоставить выражение XPath и вернет коллекцию совпадающих узлов. Вот вам хороший tutorial, чтобы вы начали. В качестве примера, здесь script я написал, что вызывает ссылки в сообщениях phpBB3 для открытия на новой вкладке (в скине по умолчанию):
// ==UserScript==
// @name New Tab in phpBB3
// @namespace http://robert.walkertribe.com/
// @description Makes links in posts in phpBB3 boards open new tabs.
// ==/UserScript==
var newWin = function(ev) {
var win = window.open(ev.target.href);
if (win) ev.preventDefault();
};
var links = document.evaluate(
"//div[@class='content']//a[not(@onclick) and not(@href='#')]",
document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0; i < links.snapshotLength; i++) {
var link = links.snapshotItem(i);
link.addEventListener("click", newWin, true);
}
В выражении XPath, используемом в коде, идентифицируются все элементы a
, которые 1) не имеют атрибута onclick
, 2), чей атрибут href
не установлен в "#"
и 3) находятся внутри div
, для атрибута class
установлено значение "content"
.
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
Ваш script может добавлять графики на страницу, даже если у вас нет места для размещения файлов с помощью URI данных.
Например, вот небольшая кнопка:
var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button);
Вот онлайн-код .
И статья wikipedia о стандарте URI данных.
Данные могут сохраняться на разных загрузках страниц, сохраняя их как значение предпочтения mozilla через GM_setValue(keyname, value)
.
Вот простой пример, который подсчитывает количество раз, когда ваш script был выполнен - данным браузером:
var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od);
Значения GM аналогичны файлам cookie, в которых значения cookie могут быть доступны только для инициированного домена, значения GM могут быть доступны только script, которые их создали.
GM_setValue обычно хранит только 32-битные целые числа, строки и логические значения, но вы можете использовать метод uneval() (и более поздний eval() для извлечения) для хранения любого объекта. Если вы имеете дело с чистыми значениями JSON (а не с объектами JavaScript), используйте JSON.stringify для хранения и JSON.parse для извлечения; это будет быстрее и безопаснее.
var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true};
GM_setValue('myVeryOwnFoo',uneval(foo));
var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()'));
GM_log('People: '+fooReborn.people+' Pie:'+fooReborn.pie);
Я обычно использую "новый объект()" в качестве моего значения по умолчанию в этом случае, но вы также можете использовать "({})". Просто помните, что "{}" оценивается как строка, а не объект. Как обычно, eval() с осторожностью.
Анонимная статистика
Предполагая, что у вас есть базовая услуга хостинга, которая обеспечивает ведение журнала доступа, вы можете легко отслеживать основные статистические данные использования для script.
var img = document.createElement("img"); img.src = "http://mysite.com/logo.gif"; document.body.appendChild(img);
Теперь, каждый раз, когда пользователь выполняет ваш script, ваша служба хостинга регистрирует хит в этом файле gif.
Чтобы отслеживать более одного script, используйте для каждого из них другой файл gif. Или добавьте какой-то дифференцирующий параметр в URL-адрес (например: http://mysite.com/logo.gif?zippyver=1.0
).
Полезный метод XPath - это указать ваше соответствие относительно node, которое вы уже нашли. В качестве надуманного примера для stackoverflow:
// first we got the username link at the top of the page var hdrdiv = document.evaluate( "//div[@id='headerlinks']/a[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; // now we can retrieve text that follows it, (user reputation score) // (note that hdrdiv is now the contextNode argument, rather than document) var reptext = document.evaluate( "following-sibling::span", hdrdiv, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; alert("Reputation Score: " + reptext.textContent);
Вы можете сопоставляться в любом направлении относительно contextNode, предков, потомков, предыдущих, следующих. Вот полезный ссылка XPath.
Сценарии GreaseMonkey запускаются, когда DOM готов, поэтому вам не нужно добавлять события onload, вы просто начинаете манипулировать DOM прямо в своем GreaseMonkey script.
Script значения заголовка (@name, @description, @version и т.д.) могут быть восстановлены. Это предпочтительнее поддерживать одни и те же постоянные значения в нескольких местах в script.
Устаревшее: Firefox потерял поддержку E4X, в сценариях Greasemonkey, с FF версии 17. Используйте GM_info
для получения метаданных.
Вы можете использовать e4x для доступа к вашей информации == UserScript == в виде переменной:
var metadata=<>
// ==UserScript==
// @name search greasemonkey
// @namespace foo
// @include http://*.google.com/*
// @include http://*.google.ca/*
// @include http://search.*.com/*
// @include http://*.yahoo.com/*
// ==/UserScript==
</>.toString();