2015-10-23 4 views
0

В background.js, создать всплывающее окно, как так:передавая значение от background.js выпадающего

chrome.windows.create({ 
    focused: true, 
    width: 1170, 
    url : "settings/index.html", 
    type: "popup" 
}, function(popup) { 
    tab_app = popup.id; 
    alert(tab_app); 
}); 

хранить идентификатор в tab_app.

Как я могу передать значение из background.js во всплывающее окно?

Пытаюсь как то:

chrome.tabs.executeScript(tab_app, {code: "alert("+message.add+");"}); 

, но он продолжает говорить мне, что эта вкладка ID оленья кожа существовать .. им предполагая его, потому что его всплывающее окно. оценят некоторую помощь.

ответ

1

Поскольку ваша страница расширения, методом выбора является Messaging.

Примечание: вы не можете использовать обмен сообщениями на вкладке chrome.tabs.sendMessage, поскольку это явно предназначено для контекста сценария содержимого (которого нет для страниц расширения). Вам нужно использовать «широковещательный» chrome.runtime.sendMessage, который будет отправлен на все другие страницы расширения.

Если у вас может быть несколько окон всплывающего окна за раз, это может быть проблемой - вам нужен какой-то идентификатор. Вы можете передать его как параметр URL или хеш-URL, например. "settings/index.html?id=foo" или "settings/index.html#foo". Если вы не ожидаете более одного всплывающего окна (вы всегда можете проверить, открыт ли он перед открытием нового), это не имеет значения.

Если вам действительно нужна динамическая загрузка или выполнение кода, а не просто передача данных (сомнительно), вам необходимо помнить о CSP.

  • Вы можете динамически загружать скрипт из пакета расширения, просто создавая и добавляя в документ тег <script>.
  • Однако вы не можете по умолчанию передать строку кода и eval в контексте расширения. Вы можете добавить 'unsafe-eval' в строку CSP, но это плохая идея в целом.
  • Скорее всего, вам понадобятся только некоторые команды, которые будут переданы вместе с данными. Чистый обмен сообщениями хорош для него, просто посмотрите на документы.

Возможно, это old answer of mine. Я использую открытие новой вкладки и передачу данных там для ее печати.

+0

Лучший ответ, который я получил с тех пор, как я зарегистрировался здесь. Благодаря! – user3800799

0

Вы не можете позвонить executeScript на своих extension страницах. Если вы попытаетесь использовать executeScript на своей странице расширения. Он покажет сообщение об ошибке:

Unchecked runtime.lastError во время работы tabs.executeScript: Может не содержание доступа ВГД "хром-расширения: //extension_id/yourPage.html". Extension манифеста должен запросить разрешение на доступ к этому хозяину

Теперь вы не можете добавить "chrome-extension://<extension_id>/yourPage.html" под permissions в manifest.json, потому что он является недействительным и не допускаются. Вместо этого вы можете использовать message passing.

background.js:

function createNewtab(){ 
    var targetId = null; 
    chrome.tabs.onUpdated.addListener(function listener(tabId, changedProps) { 

     if (tabId != targetId || changedProps.status != "complete") 
     return; 

    chrome.tabs.onUpdated.removeListener(listener); 
     chrome.tabs.sendMessage(targetId, {message : "loadNewTab"},function(response){ 
      // do nothing yet 
     }); 

    }); 

    chrome.windows.create({ 
     focused: true, 
     width: 1170, 
     url : chrome.extension.getURL("settings/index.html"), 
     type: "popup" 
     }, function(popup) { 
      targetId = popup.tabs[0].id;  
    }); 
} 

index.js:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){ 
    switch (request.message){ 
     case "loadNewTab": 
      alert("HI") 
      break; 
    } 
}); 
+0

Но я хочу, чтобы он был динамичным - я хочу, чтобы иметь возможность использовать executeScript, когда когда-либо понадобится – user3800799

+1

Во время создания вашего окна или вкладки вам придется дождаться загрузки до вызова executeScript(). Как только он загрузится, просто удалите слушателя и вызовите executeScript всякий раз, когда захотите. Я отредактировал ответ, чтобы удалить слушателя. – Sid

+0

Эй, это не работает для меня. предупреждение не появляется. – user3800799

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