看板 Mesak
作者 mesak
標題 [GM] @grant
時間 2012年10月31日 Wed. PM 05:29:15
http://wiki.greasespot.net/@grant
@grant詳細說明:
Greasemonkey 1.0 將在腳本運行前即決定腳本將是否在安全沙盒中運行、將要用到哪些API
如果腳本沒有聲明@grant,那麼Greasemonkey將自動檢測腳本用了哪些API(目前自動檢測的方法就是簡單地看腳本中有沒有出現這些API的名字,哪怕註釋掉沒運行的也算)
這些API包括:
GM_deleteValue
GM_getValue
GM_listValues
GM_setValue
GM_getResourceText
GM_getResourceURL
GM_addStyle
GM_xmlhttpRequest
GM_log
GM_openInTab
GM_registerMenuCommand
unsafeWindow
不包括GM_info
@grant可以用來顯著地聲明腳本中用了哪些「GM_」開頭的API
@grant可以使用以下值:
GM_deleteValue
GM_getValue
GM_listValues
GM_setValue
GM_getResourceText
GM_getResourceURL
GM_addStyle
GM_xmlhttpRequest
GM_log
GM_openInTab
GM_registerMenuCommand
none
「@grant none」的話,腳本將無特權無沙盒運行,任何GM_的API都不可用,但為了兼容,unsafeWindow依然能用
不需要使用「@grant unsafeWindow」,因為無論何種情況下unsafeWindow的API都是可用的,哪怕「@grant none」
注意:沒有聲明@grant,也沒有偵測到任何「GM_」和unsafeWindow的API的時候,腳本相當於在「@grant none」模式下,無特權無沙盒運行。超過半數的腳本都是這樣的。在這樣的腳本中,當用到window.myVariable的時候,Greasemonkey v1.0之前版本和v1.0的效果不同,之前版本不影響unsafeWindow.myVariable,1.0的window.myVariable就是unsafeWindow.myVariable,會修改頁面上的這個myVariable變量,因而可能導致衝突。比如在@require jQuery的時候,就會有這種衝突,這是因為jQuery庫裡有window.$ = window.jQuery = ...。解決方法是:
在腳本中最上層加入一行this.$ = this.jQuery = jQuery.noConflict(true);
或者
用@grant聲明、或在任何地方使用(甚至不使用而寫在註釋裡面都行)任何GM_或unsafeWindow的API,使得腳本在沙盒中運行
即可解決問題。
遇到腳本在Greasemonkey v1.0用不了但舊版可用的,請檢查有沒有@require jQuery、腳本中和其他@require的庫中有沒有使用window.myVariable這樣的修改window中變量的方式。
Form
http://g.mozest.com/viewthread.php?tid=42139
--
--
※ 作者: mesak 時間: 2012-10-31 17:29:15