크롬 확장에서 jQuery를 사용하는 방법?
크롬 확장 프로그램을 작성 중입니다. 그리고 jQuery
내 확장 에 사용 하고 싶습니다. 배경 페이지를 사용하지 않고 배경 스크립트 만 사용하고 있습니다 .
내 파일은 다음과 같습니다.
manifest.json
{
"manifest_version": 2,
"name": "Extension name",
"description": "This extension does something,",
"version": "0.1",
"permissions": [
"activeTab"
],
"browser_action": {
"default_icon": "images/icon_128.png"
},
"background": {
"scripts": ["background.js"],
"persistent": false
},
"icons": {
"16": "images/icon_16.png",
"48": "images/icon_48.png",
"128": "images/icon_128.png"
}
}
내 background.js
파일은 이름이 다른 파일을 실행합니다.work.js
// Respond to the click on extension Icon
chrome.browserAction.onClicked.addListener(function (tab) {
chrome.tabs.executeScript({
file: 'work.js'
});
});
내 확장의 주요 논리는 work.js
. 이 질문에 대해 여기서 중요하지 않다고 생각하는 내용입니다.
내가 묻고 싶은 것은 내 확장 프로그램에서 jQuery를 어떻게 사용할 수 있는지입니다. 배경 페이지를 사용하지 않기 때문에. jQuery를 추가 할 수는 없습니다. 그렇다면 어떻게 내 확장에 jQuery를 추가하고 사용할 수 있습니까?
background.js
파일 에서 내 work.js와 함께 jQuery를 실행 해 보았습니다 .
// Respond to the click on extension Icon
chrome.browserAction.onClicked.addListener(function (tab) {
chrome.tabs.executeScript({
file: 'thirdParty/jquery-2.0.3.js'
});
chrome.tabs.executeScript({
file: 'work.js'
});
});
And it works fine, but I am having the concern whether the scripts added to be executed in this manner are being executed asynchronously. If yes then it can happen that work.js runs even before jQuery (or other libraries which I may add in future).
And I would also like to know what's the correct and best way to use third party libraries, in my chrome extension.
You have to add your jquery script to your chrome-extension project and to the background
section of your manifest.json like this :
"background":
{
"scripts": ["thirdParty/jquery-2.0.3.js", "background.js"]
}
If you need jquery in a content_scripts, you have to add it in the manifest too:
"content_scripts":
[
{
"matches":["http://website*"],
"js":["thirdParty/jquery.1.10.2.min.js", "script.js"],
"css": ["css/style.css"],
"run_at": "document_end"
}
]
This is what I did.
Also, if I recall correctly, the background scripts are executed in a background window that you can open via chrome://extensions
.
Its very easy just do the following:
add the following line in your mainfest.json
"content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'",
now you are free to load jquery directly from url
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
Source :google doc
And it works fine, but I am having the concern whether the scripts added to be executed in this manner are being executed asynchronously. If yes then it can happen that work.js runs even before jQuery (or other libraries which I may add in future).
That shouldn't really be a concern: you queue up scripts to be executed in a certain JS context, and that context can't have a race condition as it's single-threaded.
However, the proper way to eliminate this concern is to chain the calls:
chrome.browserAction.onClicked.addListener(function (tab) {
chrome.tabs.executeScript({
file: 'thirdParty/jquery-2.0.3.js'
}, function() {
// Guaranteed to execute only after the previous script returns
chrome.tabs.executeScript({
file: 'work.js'
});
});
});
Or, generalized:
function injectScripts(scripts, callback) {
if(scripts.length) {
var script = scripts.shift();
chrome.tabs.executeScript({file: script}, function() {
if(chrome.runtime.lastError && typeof callback === "function") {
callback(false); // Injection failed
}
injectScripts(scripts, callback);
});
} else {
if(typeof callback === "function") {
callback(true);
}
}
}
injectScripts(["thirdParty/jquery-2.0.3.js", "work.js"], doSomethingElse);
Or, promisified (and brought more in line with the proper signature):
function injectScript(tabId, injectDetails) {
return new Promise((resolve, reject) => {
chrome.tabs.executeScript(tabId, injectDetails, (data) => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError.message);
} else {
resolve(data);
}
});
});
}
injectScript(null, {file: "thirdParty/jquery-2.0.3.js"}).then(
() => injectScript(null, {file: "work.js"})
).then(
() => doSomethingElse
).catch(
(error) => console.error(error)
);
Or, why the heck not, async
/await
-ed for even clearer syntax:
function injectScript(tabId, injectDetails) {
return new Promise((resolve, reject) => {
chrome.tabs.executeScript(tabId, injectDetails, (data) => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError.message);
} else {
resolve(data);
}
});
});
}
try {
await injectScript(null, {file: "thirdParty/jquery-2.0.3.js"});
await injectScript(null, {file: "work.js"});
doSomethingElse();
} catch (err) {
console.error(err);
}
Note, in Firefox you can just use browser.tabs.executeScript
as it will return a Promise.
Apart from the solutions already mentioned, you can also download jquery.min.js
locally and then use it -
For downloading -
wget "https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"
manifest.json -
"content_scripts": [
{
"js": ["/path/to/jquery.min.js", ...]
}
],
in html -
<script src="/path/to/jquery.min.js"></script>
Reference - https://developer.chrome.com/extensions/contentSecurityPolicy
참고URL : https://stackoverflow.com/questions/21317476/how-to-use-jquery-in-chrome-extension
'programing tip' 카테고리의 다른 글
람다로 정렬하는 방법? (0) | 2020.08.08 |
---|---|
Vim 사용자 여러분, 오른손은 어디에 있습니까? (0) | 2020.08.08 |
연결 목록은 어떤 상황에서 유용합니까? (0) | 2020.08.08 |
이식 가능한 클래스 라이브러리 란 무엇입니까? (0) | 2020.08.08 |
Android에서 프로그래밍 방식으로 WEP / EAP WiFi 구성을 만들고 읽는 방법은 무엇입니까? (0) | 2020.08.08 |