【发布时间】:2013-11-25 20:08:21
【问题描述】:
根据关于 Bookmarklets (http://en.wikipedia.org/wiki/Bookmarklet) 的维基百科文章,Bookmarklets 的概念是:
Web 浏览器使用 URI 作为标签的 href 属性和 书签。 URI 方案,例如 http:、file: 或 ftp:,指定 其余字符串的协议和格式。浏览器也 实现一个前缀 javascript: 解析器就像任何其他的一样 URI。在内部,浏览器看到指定的协议是 javascript,将字符串的其余部分视为 JavaScript 应用程序 然后执行,并使用结果字符串作为新的 页面。
它表示将生成的字符串用作新页面。那么这是否意味着浏览器拥有的原始 DOM 不受该字符串的影响?但是,如果 only 将结果字符串用作新页面,我如何在现有 DOM 中更改或注入新的 DOM 元素?因为警告 Hello 或注入一些新的 DOM 元素的脚本并没有真正返回任何内容。他们在现有的 DOM 上工作。
现在,在 Internet Explorer 中,除了使用 Bookmarklets 在页面上执行一些 JavaScript 之外,我还可以编写一个 BHO 插件并通过以下方式注入:
document = (HTMLDocument)webBrowser.Document;
var injectedJS = System.IO.File.ReadAllText("InjectedJS.js");
var window = document.parentWindow;
window.execScript("(function(){ " + injectedJS + " })()");
类似地在 chrome 中,我可以写一个扩展来实现同样的事情:
var s = document.createElement('script');
s.src = chrome.extension.getURL("script.js");
s.onload = function() {
this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);
这些有何不同? 我的高级问题是:
- 这三种方法是否在不同的环境中执行 JavaScript 代码?
- 其中一个是否存在其他一个没有的限制?
- 执行结果呈现给用户或反映在浏览器中的方式有什么不同吗?
- “JavaScript 注入”和“书签”这两个术语有什么区别吗?虽然我相信 JavaScript 注入是一种效果,而 Bookmarklets 是实现它的一种方式,但 BHO 和 Chrome 扩展是另一种方式。
- 如果 4 中的假设是正确的,那么使用 BHO 的
execScript方法或在浏览器中使用 javascript: 协议执行 JavaScript 的方式有什么不同吗?
【问题讨论】:
-
不是一个“真正的”答案(例如,不知道 BHO),只是一个评论: 1. 不是真的(在 Chrome Ext. 中注入脚本的代码在隔离的环境中运行,但注入的脚本在网页 JS 上下文中运行)。 2. 分机。功能强大得多(并且可以访问许多其他 API 和功能)。书签更简单(并且跨浏览器更便携)。 3. 如果你按照上面描述的方式实现它,可能不是,而是一个 Ext。可能会有所不同 4. 根据上下文,这些术语可能具有不同的含义,但您的总体思路是对的 5. 不知道
标签: javascript google-chrome-extension bookmarklet bho javascript-injection