크롬 확장에서 jQuery를 사용하는 방법?


128

크롬 확장 프로그램을 작성 중입니다. 그리고 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'
    });
});

그리고 잘 작동하지만 이런 방식으로 실행되도록 추가 된 스크립트가 비동기 적으로 실행되는지 여부가 우려됩니다. 그렇다면 work.js가 jQuery (또는 나중에 추가 할 다른 라이브러리) 이전 에도 실행될 수 있습니다.

또한 크롬 확장 프로그램에서 타사 라이브러리를 사용하는 정확하고 가장 좋은 방법이 무엇인지 알고 싶습니다.


2
올바른 방법은 바닐라로가는 것입니다!
bjb568 2014

팝업 확장에 jQuery를 추가하는 방법을 찾고 있다면 (예전처럼) 다음 질문을 참조하십시오. stackoverflow.com/questions/12035242/…
Pro Q

답변:


124

다음과 같이 chrome-extension 프로젝트와 backgroundmanifest.json 섹션에 jquery 스크립트를 추가해야 합니다.

  "background":
    {
        "scripts": ["thirdParty/jquery-2.0.3.js", "background.js"]
    }

content_scripts에 jquery가 필요한 경우 매니페스트에도 추가해야합니다.

"content_scripts": 
    [
        {
            "matches":["http://website*"],
            "js":["thirdParty/jquery.1.10.2.min.js", "script.js"],
            "css": ["css/style.css"],
            "run_at": "document_end"
        }
    ]

이것이 내가 한 일입니다.

또한 올바르게 기억하면 배경 스크립트는 .NET을 통해 열 수있는 배경 창에서 실행됩니다 chrome://extensions.


7
정확히 무슨 뜻 You have to add your jquery script to your chrome-extension project입니까? 나는 이것을했다 : manifest.json : "background": { ` "scripts": [ "thirdParty / jquery-2.0.3.js", "background.js"],`` "persistent": false``},`그리고 나는 jQuery를 타사 폴더로. 그러나 여전히 jQuery를 사용할 수 없습니다. 오류가 발생합니다. 테스트를 위해 파일에 Uncaught ReferenceError: $ is not defined 추가했습니다 work.js. $("body").html("Foo!");
Ishan

위의 댓글은 엉망인 것 같지만 댓글을 추가하는 동안 미리보기가 표시되지 않습니다. 저를 용서 해주세요.
Ishan

크롬 확장 폴더에 추가하려고합니다. /home/you/chromexetension_source_files/thirdParty/jquery-2.0.3.js와 같습니다. work.js에서도 동일한 작업을 수행해야합니다.
Nico

1
당신이 말한대로 해보았습니다. 하지만 여전히 내 work.js파일 에서 jquery에 액세스 할 수 없다는 동일한 오류가 발생 합니다. Uncaught ReferenceError: $ is not defined. 가능하다면 어딘가에 실제 예제를 업로드 해 주시겠습니까? '$ ( "body"). html ( "Foo!");'와 같은 간단한 예제 work.js에서.
Ishan 2014 년

7
나는 또한 얻 jQuery거나 $인정받는 데 어려움을 겪었습니다 . 매니페스트 배열에서 마지막으로 jQuery를 참조하는 것으로 나타났습니다. 내가 그것을 처음 넣었을 때 그것이 인식되었습니다.
BenR

18

다음을 수행하면 매우 쉽습니다.

manifest.json에 다음 줄을 추가하십시오.

"content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'",

이제 URL에서 직접 jQuery를로드 할 수 있습니다.

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>

출처 : google doc


1
로드 할 스크립트가 여러 개인 경우 어떻게됩니까?
또 다른

1
원격 서버에서 스크립트를로드하려는 경우 좋은 대답입니다 (확장 프로그램과 액세스 할 수있는 모든 항목을 사용하여 원격 서버를 신뢰해야 함).
Nathaniel Verhaaren

1
@NathanielVerhaaren 이것은 제기 할 합리적인 지점이지만 subresource integrity(SRI)를 사용하여 소스를 확인하면 완화 할 수 있습니다 .
Dan Atkinson 19

13

그리고 잘 작동하지만 이런 방식으로 실행되도록 추가 된 스크립트가 비동기 적으로 실행되는지 여부가 우려됩니다. 그렇다면 work.js가 jQuery (또는 나중에 추가 할 다른 라이브러리) 이전에도 실행될 수 있습니다.

그것은 정말로 걱정거리가 아닙니다. 당신은 특정 JS 컨텍스트에서 실행될 스크립트를 큐에 넣습니다. 그리고 그 컨텍스트는 단일 스레드이기 때문에 경쟁 조건을 가질 수 없습니다.

그러나이 문제를 제거하는 적절한 방법은 호출을 연결하는 것입니다.

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'
        });
    });
});

또는 일반화 :

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);

또는 약속 (적절한 서명에 따라 더 많이 가져옴) :

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)
);

또는 더 명확한 구문을 위해 도대체 왜 async/ await-ed :

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);
}

Firefox browser.tabs.executeScript에서는 Promise를 반환하므로 사용할 수 있습니다 .


첫 번째 방법은 훌륭합니다. JavaScript를 잘 모르는 사람으로서 저는 그런 생각을 한 적이 없습니다.
FriskySaga

11

이미 언급 한 솔루션 외에도 jquery.min.js로컬에서 다운로드 하여 사용할 수도 있습니다.

다운로드 용-

wget "https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"

manifest.json-

"content_scripts": [
   {
    "js": ["/path/to/jquery.min.js", ...]
   }
],

HTML에서-

<script src="/path/to/jquery.min.js"></script>

참조-https: //developer.chrome.com/extensions/contentSecurityPolicy


3
이것이 최선의 방법입니다 ... html 부분이 필요하지 않습니다.
c-an

1

제 경우에는 XDM (교차 문서 메시징) 및 페이지로드 대신 Chrome 확장 onclick 실행을 통해 작동하는 솔루션을 얻었습니다.

manifest.json

{
  "name": "JQuery Light",
  "version": "1",
  "manifest_version": 2,

  "browser_action": {
    "default_icon": "icon.png"
  },

  "content_scripts": [
    {
      "matches": [
        "https://*.google.com/*"
      ],
      "js": [
        "jquery-3.3.1.min.js",
        "myscript.js"
      ]
    }
  ],

  "background": {
    "scripts": [
      "background.js"
    ]
  }

}

background.js

chrome.browserAction.onClicked.addListener(function (tab) {
  chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
    var activeTab = tabs[0];
    chrome.tabs.sendMessage(activeTab.id, {"message": "clicked_browser_action"});
  });
});

myscript.js

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
        if (request.message === "clicked_browser_action") {
        console.log('Hello world!')
        }
    }
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.