Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   Firefox extension: как гарантировать, что скрипт стартует после построения страницы? (https://javascript.ru/forum/css-html-firefox-mizilla/78826-firefox-extension-kak-garantirovat-chto-skript-startuet-posle-postroeniya-stranicy.html)

vgiv 09.11.2019 20:12

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, но изменений не увидел.

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

Владимир.

Malleys 10.11.2019 12:59

Цитата:

Сообщение от vgiv
Но при перезагрузке страницы

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

Цитата:

Сообщение от vgiv
а также при переходе на любое другое фото

При переходе на другое фото меняется только текст у div.info

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

Цитата:

Сообщение от vgiv
Ведь скрипты расширения, вроде бы, должны отрабатывать только когда страница уже построена.

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

Т. е. вы сейчас меняете текст при загрузке, но ещё нужно отслеживать изменения в DOM при помощи MutationObserver

Aetae 10.11.2019 14:47

vgiv, что делать написали выше, а причина подробнее: никакого "перехода на новую страницу" на самом деле нет, только имитация, вы имеете дело скорее всего с SPA.
По хорошему надо понять на чём конкретно оно написано и по document_start выстраиваться в сам фреймворк, тогда можно будет очень точно и детально работать с тем что нужно. Но если разбираться неохота, то простое и злобное решение с MutationObserver работать будет в любом случае.)

vgiv 10.11.2019 17:45

Malleys, Aetae, спасибо, буду разбираться.


Часовой пояс GMT +3, время: 02:28.