Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.11.2019, 20:12
Новичок на форуме
Отправить личное сообщение для vgiv Посмотреть профиль Найти все сообщения от vgiv
 
Регистрация: 09.11.2019
Сообщений: 3

Firefox extension: как гарантировать, что скрипт стартует после построения страницы?
Привет!

Пытаюсь написать своё первое расширение для Firefox и упираюсь в непонятное.

Итак, текст скрипта test.js имеет вид:
start = function() {
  console.log('Testing...');
  var elem = document.querySelector('div.info');
  elem.innerHTML = 'Testing: ' + elem.innerHTML;
}
start();


Соотвествующий файл manifest.json:
{
  "manifest_version": 2,
  "name": "Test",
  "version": "1.0",
  "description": "Testing",
  "permissions": [
	"*://pastvu.com/*"
   ],
  "content_scripts": [
    {
      "matches": ["*://pastvu.com/p/*"],
      "js": ["test.js"]
    }
  ]
}


Я открываю страницу на сайте - скажем, https://pastvu.com/p/965925 - и, используя about:debugging#/runtime/this-firefox, временно загружаю расширение. Название фото меняется на "Testing: Памятник Петру I" - пока всё правильно. Но при перезагрузке страницы, а также при переходе на любое другое фото, название уже не меняется (хотя скрипт отрабатывает, что видно по выводу "Testing..." в консоли). После перезагрузки скрипта всё срабатывает, но тоже только один раз. Если я последнюю строчку скрипта заменяю на

window.setTimeout(start, 500);


то после перезагрузки страницы скрипт отрабатывает (но при переходе на новую страницу - нет), из чего я делаю вывод, что в первой версии он срабатывал до полного построения страницы.

Вопрос - почему? Ведь скрипты расширения, вроде бы, должны отрабатывать только когда страница уже построена. И как сделать, чтобы всё работало без таймаутов и на всех страницах?

Явное задание в свойствах скрипта
"run_at": "document_idle"


не помогает. Пытался экспериментировать с windows.onLoad, но изменений не увидел.

Помогите, кто в теме.

Владимир.
Ответить с цитированием
  #2 (permalink)  
Старый 10.11.2019, 12:59
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от vgiv
Но при перезагрузке страницы
При перезагрузке страницы элемента div.info ещё нет, он вставляется позже.

Сообщение от vgiv
а также при переходе на любое другое фото
При переходе на другое фото меняется только текст у div.info

Соответственно вам нужно отслеживать изменения элементов, их вставку на страницу. Это можно сделать при помощи MutationObserver

Сообщение от vgiv
Ведь скрипты расширения, вроде бы, должны отрабатывать только когда страница уже построена.
И когда такое происходит? Вы двигаете карту, загружаете новое фото, происходят дополнительные изменения в странице… Страница может всё время меняться, DOM — это постоянно меняющаяся структура, если только не идёт речь о статичной HTML-страничке, сгенерированной при при помощи текстового препроцессора PHP.

Т. е. вы сейчас меняете текст при загрузке, но ещё нужно отслеживать изменения в DOM при помощи MutationObserver
Ответить с цитированием
  #3 (permalink)  
Старый 10.11.2019, 14:47
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

vgiv, что делать написали выше, а причина подробнее: никакого "перехода на новую страницу" на самом деле нет, только имитация, вы имеете дело скорее всего с SPA.
По хорошему надо понять на чём конкретно оно написано и по document_start выстраиваться в сам фреймворк, тогда можно будет очень точно и детально работать с тем что нужно. Но если разбираться неохота, то простое и злобное решение с MutationObserver работать будет в любом случае.)
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 10.11.2019, 17:45
Новичок на форуме
Отправить личное сообщение для vgiv Посмотреть профиль Найти все сообщения от vgiv
 
Регистрация: 09.11.2019
Сообщений: 3

Malleys, Aetae, спасибо, буду разбираться.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт на вкладку после перезагрузки страницы qazibum Javascript под браузер 2 04.02.2019 15:52
Подскажите как селать в отдельном файле ява скрипт с вызовом со страницы... alexmetalin Ваши сайты и скрипты 6 22.10.2009 15:21
firefox зависает после обновления страницы constantant Firefox/Mozilla 4 14.09.2009 12:30
Как запустить скрипт после отработки другого скрипта? roman2 Общие вопросы Javascript 2 10.08.2009 01:23
Как изменить скрипт, что бы им его можно было использовать для нужной страницы Nick50_70 Общие вопросы Javascript 0 28.04.2009 23:30