Bu betiğe herhangi bir şekilde bir "Hibe" eklemelisin ...
Greasemonkey 1.0, özel bir Meta Veri Bloğu zorunluluğu ekler: @grant.
If a script does not specify any @grant values, Greasemonkey 1.0-1.9 will attempt to auto-detect the right settings. From GreaseMonkey 2.0, @grant none is assumed by default, if no other values are specified.[1]
If a script specifies any values (or they were auto detected), then it will be provided with only those API methods that it declares.
The valid values are unsafeWindow, and the names of those GM_ prefixed values that you wish your script to be granted access to.
Otherwise the script will be granted no special API privileges, and thus run without the security constraints Greasemonkey scripts have traditionally had. If you want your script to operate in this mode, you should explicitly declare @grant none.
Örnekler
Herhangi bir özel API kullanmamak, komut dosyalarında (son sayımın yarısından fazlası) yaygındır. Bu tür komut dosyaları için açıkça özel ayrıcalıklar tanınmasını istemek, komut dosyasının doğrudan içerik sayfasında yürütüleceği anlamına gelir. Bu, güvenlik sanal alanı ve sınırlamalarının hiçbiri olmadığı anlamına gelir; bu nedenle sayfadaki değişkenlere erişmek yalnızca çalışır, işlevleri çağırır ve sonuçlarını okumak çalışır. Bunu yapmak için, basitçe:
// ==UserScript==
// @name Grant None Example (can be omitted since GM 2.0)
// @include http*
// @grant none
// ==/UserScript==
console.log('This script grants no special privileges, so it runs without security limitations.');
Greasemonkey'in API'lerinden birini kullanıyorsanız, açıkça betiğinize verilmesini istemeniz gerekir:
// ==UserScript==
// @name Grant Some Example
// @include http*
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
var counter = GM_getValue('counter', 0);
console.log('This script has been run ' + counter + ' times.');
GM_setValue('counter', ++counter);
Bu durumda, komut dosyasına her ikisine de erişim izni verilmesini istiyor GM_getValue
ve GM_setValue
, her biri birer tane @grant
hat. Erişim izni verilecek herhangi bir Greasemonkey API'sinin adını belirtin. (Tüm komut dosyaları her zaman almak GM_info
özellikle istemeksizin.) Geçici olarak, bu da işe yarayabilir:
// ==UserScript==
// @name Grant Legacy Example
// @include http*
// ==/UserScript==
var counter = GM_getValue('counter', 0);
console.log('This script has been run ' + counter + ' times.');
GM_setValue('counter', ++counter);
Bu örnek Greasemonkey sürüm 1.0'da çalışacaktır. @Grant satırı olmadığında, Greasemonkey hangi API'lerin kullanıldığını algılamaya çalışır ve bu @grant satırları belirtilmiş gibi davranır. Bu algılama, bazı durumlarda, özellikle de eval()
kullanıldı.
@Grant'tan önce yazılan tüm komut dosyaları bu nedenle çalışmaya devam etmelidir, ancak komut dosyalarınızı en kısa zamanda uygun şekilde @grant olarak belirtmelisiniz, bu nedenle gelecekte kırılmazlar.
Uyumluluk Katmanı
Greasemonkey API'lerinin çoğu, DOM Storage gibi web standartları tarafından çoğaltılmıştır. Komut dosyanızın yalnızca tek bir etki alanında çalışmasını beklerseniz, derhal herhangi bir dezavantaj olmadan @grant none ve arttırılmış uyumluluğunu kullanabilirsiniz. Artık standart tarayıcı özelliklerine sahip Greasemonkey API'lerini taklit etmek için bir @require kütüphanesi kullanın:
// ==UserScript==
// @name Grant None Example, With Shim
// @include http://www.example.com/*
// @grant none
// @require https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js
// ==/UserScript==
var counter = GM_getValue('counter', 0);
console.log('This script has been run ' + counter + ' times.');
GM_setValue('counter', ++counter);
Bu komut dosyası, yukarıdaki hiçbir örnekle aynı şekilde çalışacaktır, bunlara hiçbir şim vermemek, standart tarayıcı özellikleriyle API emülasyonu sağlamaktır. Shim uyumluluğu katmanı, komut dosyanız için yeterince iyi çalıştığında, bu her iki dünyanın da en iyisidir.
kapsam
Hiçbiri hibe durumunda, kullanıcı betiğinin içerik sayfasının global kapsamından farklı olarak kendi global kapsamı vardır. Bu bir üst düzey anlamına gelir var x = 1;
içerik kapsamına görünmez ve bu nedenle sayfayı kırmaz (yani, farklı bir değere sahip x değişkenine bağlıysa). İçerik kapsamına değerler yazmak için window.x = 1;
.
Eğer sen @require
bir jQuery sürümü, örtük olarak atayacaktır window.$
ve window.jQuery
. Çalıştırdığınız sayfa jQuery'nin farklı bir sürümüne bağlıysa, bu sayfa kırılabilir. Bu soruna geçici bir çözüm bulmak için, komut dosyanızın en üst düzeyindeki herhangi bir yerde şunları yapın:
this.$ = this.jQuery = jQuery.noConflict(true);
Bu kod, bir jQuery referansını kaydeder (buna, betiğin hiçbiri hibe modunda çalışırken genel kapsamı), pencereden kaldırırken (genel içerik kapsamı) ve orjinalinde saklanan herhangi bir şeyi geri yükler.