Каковы некоторые из менее известных, но полезных функций и методов, которые люди используют в своих сценариях Greasemonkey?Скрытые особенности Greasemonkey
(. Пожалуйста, только одна особенность в ответ)
Похожие темы:
Каковы некоторые из менее известных, но полезных функций и методов, которые люди используют в своих сценариях Greasemonkey?Скрытые особенности Greasemonkey
(. Пожалуйста, только одна особенность в ответ)
Похожие темы:
Данные могут сохраняться на разных загрузках страниц, сохраняя их как значение предпочтения mozilla через GM_setValue(keyname, value)
.
Вот простой пример, который Tallys количество раз сценарий был выполнен - с помощью данного браузера:
значенияvar od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od);
GM аналогичны печеньем в том, что значение куки могут быть доступны только возникшего домен, значения GM могут быть доступны только скриптом, который их создал.
Действительно ли это скрытая функция или даже менее известная? Это часть документального API Greasemonkey, который сам по себе очень мал. –
Согласен, что это не скрыто. Но он попадает в категорию идиомы. –
Да, API GM действительно не такой большой, и поэтому я не знаю о «скрытых функциях» как таковой - было бы более интересно спросить об интересных методах/эксплойтах, которые предоставляют полезную, неочевидную функциональность. –
Анонимных статистики
Предполагая, что у вас есть базовые услуги хостинга, который обеспечивает протоколирование доступа, вы можете легко отслеживать основные статистические данные об использовании для вашего сценария.
var img = document.createElement("img"); img.src = "http://mysite.com/logo.gif"; document.body.appendChild(img);
Теперь, каждый раз, когда пользователь выполняет сценарий, ваш хостинг будет регистрировать попадание в этот GIF-файл.
Чтобы отследить несколько сценариев, используйте для этого каждый другой файл gif. Или добавьте какой-то дифференцирующий параметр в URL-адрес (например: http://mysite.com/logo.gif?zippyver=1.0
).
... и пока вы на нем, вы также можете отправить свои имена пользователей и пароли с ним –
Просьба привести пример кода –
У меня на самом деле был скрипт, который бы сгенерировал псевдо-GUID при установке скрипта, сохраните его используя GM_setValue, а затем каждый * день * сценарий был запущен, он попал бы на мой сайт, отправив GUID в строку запроса. Я зарегистрировал эти данные в базе данных, чтобы получить статистику использования. –
Сценарии Greasemonkey часто нуждаются в поиске содержимого на странице. Вместо того, чтобы копать через DOM, попробуйте использовать XPath для поиска интересующих узлов. Метод document.evaluate()
позволяет предоставить выражение XPath и вернет коллекцию совпадающих узлов. Вот хороший tutorial, чтобы вы начали. В качестве примера, вот сценарий, я написал, что приводит ссылки в 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"
.
Я хотел бы прокомментировать, что, несмотря на широко выраженные опасения относительно того, что XPath может быть слишком дорогим по сравнению с ходом DOM, я обнаружил, что он работает практически мгновенно, даже когда он используется агрессивно. –
Значения заголовка сценария (@name, @description, @version и т. Д.) Могут быть восстановлены. Это предпочтительнее поддерживать одни и те же постоянные значения в нескольких местах в вашем скрипте.
сценарий можно добавить графику на страницу, даже если у вас нет места для размещения файлов, с помощью URIs данных.
Например, здесь немного графическая кнопка:
var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button);
Вот онлайн image encoder.
И wikipedia article о стандарте URI данных.
Если у вас есть место для размещения файлов, но у вас недостаточно полосы пропускания, вы можете использовать относительно недавно добавленные функции @resource и GM_getResourceURL, чтобы пользователь мог загрузить ваше изображение (или другой ресурс) при их установке ваш скрипт. Он сохраняется локально после этого – Athena
Nice. Это было бы более результативным, так как браузер кэширует изображение и не должен его каждый раз создавать. –
Полезный метод XPath заключается в том, чтобы указать ваше соответствие относительно узла, который вы уже нашли. Как надуманный пример для 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's 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 reference.
Сценарии GreaseMonkey запускаются, когда DOM готов, поэтому вам не нужно добавлять события onload, вы просто начинаете манипулировать DOM прямо в сценарии GreaseMonkey.
Приобретение с некоторыми сайтами - это то, что они доставляют неполный HTML, а затем изменяют его через onload. Поэтому, когда вы пытаетесь изменить его с помощью greasemonkey, страница еще не готова. Например: http://www.tvguide.com/listings http://www.meevee.com/myguide.aspx –
У меня было несколько проблем, создающих сценарии Greasemonkey для SO из-за таких проблем. :-) –
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
GM_setValue обычно хранит только 32-битные целые числа, строки и BOOLEANS, но вы можете воспользоваться методом 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);
Я предпочитаю использовать «новый Object()» в моем умолчанию в этом случае, но вы можете также использовать «({})». Просто помните, что «{}» оценивается как строка, а не объект. Как обычно, eval() с осторожностью.
Он делает для довольно нестандартных исходных значений предпочтений, но очень мощный. Скорее всего, это сохранение BLOB в вашей базе данных. Мне особенно нравится ваш совет инициализации. –
Я сегодня ничего не узнал. Смотрел на использование JSON для сохранения массива, но это выглядит довольно мило. – davewasthere
Устаревшее: 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();
+1, но это устарело теперь, когда ['GM_info' был добавлен в Greasemonkey] (http://stackoverflow.com/a/10475344/331508). –
есть другой вопрос 10 помечен как скрытые-функции. http://stackoverflow.com/questions/tagged/hidden-features –