Скрытые особенности Greasemonkey
Каковы некоторые из менее известных, но полезных функций и методов, которые люди используют в своих сценариях Greasemonkey?
(Пожалуйста, только одна функция для каждого ответа.)
Похожие темы:
Ответы
Ответ 1
Сценарии 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"
.
Ответ 2
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
Ответ 3
Ваш script может добавлять графики на страницу, даже если у вас нет места для размещения файлов с помощью URI данных.
Например, вот небольшая кнопка:
var button = document.createElement("img");
button.src = "data:image/gif;base64,"
+ "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx"
+ "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=="
somenode.appendChild(button);
Вот онлайн-код .
И статья wikipedia о стандарте URI данных.
Ответ 4
Данные могут сохраняться на разных загрузках страниц, сохраняя их как значение предпочтения 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, которые их создали.
Ответ 5
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() с осторожностью.
Ответ 6
Анонимная статистика
Предполагая, что у вас есть базовая услуга хостинга, которая обеспечивает ведение журнала доступа, вы можете легко отслеживать основные статистические данные использования для script.
- Поместите файл gif (например, изображение логотипа) на свой собственный сайт.
- В script присоедините элемент img к странице, которая ссылается на gif:
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
).
Ответ 7
Полезный метод 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.
Ответ 8
Сценарии GreaseMonkey запускаются, когда DOM готов, поэтому вам не нужно добавлять события onload, вы просто начинаете манипулировать DOM прямо в своем GreaseMonkey script.
Ответ 9
Script значения заголовка (@name, @description, @version и т.д.) могут быть восстановлены. Это предпочтительнее поддерживать одни и те же постоянные значения в нескольких местах в script.
Смотрите Доступ к метаданным Greasemonkey из вашего script?
Ответ 10
Устаревшее: 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();