JavaScript注入和书签有什么区别吗?

Nis*_*rma 10 javascript bho bookmarklet javascript-injection google-chrome-extension

根据维基百科关于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 + " })()");
Run Code Online (Sandbox Code Playgroud)

同样在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);
Run Code Online (Sandbox Code Playgroud)

这些有何不同?我所拥有的高级问题是:

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

Rob*_*b W 11

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

所有这三种方法都在页面上下文中执行JavaScript代码.将这些方法相互比较时,可以说JavaScript代码在同一环境中执行.

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

2.对另一个人没有限制吗?

Bookmarklets是javascript:...URL,仅此而已.浏览器扩展可以直接执行跨源HTTP请求,访问持久的站点独立存储等.如果要在书签中获取类似功能,则需要使用外部Web服务.

Bookmarklets只有在用户手动激活时才能激活.这是优势还是劣势取决于您的情况.

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

Bookmarklets几乎可用于所有网络浏览器,包括手机和平板电脑上的浏览器(Chrome扩展程序只能用于桌面Chromium浏览器).

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

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

4."Javascript Injection"和"Bookmarklets"这两个术语之间是否有任何区别?虽然我相信Javascript Injection是一种效果而Bookmarklets是实现这一目标的一种方式,但BHO和Chrome扩展是另一种方式.

书签和"注入脚本"之间没有概念上的区别.这个答案的第2部分解释了一些实际的差异.

(通过"注入脚本",我假设您指的是这个方法, 我创造了一个术语来区分Chrome扩展中的脚本类型.Opera 12-和Safari都将此术语用于"内容脚本").

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

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