使用 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 ,
由之前的纯文字修改为播放按钮(如图):

Brandnew UI of FlashBlockLite

“借”用自 Mozilla 的官网页面
假如有任何版权风险请告知我予以移除。

3. 增强了兼容性。
特别是一些朋友所反应的
类似“同一个 Flash 被 Block 两次”的问题。
这个问题的出现是页面开发者为了去兼容不同浏览器
使用了传说中被广泛推荐的 The nested-objects method .
其原理是使用双层标签,
外层 object 标签供 IE 所使用,
内层 object/embed 标签则供其它浏览器所使用。
Firefox 自然是属于后者,
我也是按后者的逻辑去做的处理,
但难免会遇到特殊情况,
如果你有遇到,
请留言或写信告诉我。

好了,
所需文件分别是:userContent.cssblock-flash-lite.xml
安装方法可参考下方的旧文,
正在使用 1.0 版本的朋友请直接替换 xml 文件然后刷新页面即可,
无需重启 Fx 哦~

【2010.09.30 发布】

Mac 下浏览 Flash 确实是一件相当考验忍耐力的事儿,
让我们回想一下那个谁的双膝被 MBP 烫伤时所说的话吧……
Flash 太过“充分地”利用了 Mac 的系统资源,
但它对我来说仍是上网时的不可或缺之物,
因此只能从限制它的方向去考虑问题。

自从换上六十四位的 Firefox for MacFlash 之后,
发热的问题并没有改善,
于是我开始考虑自己想办法解决问题。

如果你不想麻烦自己每次都从 about:addons 里切换 Flash 插件的启用状态,
那么可以考虑选择 FlashBlock 这个流行的解决方案。
简单地说,
FlashBlock 的作用就是将 Flash 对象隐藏并插入一个占位层,
当你点击之后才将原始的 Flash 显示出来。
应该说它非常有效地避免了浏览器去加载我们并不关心的 Flash ,
一定程度减轻了资源消耗。

同类的扩展和脚本很多,
比如始祖级的 Flash Block
再比如 BlockFlash: the UserScript
要么无法兼容 FF4 ,
要么就实现过程太过繁琐。
另外我关心的还有一点——执行的时机。
很多脚本的实现启动于 Flash 加载之后,
那就没有起到节省资源的效果了。

我的实现方式对 DIY 的能力要求稍高一点,
但优点是真正可以在 Flash 加载前将其隐藏,(点击后才会看到加载过程)
而且不用担心浏览器升级造成该功能失效。

使用后的效果图如下:
Flash Block Lite

说了甘多屁话,
下面是实现方法:

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.

标签: Mozilla, Firefox, Chrome, UserContent

