Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.10.2016, 14:22
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Вызов функции из другого скрипта.
Вот есть фоновый скрипт, в нём чисто запросы, обработчики с действиями...

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})

Последний раз редактировалось Артист, 20.10.2016 в 14:40.
Ответить с цитированием
  #2 (permalink)  
Старый 20.10.2016, 14:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

>подключаемый к активной странице
>из фоновой страницы
Так страница одна, ли несколько?
Если одна, то все подключённые скрипты работают в едином пространстве:
<script>
fuction script1Func(msg){
    alert(msg)
}
</script>
<script>
    script1Func('from script 2')
</script>


Если несколько, то прямое взаимодействие возможно лишь если одна открыла другую через window.open или в frame и при этом они одного домена.
Непрямое взаимодействие возможно(например через localStorage и его события), но польза от него в данном случае сомнительна.
__________________
29375, 35

Последний раз редактировалось Aetae, 20.10.2016 в 14:37.
Ответить с цитированием
  #3 (permalink)  
Старый 20.10.2016, 15:35
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Делаю приложение для хрома.

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 есть свои события вызова функций...

Сообщение от Aetae Посмотреть сообщение
Непрямое взаимодействие возможно(например через localStorage и его события), но польза от него в данном случае сомнительна.
У меня ещё и с localStorage проблемы.
Я в приложении сохраняю настройки, в фоновом они ещё работают, а в скрипте для страницы - нет...

Тоже как - то нужно получать их из фонового...

Последний раз редактировалось Артист, 20.10.2016 в 15:53.
Ответить с цитированием
  #4 (permalink)  
Старый 20.10.2016, 16:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Расширение - совершенно другая тема. И методы общения между background и content скриптами по-моему разжёвываются в каждом уроке.
https://developer.chrome.com/extensions/messaging
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 20.10.2016, 17:54
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Получается, чтобы получить от расширения значение 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)
			}
		)
	}
)

Последний раз редактировалось Артист, 20.10.2016 в 17:57.
Ответить с цитированием
  #6 (permalink)  
Старый 20.10.2016, 18:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Последнее - это если надо наоборот из background послать запрос content скрипту.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 20.10.2016, 19:05
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Спасибо )
Ещё 1 вопрос, ответ от сообщения же придёт не сразу?
Ну т.е. если мне нужно в функции получить значение из памяти и проверить его.
А ответ придёт когда код уже выполнился...

Может создать 1 файл для работы с памятью, и подключать его везде, где нужно?
Или не сработает?
Ответить с цитированием
  #8 (permalink)  
Старый 20.10.2016, 19:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Сразу приучайся работать с асинхронным кодом.
Javascript всё дальше и дальше нынче уходит в асихронность.
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 21.10.2016, 21:54
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Возможно как - то проверить, загрузилась ли уже страница?

Просто если назначить обработчик после события - функция не будет вызвана...

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...
Ответить с цитированием
  #10 (permalink)  
Старый 21.10.2016, 22:02
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

А, не, нашел...

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()
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции страницы из расширения chrome nontxt Events/DOM/Window 0 09.02.2015 10:42
Вызов функции из функции с параметрами cript Events/DOM/Window 13 18.01.2015 14:57
Вызов функции дочернего окна mgluhov Events/DOM/Window 18 16.07.2012 23:05
Запретить вызов функции более 1 раза в секунду asdasd Общие вопросы Javascript 11 29.03.2012 15:22
Вызов функции zxc Общие вопросы Javascript 6 15.09.2008 11:56