Букмарклет для загрузки текущей страницы без JavaScript? - PullRequest
0 голосов
/ 24 января 2019

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

Это будет работать как расширение Chrome: https://chrome.google.com/webstore/detail/toggle-javascript/cidlcjdalomndpeagkjpnefhljffbnlo

Но без функции «переключения», т. Е. Букмарклет не включит JavaScript.

Мне нравится это расширение, и я хотел бы иметь что-то похожее на iOS. В Safari можно отключить JavaScript, но раздражает открытие настроек каждый раз, когда я хочу загрузить страницу без сценариев.

Я думал, что букмарклет может позволить мне быстро загрузить текущую страницу без сценариев, но я не знаю, возможно ли это. Не стесняйтесь предлагать другие обходные пути (возможно, с помощью ярлыков / рабочего процесса?).

1 Ответ

0 голосов
/ 24 января 2019

Один из вариантов - использовать userscript : fetch текущей страницы, проанализировать текст ответа в документе, удалить все теги <script> в документе, а затем открыть новое окно с window.open() и заполните его <head> и <body> очищенными документами <head> и <body>:

window.openPageWithoutScripts = async function() {
  const resp = await fetch(window.location.href);
  const text = await resp.text();
  const doc = new DOMParser().parseFromString(text, 'text/html');
  doc.querySelectorAll('script').forEach(script => script.remove());
  const w = window.open();
  w.document.head.innerHTML = doc.head.innerHTML;
  w.document.body.innerHTML = doc.body.innerHTML;
};

Затем, когда вы хотите открыть текущую страницу без каких-либо сценариев, откройте консоль и введите openPageWithoutScripts().

Это удаляет <script> теги, но не встроенные обработчики, которые менее предсказуемы и от которых сложнее избавиться (хотя, к счастью, они являются плохой практикой и, как правило, реже).

Чтобы также удалить встроенные обработчики, создайте массив всех возможных событий, затем выполните итерации по ним и querySelectorAll элементам с этими обработчиками и удалите атрибут:

window.openPageWithoutScripts = async function() {
  const resp = await fetch(window.location.href);
  const text = await resp.text();
  const doc = new DOMParser().parseFromString(text, 'text/html');
  doc.querySelectorAll('script').forEach(script => script.remove());
  const eventNames = ['click', 'load', 'error']; // etc
  eventNames.forEach((e) => {
    const onEventName = 'on' + e;
    document.querySelectorAll(`[${onEventName}]`).forEach((elm) => {
      elm.removeAttribute(onEventName);
    });
  });
  const w = window.open();
  w.document.head.innerHTML = doc.head.innerHTML;
  w.document.body.innerHTML = doc.body.innerHTML;
};
...