已有 100 条评论 »

  1. Firefox去除优酷黑屏高招| 不落哥

    [...]合并以下两大技术 使用 XBL 为 Firefox 简单实现 FlashBlock[...]

  2. 蘑菇街网站 蘑菇街网站

    很不错,学习下了

  3. 非主流网名 非主流网名

    还没用到,先留言后看看效果如何

  4. Andy Andy

    很好~终于找到个UC的了...以前一直用GM的脚本.

    PS:建议加个停止功能...

  5. 哪里有羽绒被 哪里有羽绒被

    好像看到bug了。

  6. Peter Pan Peter Pan

    用了很久这个block flash 的方法,原来出自这里,还更新过了,图片比之前的文字好!非常感谢您啊!!!

  7. 比利时光 比利时光

    不得不顶, 这么简洁的风格我找了很久

  8. falsita falsita

    这个脚本在新浪博客上失效几率很高,虽说一旦发生flash不被拦截状况,重启次浏览器就能解决问题,不过每当浏览新浪博客之时总频繁发生这样的情况,还是让人心里不免有些在意

  9. z z

    屏蔽不能.http://www.goojje.com/special.htm

  10. 宁波纹身 宁波纹身

    有点深奥

  11. oner oner

    你好,为什么有些淘宝网页不能拦截flash,有的就能,!就上面的商家标题
    http://item.taobao.com/item.htm?id=4253983065&ad_id=&am_id=&cm_id=&pm_id=

  12. 太阳镜品牌排名 太阳镜品牌排名

    还是不懂吖

  13. ling ling

    在 firefox-3.6.17里可以使用,但在 Firefox 4.0.1 的配置文件里没有 Chome 这个 目录。自己建立这个目录后把 userContent.css 和 block-flash-lite.xml 放进去无效。请问怎么解决?感谢!

    1. Chappell.Wat Chappell.Wat

      @ling
      我目前使用的也是 FF4.0.1,
      是有 chrome 目录的;
      而且该目录从一开始便是 Firefox 个人配置的一部分,
      相信未来很长时间也不会改变,
      建议你仔细检查一下是否找错了地方。
      :)

  14. starry starry

    我觉得如果在状态栏加上一个开关,就能暂时解决很多网站兼容的问题

    1. Chappell.Wat Chappell.Wat

      @starry
      添加开关我也想过,
      但那样倒不如写一个扩展来得方便了。

  15. 诺菲尼 诺菲尼

    博主很久没有更新了吧

    1. Chappell.Wat Chappell.Wat

      @诺菲尼
      平日里忙于工作,
      敬请谅解。
      :)

  16. 使用 XBL 为 Firefox 简单实现 FlashBlock | w3er

    [...]原文链接: http://www.quchao.com/entry/how-to-write-a-flashblock-with-XBL/[...]

  17. 使用 XBL 为 Firefox 简单实现 FlashBlock | w3er

    [...]原文链接: http://www.quchao.com/entry/how-to-write-a-flashblock-with-XBL/[...]

  18. royallin royallin

    希望增加“关闭正在播放的flash”的功能。就是能打开也能关闭。

    1. Chappell.Wat Chappell.Wat

      @royallin
      这个已经记录,
      会在下次更新时加入。

      1. Chappell.Wat Chappell.Wat

        @royallin
        首先我觉得禁用脚本没什么特别的意义,
        我本人也只是禁用第三方的脚本而已。

        由于本方法基于 XBL 特性,
        因此如果 noscript 不许我运行,
        我也没辙。

        :)

      2. royallin royallin

        好像在不允许JS的网页上失效。比装了noscript,http://www.cnbeta.com/右边有个flash的广告。不允许cnbeta的脚本后XBLflashblock失效。但是
        BlockFlash2 for Greasemonkey - http://userscripts.org/scripts/show/45343
        这个GM脚本就没有问题,同样可以拦截,可以打开也可以关闭。不过GM脚本要在网页载入后才执行,所以会有些flash会被下载下来。
        如果作者可以把他们结合起来,取其精华就好了。

  19. starry starry

    再次报告,貌似discuz论坛的“复制代码”功能 失效了
    比如说这个帖子:http://g.mozest.com/viewthread.php?tid=34067
    如果要加入白名单的话,N多论坛都是disucuz的,貌似不太可行。。。

    1. Chappell.Wat Chappell.Wat

      @starry
      这个和之前的谷歌音乐一样,
      一开始就认定自己已经成功加载了 Flash ,
      实际上早被我们 block 住了;
      如果它程序处理得当是可以在 flash 加载完成后通知自己,
      然后再开始进行初始化的。

      这个问题单纯从我这个角度无法解决,
      要么让这类程序改代码,
      要么将这个 flash 加入白名单。

      鉴于 DZ 复制代码的那个 swf 名称是唯一不变的,
      可以考虑下次更新时加入通配符来解决这个问题。
      但目前还不行。

      :)

  20. Hailo Hailo

    能不能兼容一下ABP,或者说ABP过滤掉的Flash不用再显示了。

    1. Chappell.Wat Chappell.Wat

      这个就得看谁执行在先了,
      按理说被 ABP 干掉的我这边不会再处理。

添加新评论 »