javascript - Hur konverterar man ett bokmärke till ett Greasemonkey-användarskript?
Finns det ett enkelt sätt att göra detta? Och är det något som behöver ändras på grund av skillnader i hur det körs?
Svar #1
Det enklaste sättet att göra detta:
Kör bokmärkeslets koden genom en URL-avkodare, så att
javascript:alert%20('Hi%20Boss!')%3B, till exempel, blir:
javascript:alert ('Hi Boss!');Ta bort det ledande
javascript:. Resultat:alert ('Hi Boss!');Lägg till den här koden i slutet av din Greasemonkey-fil. Till exempel, skapa en fil med namnet,
Hello World.user.js, med denna kod:// ==UserScript== // @name Hello World! // @description My first GM script from a bookmarklet // @include https://stackoverflow.com/questions/* // @grant none // ==/UserScript== alert ('Hi Boss!');Öppna Hello World.user.js med Firefox (CtrlO). Greasemonkey kommer att fråga om du vill installera skriptet.
Nu kommer bokmärkeslets-koden att köras automatiskt på de sidor du specificerade med
@includeoch@exclude-direktiven.Uppdatering: För att säkerställa maximal kompatibilitet, använd
@grant none-direktivet som lades till i senare versioner av Greasemonkey och Tampermonkey.
VIKTIGT :
Användarskriptet kommer att köras mycket tidigare än du någonsin skulle kunna aktivera ett bokmärke. Normalt är detta inget problem.
Men i vissa fall kan du behöva vänta på att en del av sidan ska laddas helt.
I så fall kan du använda tekniker/verktyg som waitForKeyElements.Se även, Välja och aktivera rätt kontroller på en AJAX-driven webbplats.
Om du fortfarande inte kan få ditt nya skript att fungera, se till att läsa Min väldigt enkla Greasemonkey-skript körs inte?. Följ stegen och inkludera den angivna informationen i alla frågor du öppnar om problem med det nya skriptet.
Svar #2
Här är en mycket bra artikel för att undvika vanliga fallgropar på grund av skillnader mellan 'normal' JS och Greasemonkey.
De viktigaste sakerna i början:
Använd inte funktioner som strängar, som:
utan snararewindow.setTimeout("my_func()", 1000);window.setTimeout(my_func, 1000);ellerwindow.setTimeout(function(){doSomething(); doSomethingOther();}, 1000);Ställ inte in
utan hellreelement.onclickelement.addEventListener("click", my_func, true);Viss kod som normalt returnerar olika DOM-objekt returnerar i Greasemonkey-miljö dessa objekt inneslutna i XPCNativeWrapper. Detta är av säkerhetsskäl.
Vissa metoder och egenskaper är "transparenta" och du kan anropa dem på det inlindade objektet, men vissa inte. Läs i den nämnda artikeln om hur du kringgår detta; du kan även använda (detta rekommenderas generellt inte, men för testning etc.) egenskapen wrappedJSObject. Det är, när
obj.something/obj.something()inte fungerar i Greasemonkey, försökobj.wrappedJSObject.something/obj.wrappedJSObject.something().
