使用 XBL 为 Firefox 简单实现 FlashBlock
作者:屈超(Chappell.Wat) 发布时间:March 23, 2011 分类:程式::五代
【2011.03.23 更新】
看到有同学留言提到 Chrome 下的 FlashBlock 方案,
我想说的是 Chrome 的 Dev 版已经原生支持了本特性,
开启方法如下:
1. 在地址栏输入 about:flags ;
2. 找到名为 Click to play 的那一项;
3. 点击 Enable 并刷新包含 Flash 的页面就会看到效果。
当然,
Chrome 的这个开关是针对所有插件而设的,
所以如果是 Java 或 Silverlight 的内容也会被要求 Click to play ,
应该算是正中了大伙儿的下怀吧?LOL
【2011.02.21 更新】
谁曾想这个小东西还有不少人在使用呢?
更有热心的朋友写邮件向我报告了 Bug ,
于是上周末在家针对大家的意见做了一次更新,
主要的改进点如下:
1. 支持了简单的白名单功能,
目前仅进行地址的前缀匹配,
比如你要将谷歌音乐加入白名单,
(页面地址:http://g.top100.cn/xxx/html/player.html)
只需要修改 block-flash-lite.xml 的如下代码:
var whiteList = [
'http://g.top100.cn/',
];
每个地址前缀占一行,
被匹配到的页面即不阻拦 Flash 的加载。
考虑到大家对于白名单的理解可能各不相同,
所以目前没有支持正则匹配,
但要支持并不难,
所以大家对白名单有什么具体要求,
(是支持完整的正则?还是简单地仅需要 * 通配符?)
请留言或 email 给我,
在收集意见后我将在下次进行更新。 :)
2. 调整了 UI ,
由之前的纯文字修改为播放按钮(如图):

“借”用自 Mozilla 的官网页面,
假如有任何版权风险请告知我予以移除。
3. 增强了兼容性。
特别是一些朋友所反应的
类似“同一个 Flash 被 Block 两次”的问题。
这个问题的出现是页面开发者为了去兼容不同浏览器
使用了传说中被广泛推荐的 The nested-objects method .
其原理是使用双层标签,
外层 object 标签供 IE 所使用,
内层 object/embed 标签则供其它浏览器所使用。
Firefox 自然是属于后者,
我也是按后者的逻辑去做的处理,
但难免会遇到特殊情况,
如果你有遇到,
请留言或写信告诉我。
好了,
所需文件分别是:userContent.css 和 block-flash-lite.xml 。
安装方法可参考下方的旧文,
正在使用 1.0 版本的朋友请直接替换 xml 文件然后刷新页面即可,
无需重启 Fx 哦~
【2010.09.30 发布】
Mac 下浏览 Flash 确实是一件相当考验忍耐力的事儿,
让我们回想一下那个谁的双膝被 MBP 烫伤时所说的话吧……
Flash 太过“充分地”利用了 Mac 的系统资源,
但它对我来说仍是上网时的不可或缺之物,
因此只能从限制它的方向去考虑问题。
自从换上六十四位的 Firefox for Mac 和 Flash 之后,
发热的问题并没有改善,
于是我开始考虑自己想办法解决问题。
如果你不想麻烦自己每次都从 about:addons 里切换 Flash 插件的启用状态,
那么可以考虑选择 FlashBlock 这个流行的解决方案。
简单地说,
FlashBlock 的作用就是将 Flash 对象隐藏并插入一个占位层,
当你点击之后才将原始的 Flash 显示出来。
应该说它非常有效地避免了浏览器去加载我们并不关心的 Flash ,
一定程度减轻了资源消耗。
同类的扩展和脚本很多,
比如始祖级的 Flash Block ,
再比如 BlockFlash: the UserScript ,
要么无法兼容 FF4 ,
要么就实现过程太过繁琐。
另外我关心的还有一点——执行的时机。
很多脚本的实现启动于 Flash 加载之后,
那就没有起到节省资源的效果了。
我的实现方式对 DIY 的能力要求稍高一点,
但优点是真正可以在 Flash 加载前将其隐藏,(点击后才会看到加载过程)
而且不用担心浏览器升级造成该功能失效。
使用后的效果图如下:

