根据关于 Bookmarklets 的维基百科文章 ( http://en.wikipedia.org/wiki/Bookmarklet),Bookmarklets的概念是:
Web 浏览器将 URI 用于标签的 href 属性和书签。URI 方案(例如 http:、file: 或 ftp:)指定字符串其余部分的协议和格式。浏览器还实现了前缀 javascript:解析器就像任何其他 URI 一样。在内部,浏览器看到指定的协议是 javascript,将字符串的其余部分视为JavaScript 应用程序,然后执行该应用程序,并将生成的字符串用作新页面。
它表示生成的字符串用作新页面。那么这是否意味着浏览器拥有的原始 DOM 不受该字符串的影响?但是,如果仅将结果字符串用作新页面,我如何在现有 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 注入”和“Bookmarklets”之间有什么区别吗?虽然我相信 JavaScript 注入是一种效果,而 Bookmarklets 是实现它的一种方式,但 BHO 和 Chrome 扩展是另一种方式。
- 如果 4 中的假设是正确的,那么使用 BHO 的
execScript
方法或在浏览器中使用 javascript: 协议执行 JavaScript 的方式有什么不同吗?