Сценарий Tampermonkey перезаписывается - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь использовать tampermonkey для удаления html элементов из списка на веб-странице, но через ~ 0,5 с оставшиеся элементы перезаписываются наполовину -

Первоначально: [ссылка на элемент 1 к пункту 1, пункт 2 - к пункту 2, пункт 3 - к пункту 3]

В течение 0,5 секунд после моего сценария все идеально: [пункт 2 ссылается на пункт 2, пункт 3 - на пункт 3]

Затем элементы перезаписываются (даже если наведите курсор правильно): [элемент 2 ссылается на элемент 1, элемент 3 ссылается на элемент 2]

Я предполагаю, что это из-за некоторого сценария он работает в фоновом режиме, но даже если я пытаюсь удалить все сценарии с помощью:

// @run-at document-start:
var scripts = document.getElementsByTagName('script');
  for (var k = 0; k < scripts.length; k++) {
    scripts[k].setAttribute('src', 'asdf');
    scripts[k].innerText = "";
    scripts[k].innerHTML = "";
  }

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

1 Ответ

3 голосов
/ 28 марта 2020

Если вы запускаете свой скрипт пользователя при запуске документа, возможно, страница еще не загружена - тэги не будут удалены.

Если вы запустите свой скрипт пользователя нормально, страница уже будет загружена - скрипт теги, скорее всего, уже будут запущены.

Если вы хотите убедиться, что на странице не выполняется ни один из собственных сценариев, присоедините MutationObserver ко всему документу в начале загрузки страницы, и когда тег сценария добавил, удали его. Микрозадача, во время которой запускается MutationObserver, будет до . Запустится содержимое скрипта:

<script>
// Example userscript code
const observer = new MutationObserver((mutations) => {
  for (const { addedNodes} of mutations) {
    for (addedNode of addedNodes) {
      if (addedNode.nodeType === 1 && addedNode.tagName === 'SCRIPT') {
        console.log('script removed');
        addedNode.remove();
      }
    }
  }
});
observer.observe(document.documentElement, { childList: true, subtree: true });
</script>

<script>
console.log('Example page script running');
</script>
<div>
  Content
  <script>
  console.log('Example nested page script running');
  </script>
</div>

Убедитесь, что ваш пользовательский скрипт запускается с мгновенным внедрением скрипта и document-start, чтобы обеспечить выполнение до того, как что-либо на странице существует. (Если страница может получить скрипт до запуска вашего пользовательского скрипта, она может делать все, что захочет)

...