说了甘多屁话,
下面是实现方法:
1. 找到你 Firefox 的 profile/chrome 目录,
寻找方法这里不再冗述,
请上百度去 Google 一下。
2. 下载我已经编写完成 xml 文件 ,
并置于上一步你所找到的 chrome 目录中。
该文件遵循 XBL 规范,
已含简单注释,
了解内中蹊跷的同学可以自行修改。
(建议将 click 事件换成 dblclick ,
能有效降低全屏 Flash 时的误点率)
3. 在 chrome 目录中寻找到 userContent.css 文件。
需要注意的是如果你之前未自定义过样式,
它的初始文件名将是 userContent-example.css ,
请自行更名。
同目录还有用来自定义 chrome 层面样式的 userChrome 相关文件,
请勿混淆。
编辑该文件,
在其尾部增加如下代码:
/*
* @name Flash Block Lite
* @namespace http://www.quchao.com/entry/how-to-write-a-flashblock-with-xbl/
* @description Enable a disabled Flash with a single click
* @compatibility Firefox 1.5 - 4.0b8pre
* @author Qu Chao (Chappell.Wat) <Chappell.Wat@Gmail.com>
* @version 1.0.0
*/
object[classid*=":D27CDB6E-AE6D-11cf-96B8-444553540000"],
object[codebase*="swflash.cab"],
object[data*=".swf"],
embed[type="application/x-shockwave-flash"],
embed[src*=".swf"],
object[type="application/x-shockwave-flash"],
object[src*=".swf"] {
-moz-binding: url("block-flash-lite.xml#flashBlockLite");
}
修改完成保存并确定文件名是 userContent.css ,
并与第 2 步中的 blockFlashLite.xml 一起置于 chrome 目录。
嫌麻烦的同学可以直接下载我编辑好的 userContent.css 文件。
4. 重启 Firefox,
看看生效没?
没有请按上述步骤重新检查。
此文所述之内容不是什么新鲜的东西了,
早先在老东家的内部论坛写过一篇,
未能存档,
可惜可惜。
P.S. 该方法理论上支持所有 Mozilla 的产品。
P.S.2 启用 FlashBlockLite 后发热的情况并没有解决,LOL.
[...]合并以下两大技术 使用 XBL 为 Firefox 简单实现 FlashBlock[...]
很不错,学习下了
还没用到,先留言后看看效果如何
很好~终于找到个UC的了...以前一直用GM的脚本.
PS:建议加个停止功能...
好像看到bug了。
用了很久这个block flash 的方法,原来出自这里,还更新过了,图片比之前的文字好!非常感谢您啊!!!
不得不顶, 这么简洁的风格我找了很久
这个脚本在新浪博客上失效几率很高,虽说一旦发生flash不被拦截状况,重启次浏览器就能解决问题,不过每当浏览新浪博客之时总频繁发生这样的情况,还是让人心里不免有些在意
屏蔽不能.http://www.goojje.com/special.htm
有点深奥
你好,为什么有些淘宝网页不能拦截flash,有的就能,!就上面的商家标题
http://item.taobao.com/item.htm?id=4253983065&ad_id=&am_id=&cm_id=&pm_id=
还是不懂吖
在 firefox-3.6.17里可以使用,但在 Firefox 4.0.1 的配置文件里没有 Chome 这个 目录。自己建立这个目录后把 userContent.css 和 block-flash-lite.xml 放进去无效。请问怎么解决?感谢!
@ling
我目前使用的也是 FF4.0.1,
是有 chrome 目录的;
而且该目录从一开始便是 Firefox 个人配置的一部分,
相信未来很长时间也不会改变,
建议你仔细检查一下是否找错了地方。
:)
我觉得如果在状态栏加上一个开关,就能暂时解决很多网站兼容的问题
@starry
添加开关我也想过,
但那样倒不如写一个扩展来得方便了。
博主很久没有更新了吧
@诺菲尼
平日里忙于工作,
敬请谅解。
:)
[...]原文链接: http://www.quchao.com/entry/how-to-write-a-flashblock-with-XBL/[...]
[...]原文链接: http://www.quchao.com/entry/how-to-write-a-flashblock-with-XBL/[...]
希望增加“关闭正在播放的flash”的功能。就是能打开也能关闭。
@royallin
这个已经记录,
会在下次更新时加入。
@royallin
首先我觉得禁用脚本没什么特别的意义,
我本人也只是禁用第三方的脚本而已。
由于本方法基于 XBL 特性,ript 不许我运行,
因此如果 nosc
我也没辙。
:)
好像在不允许JS的网页上失效。比装了noscript,http://www.cnbeta.com/右边有个flash的广告。不允许cnbeta的脚本后XBLflashblock失效。但是ripts.org/scripts/show/45343
BlockFlash2 for Greasemonkey - http://usersc
这个GM脚本就没有问题,同样可以拦截,可以打开也可以关闭。不过GM脚本要在网页载入后才执行,所以会有些flash会被下载下来。
如果作者可以把他们结合起来,取其精华就好了。
再次报告,貌似discuz论坛的“复制代码”功能 失效了
比如说这个帖子:http://g.mozest.com/viewthread.php?tid=34067
如果要加入白名单的话,N多论坛都是disucuz的,貌似不太可行。。。
@starry
这个和之前的谷歌音乐一样,
一开始就认定自己已经成功加载了 Flash ,
实际上早被我们 block 住了;
如果它程序处理得当是可以在 flash 加载完成后通知自己,
然后再开始进行初始化的。
这个问题单纯从我这个角度无法解决,
要么让这类程序改代码,
要么将这个 flash 加入白名单。
鉴于 DZ 复制代码的那个 swf 名称是唯一不变的,
可以考虑下次更新时加入通配符来解决这个问题。
但目前还不行。
:)
能不能兼容一下ABP,或者说ABP过滤掉的Flash不用再显示了。
这个就得看谁执行在先了,
按理说被 ABP 干掉的我这边不会再处理。