2014-01-14 113 views
0

我試圖編寫一個Chrome擴展,在目標頁面上放置一個小腳本,然後針對頁面上的項目執行特定操作。作爲Chrome擴展程序的新手,我已經開始使用「Hello World」警報。這工作正常,但是我實際上想要做的事情包括對對象使用jQUery。添加jQuery停止執行腳本

雖然我的目標頁面已經導入jQuery,但如果我嘗試在我的腳本中使用它,我會得到一個異常,即$未定義。但是,如果我自己嘗試導入它,即使alert停止工作。

下面是我的代碼,任何人都可以指出我要去哪裏錯了嗎?

manifest.json的

{ 
    "manifest_version": 2, 

    "name": "Hello World", 
    "description": "Simple Hello World Extension", 
    "version": "1.0", 

    "content_scripts": [ 
    { 
     "matches": ["http://localhost:46950/"], 
     "run_at": "document_end", 
     "js": ["http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", "popup.js"] 
    } 
    ] 
} 

popup.js

$(helloWorld()); 

function helloWorld() 
{ 
    alert("Hello World"); 
} 

更新

挖掘到的Chrome://擴展,我意識到,當我嘗試使用下面的代碼,擴展名不是loade d到Chrome中。如果我嘗試再次手動加載它,我會得到以下例外:

無法從「'加載擴展名。無法加載JavaScript內容腳本。

+1

JavaScript函數是一階,你需要傳遞的功能jQuery的準備處理程序不調用它。 '$(helloWorld)'和_not_'$(helloWorld())' –

+0

但是,由於'$'未定義,甚至沒有達到特定的問題。 –

+0

@BenjaminGruenbaum這似乎並非如此。如果我使用'$(helloWorld);'沒有任何反應(在它通常工作的情況下)。如果我添加'$(helloWorld());'它工作正常。 –

回答

1

好吧,我設法找到this答案,這給了我一些線索發生了什麼事。

Chrome看起來不會在擴展中的外部資源中加載。因此,當我試圖通過谷歌加載jQuery,它不會加載它,並崩潰了整個擴展。

我試圖這樣做的原因是,以免導致我的多個版本的jquery在我的擴展和目標站點之間發生衝突的問題。但是,答案表明這些流程本質上是孤立運行的,所以它不應該有問題。考慮到這一點,我剛剛手動將jquery添加到我的擴展中,並直接加載它。這似乎工作正常。

manifest.json的

{ 
    "manifest_version": 2, 

    "name": "Hello World", 
    "description": "Simple Hello World Extension", 
    "version": "1.0", 

    "content_scripts": [ 
    { 
     "matches": ["http://localhost:46950/"], 
     "run_at": "document_end", 
     "js": ["jquery-2.0.3.min.js", "popup.js"] 
    }] 
} 
+1

你是對的;因爲擴展是沙箱化的(除非您有意將腳本注入到頁面中),則不會有任何衝突問題。 –

-2

JQuery期待一個DOM元素,所以它會拋出一個錯誤。

這聽起來像你正在尋找類似的$(document)。就緒(): http://learn.jquery.com/using-jquery-core/document-ready/

+0

用'$(document).ready(helloWorld)替換'$(helloWorld());''似乎沒有任何區別 –

+1

'jQuery()'期待dom元素,函數或選擇器字符串,但在這種情況下,他沒有提供這些。 –

+0

不,問題是他沒有正確加載它;擴展無法加載外部資源。 –