4

Привет Я делаю расширение хром для некоторой практики, которая является простым блокировщиком сайтов. У меня есть два разных JS-файла, которым необходимо разделить один и тот же массив, содержащий URL-адреса для блокировки.Доступ к массиву в другом JS-файле - Расширение Chrome

  • background.js обрабатывает webRequests и блокирующие сайты
  • options.html страница опций, где пользователи могут редактировать URL-адресов, которые будут заблокированы, это вызывает storeURL.js так, что он может хранить все элементы в списке на странице html в массив js. Пока нет проблем.

Однако я не могу получить доступ к массиву внутри storeURL.js из background.js. Кажется, они вызываются в двух отдельных случаях. Если я попытаюсь включить как storeURL.js, так и background.js внутри моего background.html, это приведет к запуску двух полностью отдельных скриптов storeURL.js.

Как мне это сделать? Должен ли я хранить содержимое массива из storeURL.js в файл?

Некоторые примеры:

background.js

chrome.webRequest.onBeforeRequest.addListener(
    blocking,["blocking"]); 
    { urls: blockedURLS, types: [] }, ["blocking"]); 

storeURL.js заполнит массив на основе списка в options.html

var blockedURLS = []; 
     $('li').each(function(i, elem) { 
      blockedURLS.push($(elem).text()); 
     }); 

blockedURLS в моих background.js выглядит как не определено. Я также попытался указать свой файл options.html в background.js и просто включить все JS в одном файле со следующим:

<script type="text/javascript" src="background.js"></script> 

Однако, когда я делаю это, кажется, что второй background.js является а не просто указывая на уже запущенный.

Чувства, как будто я зашел в тупик, возможно, простое решение, которое доступно для устранения моей проблемы. Я довольно новичок в расширениях JS/chrome.

Спасибо, что нашли время, чтобы прочитать это!

EDIT: После нескольких попыток я могу получить доступ к моему заблокированному массиву в моем background.js. Однако он никогда не обновляется.

var blockedURLS = ["hi"] ; 

    var list = document.getElementById('list'); 
    $("#saveList").click(function(e) { 
     e.preventDefault(); 
     localStorage.setItem('todoList', list.innerHTML); 
     alertify.success("You have saved your list."); 

     //Pushes each element in the list from options.html into the urls array 
     blockedURLS = []; 
     $('li').each(function(i, elem) { 
      blockedURLS.push($(elem).text()); 
     }); 
     alert("Currently blocked:\n" + blockedURLS); 
    }); 
    $("#reset").click(function(e) { 
     e.preventDefault(); 
     localStorage.clear(); 
     location.reload(); 
    }); 

    loadToDo(); 

    function loadToDo() { 
     if (localStorage.getItem('todoList')){ 
     list.innerHTML = localStorage.getItem('todoList'); 
    } 
    } 

Что должно происходить в том, что после того, как я иду в мой options.html и сохранить список, «привет» должен быть заменен с разными URL, у меня есть в моем списке. Однако это не так. Тем не менее, массив заблокированныйURL печатается правильно.

+0

Возможный дубликат [Как передать переменное значение между фоновыми скриптами в хром-расширениях) (http://stackoverflow.com/questions/21012250/how-to-pass-a-variable-value-between-background-scripts -in-chrome-extensions) –

ответ

0

В последнее время я решил работать с такими вещами. Я никогда не нашел действительно хороший способ ... Итак, я использовал Storage api API расширения Chrome.Но это на самом деле не смешно использовать, потому что все методы asynchronus поэтому вы не можете просто сделать

myValue = chrome.storage.local.get("MyValue") 

Если вы хотите, я сделал объект, хранить данные автоматически в хранилище хрома, но позволяет просто и synchronus вызовов, такие как myValue = storage.myValue или storage.myValue = "something"

Here the github link

Она была написана в CoffeeScript, так что вы можете найти файл яваскрипта в папку бин. Сгенерированный javascript не очень легко читать/модифицировать, но вы можете понять эту идею, просто прочитав код CoffeeScript, я думаю.

Я могу объяснить больше, как это работает, если вы хотите. Расскажите мне в комментарии, и я уточню свой ответ.

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

EDIT: Я забыл сказать, что вам необходимо включить эти файлы буксировки на все страницы/Content Script, где вам нужно его использовать, конечно.

Ho и жаль мой бедный английский ... это на самом деле не мой основной язык ;-)

+0

это не рекомендуется. Ваш метод и библиотека игнорируют тот факт, что «набор» хранилища может завершиться неудачей, и ваша библиотека продолжит возвращать попытку установленного значения (которое позже не выполняется). –

+0

Да, потому что, как я сказал, это способ сделать это легко. Если вам нужно проверить ошибки, вы можете добавить пример обработчика ошибок. –

+0

Нет, потому что обработчик ошибок будет запущен после того, как вы получите значение, используя вашу библиотеку. –

0

мне пришлось использовать следующую команду:

var bg = chrome.extension.getBackgroundPage(); 

тогда я мог бы получить доступ к массиву blockedURLS по :

alert(bg.blockedURLS); 

, а также редактировать массив по

chrome.extension.getBackgroundPage().blockedURLS = []; 

, который установил бы его в пустой массив.

Спасибо, ребята, за помощь, это помогло мне подумать о разных возможностях при решении этой проблемы.

+0

Это довольно грубый метод; он очень сильно сочетает ваш код. Возможно, лучше использовать обмен сообщениями/память. – Xan

Смежные вопросы