Есть ли простой способ сделать это. И есть ли что-то, что нужно изменить из-за различий в том, как это работает?
Как преобразовать букмарклет в пользовательский скрипт Greasemonkey?
Ответы (2)
Самый простой способ сделать это:
Запустите код букмарклета через декодер URL. так что
javascript:alert%20('Hi%20Boss!')%3B
, например, становится:javascript:alert ('Hi Boss!');
Снимите ведущий
javascript:
. Результат:alert ('Hi Boss!');
Добавьте этот код в конец вашего файла Greasemonkey. Например, создайте файл с именем
Hello World.user.js с помощью следующего кода:// ==UserScript== // @name Hello World! // @description My first GM script from a bookmarklet // @include https://stackoverflow.com/questions/* // @grant none // ==/UserScript== alert ('Hi Boss!');
Откройте Hello World.user.js в Firefox (CtrlO ). Greasemonkey предложит установить скрипт.
Теперь код букмарклета будет запускаться автоматически на всех страницах, которые вы указали с помощью директив
@include
и@exclude
.Обновление: для обеспечения максимальной совместимости используйте директиву
@grant none
, которая была добавлена в более поздние версии Greasemonkey и Tampermonkey.
ВАЖНЫЙ:
Пользовательский скрипт запустится намного раньше, чем вы сможете активировать закладку. Как правило, это не проблема.
Но в некоторых случаях вам может потребоваться подождать, пока часть страницы полностью загрузится.
В этом случае вы можете используйте методы/утилиты, такие как waitForKeyElements.См. также раздел Выбор и активация правильных элементов управления на сайт на основе AJAX .
Если вы все еще не можете заставить свой новый скрипт работать, обязательно прочитайте Мой очень простой скрипт Greasemonkey не работает?. Следуйте инструкциям и включайте указанную информацию во все открытые вами вопросы о проблемах с новым скриптом.
@include
, @exclude
и @match
.
- person Brock Adams; 28.02.2018
Вот очень хорошая статья для избегайте распространенных ошибок из-за различий между обычным JS и Greasemonkey.
Самое главное в начале:
Не используйте функции в виде строк, например:
, а используйтеwindow.setTimeout("my_func()", 1000);
window.setTimeout(my_func, 1000);
илиwindow.setTimeout(function(){doSomething(); doSomethingOther();}, 1000);
.Не устанавливайте
, аelement.onclick
element.addEventListener("click", my_func, true);
Некоторый код, который обычно возвращает различные объекты DOM, в среде Greasemonkey возвращает эти объекты, завернутые в XPCNativeWrapper. Это из соображений безопасности.
Некоторые методы и свойства прозрачны, и вы можете вызывать их для обернутого объекта, а некоторые нет. Читайте в упомянутой статье о том, как это обойти; вы также можете использовать (это не рекомендуется вообще, но для тестирования и т. д.) свойство wrapJSObject. То есть, когда
obj.something
/obj.something()
не работает в Greasemonkey, попробуйтеobj.wrappedJSObject.something
/obj.wrappedJSObject.something()
.