JS库“重新加载”页面模仿预加载代码注入?

时间:2012-05-03 01:42:43

标签: javascript

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

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

  1. 通过XHR从window.location
  2. 下载原始文档
  3. 从DOM中删除所有元素,包括所有脚本标记。也许会抛出漂亮的启动画面以获得良好的用户体验。
  4. 清除所有超时和间隔(在FF和Chrome上,ID似乎从1开始计算,因此不需要先验知识AFAIK)。
  5. 删除/取消定义空白文档中不存在的windowdocument中的所有密钥...考虑到可能安装了某些扩展程序,可能需要一些iframe技巧/ messaging实际获取引用空白文档。
  6. 将脚本注入现在空白的文档中。
  7. 重新插入XHR原始文档中的所有标记,包括脚本,然后在新的上下文中重新加载并重新执行。
  8. 取下闪屏,你就好了!
  9. 现在,我完全愿意接受这个并开源它,但有没有人尝过这样的事情呢?这将是很多工作,我宁愿不重新发明轮子,除非我们现在使用的是相当于棍棒上的方形巨石。

1 个答案:

答案 0 :(得分:1)

或使用适当的js shim将当前网址重写为新窗口。

(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();

})();