У меня была та же проблема, когда мы использовали одну базу данных для двух приложений. Установка disableDatabaseInitialization="true"
в разделе типа контекста работает для меня.
Подробнее https://msdn.microsoft.com/en-us/data /jj556606.aspx
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
Ваш сценарий может добавить графику в страницу, даже если у Вас нет места для хостинга файлов через данные URIs.
Например, вот немного графической кнопки:
var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button);
Вот кодер изображения онлайн.
И статья Википедии о Данных стандарт URI.
Данные могут быть сохранены через загрузки страницы путем хранения его как предпочтительного значения Mozilla через GM_setValue(keyname, value)
.
Вот простой пример, который счета количеству раз, Ваш сценарий был выполнен - данным браузером:
var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od);
Значения GM походят на cookie в том cookie, к значениям может только получить доступ порожденный домен, к значениям GM может только получить доступ сценарий, который создал их.
Сценарии механика часто должны искать содержание на странице. Вместо того, чтобы рыть через DOM, попытайтесь использовать XPath для определения местоположения узлов интереса. document.evaluate()
метод позволяет Вам обеспечить выражение XPath и возвратит набор соответствия узлам. Вот хорошее учебное руководство для запущения Вас. Как пример, вот сценарий, я записал, что причины связываются в сообщениях 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
s, чей class
атрибут установлен на "content"
.
GM_setValue обычно только хранит 32-разрядные целые числа, строки и булевские переменные, но можно использовать в своих интересах uneval () метод (и более поздняя оценка () на извлечении), чтобы хранить любой объект. Если Вы имеете дело с чистыми значениями 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);
Я склонен использовать "новый Объект ()" как мое значение по умолчанию в этом случае, но Вы могли также использовать" ({})". Просто помните, что "{}" оценивает как строка, не объект. Как обычно, оценка () с осторожностью.
Полезный метод 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.
Скрипты GreaseMonkey, запущенные, когда DOM готов, таким образом, Вы не должны добавлять onload события, Вы только, начинают управлять DOM немедленно в Вашем сценарии GreaseMonkey.
Анонимная статистика
Принятие Вас имеет основную услугу хостинга, которая обеспечивает вход доступа, можно легко отследить базовую статистику использования для сценария.
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
).
Значения заголовка сценария, (@name, @description, @version, и т.д.), может быть сделан восстановимым. Это предпочтительно для поддержания тех же постоянных величин в нескольких местах в Вашем сценарии.