Расширения Google Chrome: как включить jQuery в программно внедряемый сценарий контента?

Я вставляю свой скрипт контента с фоновой страницы, когда пользователь нажимает кнопку действие браузера, например так:

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.executeScript(null, { file: "content.js" });
});

Итак, как я могу получить доступ к jQuery изнутри моего content.js? Я не вижу способа ввести это одновременно.


person mpen    schedule 15.01.2011    source источник


Ответы (5)


Что о:

chrome.tabs.executeScript(null, { file: "jquery.js" }, function() {
    chrome.tabs.executeScript(null, { file: "content.js" });
});

Вы можете скачать "jquery.js" отсюда: http://jquery.com/download/

person serg    schedule 15.01.2011
comment
Это забросит их в один и тот же изолированный мир? Я дам ему вихрь! - person mpen; 15.01.2011
comment
Ха! Блестящий. Работает! Спасибо :D - person mpen; 15.01.2011
comment
Но... что, если вы используете размещенный jQuery на googleapis.com? - person temporary_user_name; 28.08.2013
comment
@Aerovistae Вы можете просто скачать его, это будет быстрее и безопаснее. И serg, так просто, но так эффективно! Гениальное решение! - person Kaspar Lee; 07.07.2016
comment
$ еще не определен. - person C4d; 28.02.2018
comment
Это работает отлично! Большое спасибо. - person Babaktrad; 27.12.2020

Как насчет добавления этого в файл манифеста

"content_scripts": [
    {
        "js": [
                "jquery.js", 
                "contentscript.js"
            ]
    }
],
person Apoorv Saini    schedule 26.05.2013
comment
Разве это не заставит Chrome анализировать jQuery на каждой вкладке, даже если это не нужно? - person Manuel Faux; 27.06.2013
comment
@ManuelFaux да. Вам нужно будет добавить свойство match, которое управляет доменами, на которых он будет выполнять jQuery. - person frosty; 18.11.2013
comment
Где мне найти этот jquery.js? - person Daniel Möller; 25.06.2015
comment
@Daniel, вы должны загрузить его (code.jquery.com), назвать его jquery.js и оставить в том же каталоге, если вы хотите использовать его точный код - person neaumusic; 25.06.2015
comment
Этот ответ не является решением вопроса. Спрашивающему требуется программная инъекция (developer.chrome.com/extensions/content_scripts#pi ), который запускается нажатием кнопки действия браузера, а не на каждой отдельной странице, соответствующей шаблону в файле манифеста. - person Ethan Yang; 24.06.2016
comment
Мне нужно было использовать jq на всех страницах, соответствующих шаблону, поэтому я исправил это следующим образом: prntscr.com/evhfj2 - person Mr Megamind; 12.04.2017

ОБНОВИТЬ:

Выполнять второй скрипт после первого было бы точнее с точки зрения порядка выполнения скриптов, result - это массив результатов выполнения скрипта в списке вкладок.

chrome.tabs.executeScript(null, {file:'js/jquery-2.1.1.min.js'}, function(result){
    chrome.tabs.executeScript(null, {file:'js/myscript.js'});
});

СТАРЫЙ:

Внедрение Jquery, за которым следует ваш скрипт, даст возможность доступа к Jquery в вашем скрипте.

chrome.tabs.executeScript(null, {file:'js/jquery-2.1.1.min.js'});
chrome.tabs.executeScript(null, {file:'js/myscript.js'});

У вас больше контроля над тем, как следует вводить скрипт, как описано здесь. Свойство allFrames особенно важно, если вы хотите внедрить скрипт во все кадры в документе. Игнорирование этого будет введено только в верхний кадр. Поскольку это не упоминается в других ответах, думаю, это поможет вам. Скрипты всегда можно внедрить, добавив их в манифест, как описано здесь.

person Ruwanka Madhushan    schedule 25.06.2015
comment
Да, но вы должны использовать обратный вызов первого для внедрения второго. В противном случае они могут завершить выполнение в неправильном порядке, что будет сложно отладить. - person Teepeemm; 21.02.2017
comment
@Teepeemm да, это было бы правильным решением. Я обновлю ответ. - person Ruwanka Madhushan; 22.02.2017

Поскольку у меня много скриптов со многими зависимостями, я использую функцию concatenateInjection, которая принимает три параметра:

//id: the tab id to pass to executeScript
//ar: an array containing scripts to load ( index order corresponds to execution order)
//scrpt (opzional): the last script to execute (if not provided, than the last script is the last insert in previous array)

function concatenateInjections(id, ar, scrpt){
  var i = ar.length;
  var idx = 0;

  function inject(idx){
    idx++;
    if(idx <= i){
      var f = ar[idx-1];
      chrome.tabs.executeScript(id, { file: f }, function() {
          inject(idx);
      });
    }else{
      if(typeof scrpt === 'undefined') return;
      chrome.tabs.executeScript(id, { file: scrpt });
    }
  }
  inject(idx);
}

и пример использования:

// id is tab id

// sources: first execute jquery, than default.js and anime.js in the end
var def = [
  "lib/jquery-1.11.3.min.js", 
  "lib/default.js", 
  "injection/anime.js"
];

// run concatenate injections
concatenateInjections(id, def);

Думаю, это может быть полезно.

ОБНОВИТЬ

Версия с concat и замыканием (более эстетичная):

function concatenateInjections(id, ar, scrpt){

  if( typeof scrpt !== 'undefined' ) ar = ar.concat([scrpt]);

  var i = ar.length;
  var idx = 0 ;

  (function (){
    var that = arguments.callee;
    idx++;
    if(idx <= i){
      var f = ar[idx-1];
      chrome.tabs.executeScript(id, { file: f }, function(){ that(idx);} );
    }
  })();

}
person Sim Sca    schedule 18.09.2015
comment
Потому что, если есть несколько скриптов с одинаковыми зависимостями, я могу определить один массив ar для этого зависимого и изменить только параметр scrpt для каждого вызова concatenateInject. Я очень ленивый ;-) - person Sim Sca; 19.09.2015
comment
Я обновил, используя ar.concat(...), как предложил @Xan. В любом случае я предпочитаю поддерживать параметр scrpt, поэтому мне не нужно писать myarray.concat('str') в concatenateInjections(). Помните: я очень ленивый :-) - person Sim Sca; 19.09.2015
comment
Все хорошо; это полезный код. Я имел в виду использовать его как concatenateInjections(id, ar.concat(script)) для варианта использования, который вы представляете, и сохранить его как 2 аргумента. - person Xan; 19.09.2015

в любое время, когда вы хотите динамически вставить jQuery, я рекомендую этот скрипт

лично у меня есть пользовательский поиск Chrome "$", который заменяет $ на

javascript:
var jq = document.createElement('script');
jq.onload = function(){};
jq.src = "https://code.jquery.com/jquery-2.1.1.min.js";
document.querySelector('head').appendChild(jq);

javascript: — это просто способ запустить javascript из адресной строки.

я использую это на моей странице about:blank, когда я пытаюсь быстро смоделировать ситуацию css

person neaumusic    schedule 25.06.2015