Opera 12.10 对页面可视性(Page Visibility) API 的支持

最近发布的 Opera 12.10 增加了对页面可视性(Page Visibility) API 的部分支持。
这是一个简单却强大的 API,因为它允许开发者规定一个文档在被隐藏时的行为。如果你有过在办公室手忙脚乱地想找出 200 个标签页中哪个在播放你预料之外的声音这种尴尬情况,你会觉得页面可视性 API 相当实用。

工作原理

页面可视性 API 对 HTML5 文档 接口增加了两个属性 — hiddenvisibilityState — 和一个 visibilitychange 事件(event)。当文档的窗口或标签页不可见,document.hidden 的值将为 true,否则为 false

document.visibilityState 属性直接表明一个文档的特定状态:hidden 或者 visible。标准规格也概述了另两个值 — prerenderunloaded,不过尚未支持。

当一个文档的可视性状态发生改变,Opera 会触发 visibilitychange 事件。这就是有趣之处。当文档不可视,visibilitychange 句柄可以暂停该文档的媒体或动画。当文档再次转为可视,句柄能恢复播放媒体或动画。这对于内存密集型应用例如游戏等特别有用。这个 demo 使用视频展示了一个例子。一个小小的警告:每次这个视频所在标签页置于前台时它都会自动播放。

限制

对此 API 的实现情况可能和你的预想有所出入。例如,从 Opera 切换到其他程序不会触发 visibilitychange 事件。最小化浏览器窗口也不会。

由于页面可视性 API 只是针对文档,你不能用它决定哪一个标签页或者窗口处于活动状态。决定你的文档是否可视因而处于活动状态,这是可行的。但是无法决定当前其他哪个标签页或窗口获得焦点。

其他浏览器

Opera 不是唯一支持这个 API 的浏览器,但是,是目前唯一一个使用无前缀属性的浏览器。其他浏览器的相应属性如下所示。

  • Chrome / WebKit: document.webkitVisibilityStatedocument.webkitHidden
  • Firefox: document.mozVisibilityStatedocument.mozHidden
  • Internet Explorer: document.msVisibilityStatedocument.msHidden

此外你还要监听 webkitvisibilitychangemozvisibilitychange,和 msvisibilitychange 事件。

[ Via Opera Developer NewsOpera.IM 编译 ]

large porn tube

Opera 实验性桌面版带来新扩展 API: 截图、加载本地文件、更新内容拦截

昨晚 Opera 发布了一个实验性桌面版本,带来新的扩展 API:

  • 用于对网页进行截图的 Screenshot API
  • 使扩展易于加载本地资源的 Resource Loader API
  • 更新 URL Filter API

在这些实验性功能最终定型前,请尽量向 Opera 反馈相关问题和建议。

这些特性不会出现在 Opera 12 正式版中,而是在更晚的版本。

下载链接

Screenshot API

你可以在扩展中的注入式或背景脚本中调用 getScreenshot() 以使用 screenshot API 对网页进行截图。截图后可以在 <canvas> 中操作它或者储存在某处留待他用。

深入阅读:

Resource Loader API

扩展安全模型使扩展连包含在同一扩展包内的本地文件也不能加载,为了克服这个问题,就有了 resource loader API。resource loader API 的 getfile() 方法可用于获取文件内容,然后使用 W3C File API 读取这些内容。这招相当有用,你可以在扩展中加入不同的内容、图像甚至脚本和样式。

深入阅读:

URL Filter API

URL Filter API 允许你在 Opera 原生内容拦截功能的被拦截 URL 列表中新增或移除 URL。通过此 API 进行的这些更改是临时性的,只有浏览器会话处于活动并启用了相关扩展时有效。

此 API 自 Opera 11.10 起已经可以使用,现在此实验性版本对它加入了新特性:

  • 支持白名单 — 作为被拦截(黑名单)URL 的例外列表。基本语法:opera.extension.urlfilter.allow.add(pattern, options)
  • 仅限特定域名: block.add(pattern, {includeDomains: ["google.com", "google.co.uk", "google.com.au"])
  • 排除特定域名: block.add(pattern, {excludeDomains: ["google.com", "google.co.uk", "google.com.au"])
  • 允许在 URL 被拦截或允许(出现在白名单中)时触发事件。目前 Opera 不打算在没有任何匹配时也能触发事件,因为有拖累性能的可能。
  • 拦截第三方 URL(例如,仅当 facebook.com 被其他网站访问时拦截它): block.add(pattern, {thirdParty: true})
  • 根据资源类型进行拦截(脚本、图像、样式表等等.): block.add(pattern, {resources: urlfilter.RESOURCE_SCRIPT | urlfilter.RESOURCE_STYLESHEET)
  • 新 filter 语法:
    • 分隔通配符:^。例如,example.com^foo 会匹配 example.com/fooexample.com?foo
    • 域名匹配语法:||。例如,||example.com 会匹配所有域名为 example.com 的 URL。
  • (以上两条)新语法也可以用于 urlfilter.ini 文件。

深入阅读:

[ Via Dev.OperaOpera.IM 编译 ]