11

根据关于 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);

这些有什么不同?我的高级问题是:

  1. 这三种方法是否在不同的环境中执行 JavaScript 代码?
  2. 其中一个有什么限制而另一个没有吗?
  3. 执行结果呈现给用户或反映在浏览器中的方式有​​什么不同吗?
  4. 术语“JavaScript 注入”和“Bookmarklets”之间有什么区别吗?虽然我相信 JavaScript 注入是一种效果,而 Bookmarklets 是实现它的一种方式,但 BHO 和 Chrome 扩展是另一种方式。
  5. 如果 4 中的假设是正确的,那么使用 BHO 的execScript方法或在浏览器中使用 javascript: 协议执行 JavaScript 的方式有什么不同吗?
4

1 回答 1

12

1.这三种方式执行javascript代码的环境是否不同?

所有这三个方法都在页面上下文中执行 JavaScript 代码。当这些方法相互比较时,您可以说 JavaScript 代码是在相同的环境中执行的。

内容脚本(Chrome/Opera/Firefox/Safari)在与网页隔离的环境中运行,因此从这个角度来看,环境确实不同。
BHO 有点不同,因为与其他扩展平台不同,扩展的语言不是 JavaScript,而是 C++、C#、... JavaScript 代码不能直接访问 BHO 的本机代码(除非你自己实现这样的东西),所以环境当然是“不同的”。

2. 其中一个有没有另一个没有的限制?

书签是javascript:...URL,仅此而已。浏览器扩展可以直接执行跨域 HTTP 请求,访问持久的站点无关存储等。如果你想在一个小书签中获得类似的功能,你需要使用外部 Web 服务。

只有当用户手动激活书签时,它们才能处于活动状态。这是优点还是缺点取决于您的情况。

小书签的最大尺寸受最大 URL 长度的限制,该长度相当小。可以通过在文档中插入<script src>标签来规避此限制。必须先加载脚本,因此代码的执行会延迟。

几乎所有网络浏览器都可以使用书签小工具,包括手机和平板电脑上的浏览器(Chrome 扩展程序只能在桌面 Chromium 浏览器中使用)。

3. 执行结果呈现给用户或反映在浏览器中的方式有​​什么不同吗?

不,在所有情况下,您都是在当前页面的上下文中运行代码。从理论上讲,一个页面可以替换所有内置方法(例如Function.prototype.call, String.prototype.replace, ..),并干扰或滥用脚本的功能。
可能值得注意的是:Crossrider 和 Kango 扩展框架以类似于这三种方法的方式为 Internet Explorer 实现“内容脚本”功能。这意味着页面可以通过检测使用这些框架编写的 IE 插件、拦截 API 声明并滥用其功能的方式来制作。

4. “Javascript Injection”和“Bookmarklets”这两个术语有什么区别吗?虽然我相信 Javascript 注入是一种效果,而 Bookmarklets 是实现这一目标的一种方式,但 BHO 和 Chrome 扩展是另一种方式。

小书签和“注入脚本”在概念上没有区别。本答案的第 2 节解释了一些实际差异。

(通过“注入脚本”,我假设您指的是这种方法 ,我创造了这个术语来区分 Chrome 扩展中的脚本类型。Opera 12- 和 Safari 都使用这个术语来表示“内容脚本”)。

5. 如果 4 中的假设是正确的,那么在浏览器中使用 BHO 的 execScript 方法或使用 javascript: 协议执行 javascript 的方式有什么不同吗?

除了前面提到的差异,没有。

于 2013-11-13T13:52:48.660 回答