如何检测 Chrome 的 "click-to-play" Flash 阻止功能当前处于活动状态
How to detect when Chrome's "click-to-play" Flash blocking feature is currently active
Chrome 的点击播放功能的跟踪状态
您如何检测 Flash 插件已被暂时禁用,或者相反,检测它已因 Chrome 的 "click-to-play" 功能而启用?
背景
Chrome 的新 "click-to-play" 功能可检测不明显的插件并暂停它们。 Chrome 在插件上显示一个 "play" 按钮,用户可以单击 "play" 按钮来激活插件。 (参考:https://productforums.google.com/forum/#!topic/chrome/xPcpRBzyPcc)
这是它的实际截图(注意白色播放按钮):
您可以在此屏幕截图中看到它已暂停视频播放器(右栏)。该视频播放器具有基于 HTML5 的控件,可覆盖基于 Flash 的视频播放器。因此,用户无法单击播放按钮,因为整个 SWF 被基于 HTML5 的 play/pause 控件有意覆盖。
我需要的是检测 SWF 何时被 "click-to-play" 功能暂停,以便我可以禁用控件并使 SWF 交互。
我试过的
- 在 JavaScript 中 - 尽管 SWF 已暂停,但通过
ExternalInterface
公开的所有方法仍然可用。它实际上像在播放一样响应并且没有 return 错误。
- In JavaScript - 将嵌入的
<object>
的大小更新为 > 700x400px。 "Click-to-play" 不会暂停这种大小的 SWF。因此,我尝试使用 -webkit-transfor: scale(0.5)
来使用 CSS 将其缩小到所需的大小。 Chrome 计算最终呈现的大小并暂停 SWF。
- 在 Flash 中 -
stage.frameRate
returns 正确的值(例如,它没有设置为 0 来暂停 SWF)
在写下这个问题时,我找到了答案,决定在这里 post 以防其他人需要帮助解决这个问题。
要规避 Chrome 点击播放限制,请从与您的网站相同的域和协议加载您的 SWF。
您可以使用 AS3 ThrottleEvent
检测 SWF 何时被限制。
// AS3 code
import flash.events.ThrottleEvent;
import flash.external.ExternalInterface;
stage.addEventListener(ThrottleEvent.THROTTLE, onThrottleEvent);
private function onThrottleEvent(e:ThrottleEvent) {
ExternalInterface.call("onThrottleEvent", e.state); // call javascript function
}
您可以设置一个 ExternalInterface
调用以在 JavaScript 中跟踪此状态,在 JavaScript 中根据它是否被限制来管理您的 SWF z-index
.
// JS Code
var IS_THROTTLED = false;
window.onThrottleEvent = function (throttleState) {
IS_THROTTLED = (throttleState === "throttle");
}
在页面底部添加一个大于 398x298 的空 Flash 文件。我发现一旦你有至少一个 Flash 文件超过他们的最小 Chrome 将不会暂停你的任何 Flash。您不能使用 CSS 隐藏这个额外的 Flash 文件。可以选择使用 javascript 超时(3 秒)来隐藏空的 Flash 文件,以防它扰乱您的页面布局。我正在使用 swfObject 进行嵌入。
为了其他正在寻找有关 Flash 阻止规则的人的利益,请参阅下面的内容:
- Flash 内容和页面是从同一个域加载的。
Flash 对象的未知宽度和高度,即当 Chrome 获取
宽度和高度为 0 或小于 0。
- Flash 内容是
用户在 Chrome 设置中列入白名单。
- 的宽度和高度
每个 Flash 对象都小于或等于 5,考虑到
内容要小而重要。
- 的宽度和高度
Flash 对象等于或大于 398x298。
- 纵横比
的内容是 16:9,(允许偏差为 0.01)并且
宽*高区域至少120K.
至少需要满足上述条件之一,才能将内容标记为基本内容而不是自动暂停。虽然,我发现很少有偏差,而且 Chrome 还没有对规则做出任何 public 公告。
Chrome 的点击播放功能的跟踪状态
您如何检测 Flash 插件已被暂时禁用,或者相反,检测它已因 Chrome 的 "click-to-play" 功能而启用?
背景
Chrome 的新 "click-to-play" 功能可检测不明显的插件并暂停它们。 Chrome 在插件上显示一个 "play" 按钮,用户可以单击 "play" 按钮来激活插件。 (参考:https://productforums.google.com/forum/#!topic/chrome/xPcpRBzyPcc)
这是它的实际截图(注意白色播放按钮):
您可以在此屏幕截图中看到它已暂停视频播放器(右栏)。该视频播放器具有基于 HTML5 的控件,可覆盖基于 Flash 的视频播放器。因此,用户无法单击播放按钮,因为整个 SWF 被基于 HTML5 的 play/pause 控件有意覆盖。
我需要的是检测 SWF 何时被 "click-to-play" 功能暂停,以便我可以禁用控件并使 SWF 交互。
我试过的
- 在 JavaScript 中 - 尽管 SWF 已暂停,但通过
ExternalInterface
公开的所有方法仍然可用。它实际上像在播放一样响应并且没有 return 错误。 - In JavaScript - 将嵌入的
<object>
的大小更新为 > 700x400px。 "Click-to-play" 不会暂停这种大小的 SWF。因此,我尝试使用-webkit-transfor: scale(0.5)
来使用 CSS 将其缩小到所需的大小。 Chrome 计算最终呈现的大小并暂停 SWF。 - 在 Flash 中 -
stage.frameRate
returns 正确的值(例如,它没有设置为 0 来暂停 SWF)
在写下这个问题时,我找到了答案,决定在这里 post 以防其他人需要帮助解决这个问题。
要规避 Chrome 点击播放限制,请从与您的网站相同的域和协议加载您的 SWF。
您可以使用 AS3 ThrottleEvent
检测 SWF 何时被限制。
// AS3 code
import flash.events.ThrottleEvent;
import flash.external.ExternalInterface;
stage.addEventListener(ThrottleEvent.THROTTLE, onThrottleEvent);
private function onThrottleEvent(e:ThrottleEvent) {
ExternalInterface.call("onThrottleEvent", e.state); // call javascript function
}
您可以设置一个 ExternalInterface
调用以在 JavaScript 中跟踪此状态,在 JavaScript 中根据它是否被限制来管理您的 SWF z-index
.
// JS Code
var IS_THROTTLED = false;
window.onThrottleEvent = function (throttleState) {
IS_THROTTLED = (throttleState === "throttle");
}
在页面底部添加一个大于 398x298 的空 Flash 文件。我发现一旦你有至少一个 Flash 文件超过他们的最小 Chrome 将不会暂停你的任何 Flash。您不能使用 CSS 隐藏这个额外的 Flash 文件。可以选择使用 javascript 超时(3 秒)来隐藏空的 Flash 文件,以防它扰乱您的页面布局。我正在使用 swfObject 进行嵌入。
为了其他正在寻找有关 Flash 阻止规则的人的利益,请参阅下面的内容:
- Flash 内容和页面是从同一个域加载的。
Flash 对象的未知宽度和高度,即当 Chrome 获取 宽度和高度为 0 或小于 0。 - Flash 内容是 用户在 Chrome 设置中列入白名单。
- 的宽度和高度 每个 Flash 对象都小于或等于 5,考虑到 内容要小而重要。
- 的宽度和高度 Flash 对象等于或大于 398x298。
- 纵横比 的内容是 16:9,(允许偏差为 0.01)并且 宽*高区域至少120K.
至少需要满足上述条件之一,才能将内容标记为基本内容而不是自动暂停。虽然,我发现很少有偏差,而且 Chrome 还没有对规则做出任何 public 公告。