Вызов функции из другого скрипта.
Вот есть фоновый скрипт, в нём чисто запросы, обработчики с действиями...
function GetHttpRequest(href, arg)
{
var xhr = new XMLHttpRequest()
xhr.withCredentials = true
xhr.onreadystatechange = function(e)
{
e.data = arg
ProcessRequestChange.apply(this, arguments)
}
xhr.open('GET', href, true)
xhr.send(null)
}
А есть скрипт, подключаемый к активной странице, в нём я только получаю ссылки, по которым нужно сделать запрос и обработать их(в фоновом скрипте).
var ref, tr = table.querySelectorAll('tr')
for(var i = 0, size = tr.length; i < size; i++)
{
if(tr[i] == null) continue
ref = tr[i].querySelector('a[href^="info.php?id="]')
if(ref == null) continue
//ref.href // Ссылка на объект
}
Как мне вызвать и передать в функцию?
GetHttpRequest(ref.href, {rid: 456})
|
>подключаемый к активной странице
>из фоновой страницы Так страница одна, ли несколько? Если одна, то все подключённые скрипты работают в едином пространстве:
<script>
fuction script1Func(msg){
alert(msg)
}
</script>
<script>
script1Func('from script 2')
</script>
Если несколько, то прямое взаимодействие возможно лишь если одна открыла другую через window.open или в frame и при этом они одного домена. Непрямое взаимодействие возможно(например через localStorage и его события), но польза от него в данном случае сомнительна. |
Делаю приложение для хрома.
background.js - он же фоновый, загружается для приложения... А maps.js - (где получаю ссылки) для определённой страницы. Попробовал вызвать функцию, получил ошибку в консоль... Поставил в манифесте, чтобы для страницы background.js тоже грузился - заработало.
{
"content_scripts":
[
{
"matches": ["http://www.site.ru/map.php*"],
"js": ["background.js", "maps.js"],
"run_at": "document_end"
}
],
"background":
{
"scripts": ["background.js"]
}
}
Но ведь это не есть хорошо? Зачем 10 раз подгружать одно и тоже, тем более у меня в background.js есть свои события вызова функций... Цитата:
Я в приложении сохраняю настройки, в фоновом они ещё работают, а в скрипте для страницы - нет... Тоже как - то нужно получать их из фонового... |
Расширение - совершенно другая тема. И методы общения между background и content скриптами по-моему разжёвываются в каждом уроке.
https://developer.chrome.com/extensions/messaging |
Получается, чтобы получить от расширения значение localStorage, в maps.js нужно сделать так?
var ls // Массив приёмник, для значения localStorage
chrome.runtime.sendMessage // Отправка сообщения
(
{id: 1}, // Аргументы сообщения
function(response) // Обработчик для ответа
{
ls = response.value // Записать значение
}
)
А в background.js так?
localStorage['ls'] = 1 // То, что нужно получить
chrome.runtime.onMessage.addListener // Отлов сообщений
(
function(request, sender, sendResponse) // Обработчик
{
//console.log(sender.tab ? "от скрипта:" + sender.tab.url : "от расширения")
switch(request.id) // Значение аргумента id
{
case 1:
{
sendResponse({value: localStorage['ls']}) // Вернуть значение?
break
}
}
}
)
А это для чего? Что - то не понял...
chrome.tabs.query
(
{active: true, currentWindow: true},
function(tabs)
{
chrome.tabs.sendMessage
(
tabs[0].id,
{greeting: "hello"},
function(response)
{
console.log(response.farewell)
}
)
}
)
|
Последнее - это если надо наоборот из background послать запрос content скрипту.
|
Спасибо )
Ещё 1 вопрос, ответ от сообщения же придёт не сразу? Ну т.е. если мне нужно в функции получить значение из памяти и проверить его. А ответ придёт когда код уже выполнился... Может создать 1 файл для работы с памятью, и подключать его везде, где нужно? Или не сработает? |
Сразу приучайся работать с асинхронным кодом.
Javascript всё дальше и дальше нынче уходит в асихронность. |
Возможно как - то проверить, загрузилась ли уже страница?
Просто если назначить обработчик после события - функция не будет вызвана...
function main()
{
alert('main')
}
function listener()
{
alert('listener')
document.addEventListener('DOMContentLoaded', main)
}
function init()
{
alert('init')
setTimeout(listener, 3000)
}
init()
Хочу попробовать через chrome.runtime.message получить все localStorage, и только потом уже выполнять код... Но т.к. там задержки будут не известно успеют ли придти все 3 сообщения до постройки DOM... |
А, не, нашел...
function main()
{
alert('main')
}
function listener()
{
alert('listener')
if(document.readyState === "loading") document.addEventListener('DOMContentLoaded', main)
else main()
}
function init()
{
alert('init')
setTimeout(listener, 3000)
}
init()
|
| Часовой пояс GMT +3, время: 23:39. |