javascript - 无需 JavaScript 即可加载当前页面的书签?

标签 javascript ios google-chrome mobile-safari bookmarklet

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

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

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

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

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

最佳答案

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

关于javascript - 无需 JavaScript 即可加载当前页面的书签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54338219/

相关文章:

javascript - 悬停内容也覆盖同级 div

objective-c - 需要 CCRenderTexture 来渲染更快的 ios

iphone - 使用phonegap 2.9.0在iphone中以编程方式在后台发送短信

ios - react native 错误 ld : library not found for -lBVLinearGradient

google-chrome - chrome.tabs.create 在隐身窗口中打开一个标签在普通窗口中

google-chrome - 为什么 Chrome 不缓存响应,即使存在缓存控制 header ?

javascript - 在 Controller 和数据对象之间同步数据

php - 如何将php变量从链接传递到jquery ajax函数

google-chrome - 如何使用applescript在系统打印对话框中点击回车?

javascript - 为什么从 react 对象复制状态时必须将对象传播两次