Вызов функции из другого скрипта.
Вот есть фоновый скрипт, в нём чисто запросы, обработчики с действиями...
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, время: 16:16. |