0

抱歉,如果标题含糊不清,但这不是最容易描述的问题。目前,如果您想包装/重载浏览器中的内置函数,例如XmlHttpRequest.prototype.open = function(){return oldOpen(...)},并且您想在页面中的任何脚本执行之前执行此操作,则需要使用在之前执行的浏览器扩展程序/插件文档开始被解析。问题是,浏览器扩展的用户同意安装它们的转化率通常很低。我希望能够使用小书签来做同样的事情(Pinterest 已经证明小书签对他们来说不是障碍!)。但遗憾的是,根据定义,小书签在文档加载后很长时间才会运行。

我想做的,我认为理论上可能的,是伪造一个页面重新加载,但已经插入了一个脚本。这个过程看起来像这样:

  1. 通过 XHR 下载来自window.location.
  2. 从 DOM 中删除所有元素,包括所有脚本标签。也许抛出一个漂亮的闪屏以获得良好的用户体验。
  3. 清除所有超时和间隔(在 FF 和 Chrome 上,ID 似乎从 1 开始计数,因此不需要先验知识 AFAIK)。
  4. 删除/取消定义空白文档中不存在的所有键window...document鉴于可能安装了一些扩展,可能需要一些 iframe 技巧/消息才能实际获得参考空白文档。
  5. 将您的脚本注入现在空白的文档中。
  6. 重新插入 XHR 原始文档中的所有标签,包括脚本,然后应该在新上下文中重新加载并重新执行。
  7. 取下启动画面,您就可以开始了!

现在,我非常愿意尝试并开源它,但是以前有没有人尝试过这样的事情?这将是很多工作,我宁愿不重新发明轮子,除非我们现在使用的是相当于木棍上的方形巨石。

4

1 回答 1

1

或者使用适当的 js shim 将当前 url 重写到新窗口中。

(function() {

var scriptSrc = 'http://example.com/shim.js';
var rq = new XMLHttpRequest; rq.open('get', '', false);
rq.send();
var text = rq.responseText.replace('<head', '<script src="' + scriptSrc + '"></script><head');
var win = window.open();
win.document.open();
win.document.write(text);
win.document.close();

})();
于 2012-05-03T03:02:42.543 回答