繁体   English   中英

Bookmarklet 在没有 JavaScript 的情况下加载当前页面?

[英]Bookmarklet to load current page without JavaScript?

我想要一个书签来加载没有脚本的当前页面/选项卡,就好像浏览器在其设置中禁用了 JavaScript。 是否可以?

它的工作方式有点像这个 Chrome 扩展程序: https : //chrome.google.com/webstore/detail/toggle-javascript/cidlcjdalomndpeagkjpnefhljffbnlo

但是如果没有“切换”功能,即书签将无法启用 JavaScript。

我喜欢那个扩展,我很想在 iOS 上有类似的东西。 可以在 Safari 中禁用 JavaScript,但是每次我想加载没有脚本的页面时都打开设置很烦人。

我认为书签可以让我在没有脚本的情况下快速加载当前页面,但我不知道是否可能。 随意建议其他解决方法(也许使用快捷方式/工作流程?)。

一种选择是使用用户脚本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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM