2017-05-30 72 views
1

這個JavaScript語句在以前版本的Chrome有效(如一個Chrome擴展content.js的一部分)在4個月前:Chrome控制檯和頁內JavaScript有什麼區別?

require(["function-widget-1:share/util/service/createLinkShare.js"]).prototype.makePrivatePassword=function(){return prompt("Some Massage:","")}; 

但現在(在最新的Chrome,以及Chrome的擴充content.js的一部分)它是無效的,並且錯誤消息是「Uncaught ReferenceError:require is not defined」。

但是,如果我在Chrome控制檯中鍵入相同的語句(如在開發人員工具中),它現在(在最新的Chrome中)仍然有效。

所以我的問題是: 這兩種情況的區別是什麼?

+0

'require'在我的Chrome中不是一個已定義的函數...你確定你沒有在某個地方包含'require'實現嗎? – deceze

+0

@deceze我相信它包含在擴展本應該工作的頁面中 –

+1

控制檯有一個上下文選擇器。默認情況下它是頁面本身。爲了讓您的擴展訪問頁面上下文,您需要將代碼插入到腳本元素中,否則內容腳本無法訪問頁面功能,因爲它運行在獨立的環境中。 – wOxxOm

回答

0

你看到的被稱爲"Isolated world"

Content scripts execute in a special environment called an isolated world. They have access to the DOM of the page they are injected into, but not to any JavaScript variables or functions created by the page. It looks to each content script as if there is no other JavaScript executing on the page it is running on. The same is true in reverse: JavaScript running on the page cannot call any functions or access any variables defined by content scripts.

從本質上講,在一個完全獨立的JS上下文中運行的內容的腳本(認爲「虛擬機」)連接到同一個DOM樹並沒有看到每個其他的代碼。

使用開發工具控制檯時,您可以使用上方的下拉菜單(最初稱爲「頂部」)來切換JS上下文。它應該列出已經存在的內容腳本上下文。

有可能跨越邊界並讓一些代碼在頁面自己的上下文中運行;這種技術通俗地稱爲「注入腳本」(不要與程序化注入內容腳本混淆)或「頁面級腳本」,並且由this question正式涵蓋。

但是,跨越此邊界的任何代碼都很難與之通信 - 因爲它與頁面自己的代碼無法區分,如前所述,內容腳本不可見。幾個問題涵蓋了這個:with content script,with background

+0

非常感謝!這正是我正在尋找的。 AMD風格的'require()'由網頁頭部導入的'

相關問題