Просмотр полной версии : Вызов функции из другого скрипта.
Вот есть фоновый скрипт, в нём чисто запросы, обработчики с действиями...
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 есть свои события вызова функций...
Непрямое взаимодействие возможно(например через localStorage и его события), но польза от него в данном случае сомнительна.
У меня ещё и с localStorage проблемы.
Я в приложении сохраняю настройки, в фоновом они ещё работают, а в скрипте для страницы - нет...
Тоже как - то нужно получать их из фонового...
Расширение - совершенно другая тема. И методы общения между 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()
В принципе, сообщения до постройки DOM отправляются и ответы приходят - это хорошо...
А, блин...Теперь понадобилось отправить из фонового скрипта в подключаемый к странице...
Кто может объяснить как это сделать?
chrome.tabs.query
(
{active: true, currentWindow: true},
function(tabs)
{
chrome.tabs.sendMessage
(
tabs[0].id,
{greeting: "hello"},
function(response)
{
console.log(response.farewell)
}
)
}
)
chrome.tabs - это вкладки я так понял...И больше ничего не понятно...
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot