不用JavaScript即可加载当前页面的书签?

时间:2019-01-24 01:40:37

标签: javascript ios google-chrome mobile-safari bookmarklet

我想要一个小书签来加载当前页面/选项卡而不使用其脚本,就像浏览器的设置中禁用了JavaScript一样。有可能吗?

它将类似于以下Chrome扩展程序:https://chrome.google.com/webstore/detail/toggle-javascript/cidlcjdalomndpeagkjpnefhljffbnlo

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

我喜欢该扩展程序,并且希望在iOS上具有类似的功能。可以在Safari中禁用JavaScript,但是每次我要加载不带脚本的页面时都要打开“设置”很烦人。

我以为小书签可以让我快速加载当前页面而无需编写脚本,但是我不知道是否可能。随时提出其他解决方法(也许使用快捷方式/工作流程?)。

1 个答案:

答案 0 :(得分:1)

一种选择是使用userscriptfetch当前页面,将响应文本解析为文档,删除文档中的所有<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;
};