Подтвердить что ты не робот

Скрытые особенности Greasemonkey

Каковы некоторые из менее известных, но полезных функций и методов, которые люди используют в своих сценариях Greasemonkey?

(Пожалуйста, только одна функция для каждого ответа.)

Похожие темы:

4b9b3361

Ответ 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();