[英]How to retrieve a global context variable from a string using GreaseMonkey/ViolentMonkey?
當嘗試從 Javascript 中的字符串檢索在全局上下文(通常是window
)中定義的變量時,我知道您可以簡單地這樣做:
var testVar = 123;
console.log(window["testVar"]); // logs "123"
然而,在我為 ViolentMonkey 編寫的內容注入用戶腳本中,這只是返回undefined
,似乎是因為全局上下文的工作方式與通常的頁面腳本不同。 我嘗試了不同的訪問全局上下文的方法:
// ==UserScript==
// @name Test
// @namespace *
// @include *
// @version 1
// @inject-into content
// @grant none
// ==/UserScript==
var testVar = 123;
console.log(testVar); // logs "123"
console.log(window.testVar); // logs "undefined"
console.log(window["testVar"]); // logs "undefined"
console.log(this["testVar"]); // logs "undefined"
console.log(unsafeWindow["testVar"]); // logs "undefined"
所有這些都不起作用。 有什么方法可以訪問用戶腳本中的全局上下文,甚至是從字符串中檢索變量的不同方法?
我最后想要實現的是從一堆外部加載的類中的一個實例化一個類對象,其中使用的類取決於站點 URL。
如果可能,我想避免在命名空間中定義類,這對我來說是重構地獄,或者出於顯而易見的原因使用eval
。
編輯:我還在控制台中從上面搜索了經過測試的上下文對象,其中沒有一個包含我試圖檢索的變量的任何痕跡。
您使用的是哪個瀏覽器?
Chrome 和 Firefox 之間存在一些行為差異。 例如:
在 Chrome 中,
eval()
總是在內容腳本的上下文中運行代碼,而不是在頁面的上下文中。在 Firefox 中:
- 如果您調用
eval()
,它會在內容腳本的上下文中運行代碼。- 如果您調用
window.eval()
,它會在頁面上下文中運行代碼。來源: 在內容腳本中使用 eval()
var
在其范圍內是全局的。
內容腳本在它們自己的范圍內運行。 否則頁面腳本可以在內容腳本和瀏覽器中運行功能並創建安全漏洞。
AFAIK GreaseMonkey/ViolentMonkey/TamperMonkey 沙箱每個用戶腳本,而 FireMonkey(僅限 Firefox)使用專用的 userScript API,它為每個用戶腳本創建一個安全范圍。
因此, var testVar = 123;
僅在腳本內容范圍內可見。
window
對象是包含用戶范圍和頁面范圍的整體對象。
例如:
var testVar = 123;
console.log(testVar); // logs "123"
console.log(window.testVar); // logs "undefined"
window.testVar = 456;
console.log(testVar); // logs "123"
console.log(window.testVar); // logs "456"
注意:用 FireMonkey 測試
試圖檢索在全局上下文中定義的變量(通常是窗口)
為了獲取在頁面上下文中定義的變量(與設置它相反),有幾個選項取決於具體情況:
@require
還應該被腳本管理器注入到與它需要它的用戶腳本相同的上下文/范圍中,這是內容范圍。
為了更准確地回答,必須查看實際代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.