chrome 45以上不自动播放"非必要"flash的一种可能解决方案
chrome 45以上flash被拦截的一种可能解决方案

问题

1、chrome 45以上(包含45)版本默认不自动播放"非必要"flash,对于非自动播放的广告,chrome会在flash上悬浮一个播放按钮,点击后可播放
2、对于国内情况来说,flash目前还是很多中小客户的主力素材,展现效果好,且技术成熟。
3、目前flash广告大多数使用覆盖a链接来进行落地页和tracker的承载,无法点中chrome贴心提供的播放按钮,结构大概如下:

 <div style="width:1000px;height:90px;position:relative;overflow:hidden;">
<embed width="1000px" height="90px" wmode="opaque" align="middle" src="http://d1.sina.com.cn/201511/09/1394644_1000x90_30k.swf" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
</div>

思路

对于chrome, 什么是"非必要"

非必要在chrome定义上大概包含以下两点:

不在同域
尺寸不够大(小于398*298,这个我做过测试,确实如此,也不知道这两个数字怎么拍脑门想出来的,不贴demo了)
参考文件:https://news.ycombinator.com/item?id=10133771 文章内有两个chrome源码的连接,也可以到下面去查看

https://code.google.com/p/chromium/codesearch#chromium/src/content/renderer/pepper/plugin_power_saver_helper.cc&sq=package:chromium&type=cs&l=87
https://code.google.com/p/chromium/codesearch#chromium/src/content/renderer/pepper/plugin_instance_throttler_impl.cc&q=plugin_instance_throttler_impl&sq=package:chromium&type=cs&l=5
尝试一种解决思路

在广告中,由于各种情况限制,要求广告主的素材同域肯定是不方便的,所以只能从尺寸上解决 通过尝试,可以在flash渲染的时候暂时把尺寸设置成大于398*298,在实际展现的时候在设置回来,这里需要createFlash的方法动下小手脚

** 这里的尺寸有几个注意点: 1、不只是flash自己的尺寸而是真正展现的尺寸,有可能flash设置了足够大,但是它外面包含的容器overflow了,导致flash实际尺寸没有这么大,这样也是无法自动播放的 2、经过尝试,opacity:0 的flash只要尺寸足够大,也是可以自动播放的

直接看代码

改造过的swf.createHTML

 /**
* 创建flash的html
* @param {Object} options 选项
* @return {String} flash的html
* http://www.w3help.org/zh-cn/causes/HO8001 修改成仅用embed标签渲染flash
*/
sinaadToolkit.swf.createHTML = function (options) {
options = options || {};
var item,
k,
tmpOpt = {},
encodeHTML = sinaadToolkit.string.encodeHTML; // 复制options,避免修改原对象
for (k in options) {
tmpOpt[k] = options[k];
}
options = tmpOpt; var vars = options.vars; // 初始化flashvars参数的值
if ('string' === typeof vars) {
options.flashvars = vars;
} else {
var fvars = [];
for (k in vars) {
item = vars[k];
fvars.push(k + "=" + encodeURIComponent(item));
}
options.flashvars = fvars.join('&');
} var str = []; // 使用embed时,flash地址的属性名是src,并且要指定embed的type和pluginspage属性
options.name = options.id || 'sinaadtk_swf_uid_' + (sinaadToolkit.swf.uid++);
options.align = options.align || 'middle';
options.src = options.url || '';
options.type = 'application/x-shockwave-flash';
options.pluginspage = 'http://www.macromedia.com/go/getflashplayer'; //这里是hack的关键处
//因为尺寸小于398*298,在chrome的45以上版本会自动暂停播放flash
//所以这里只针对这两个条件进行增加逻辑处理
//在生成的swfHTML的前面增加注释节点,用来保存当前flash的name,实际宽度和实际高度,格式如下
//<!--fakesize:name|width|height-->
//在后面配套使用的过程中判断是否有这个注释来决定是否需要恢复flash的尺寸
//@link: https://news.ycombinator.com/item?id=10133771
if (sinaadToolkit.browser.chrome > 44 && !(options.width >= 398 && options.height >= 298)) {
str.push('<!--fakesize:' + options.name + '|' + parseInt(options.width, 10) + '|' + parseInt(options.height, 10) + '-->');
options.width = '398px';
options.height = '298px';
} delete options.id;
delete options.url;
delete options.vars; str.push('<embed'); // 在firefox、opera、safari下,salign属性必须在scale属性之后,否则会失效
// 经过讨论,决定采用BT方法,把scale属性的值先保存下来,最后输出
var salign;
for (k in options) {
item = options[k];
if (item || item === false || item === 0) {
if ((new RegExp("^salign\x24", "i")).test(k)) {
salign = item;
continue;
} str.push(' ', k, '="', encodeHTML(item), '"');
}
} if (salign) {
str.push(' salign="', encodeHTML(salign), '"');
}
str.push('/>'); return str.join('');
};

解析并将生成的flashhtml填充进节点,根据条件决定是否恢复尺寸

 sinaadToolkit.swf.fill(element, html) {
var fake, flash, cachePosition;
//如果匹配中<!--fakesize:name|width|height-->开头的
if ((fake = html.match(/<\!--\s*fakesize\:([0-9a-zA-Z_]+)\|(\d+)\|(\d+)\s*-->/))) {
//防止抖动
cachePosition = element.style.position;
cacheOpacity = element.style.opacity;
element.style.position = 'absolute';
element.style.opacity = 0;
element.innerHTML = html; //稍微延迟并恢复尺寸,这里的延迟没有经过考证
setTimeout(function () {
flash = core.swf.getMovie(fake[1]);
flash.width = fake[2];
flash.height = fake[3]; //恢复原来状态
element.style.position = cachePosition || 'relative';
element.style.opacity = cacheOpacity || 1;
}, 100);
} else {
//否则直接填充就是了
element.innerHTML = html;
}
};

对于重排的性能肯定会有影响,等后续做测试和优化,先当一种想法

PS

当然你也可以在浏览器上面加个提示条:请您开启chrome的flash自动播放, 具体方法请百度。。

chrome 45以上flash被拦截的一种可能解决方案的更多相关文章

  1. Chrome 出现adobe flash is out of date的解决方法

    最近使用安装了ubuntu和linux mint,都发现firefox的flash虽然能用,但还是觉得有点小问题,想使用google chrome,但无奈,一安装使用后就发现flash不能用,显示ad ...

  2. Chrome中使用flash引起cpu飙升问题的处理

    本人使用的是Chrome 30 flash 18,在看视频或者登陆有调用flash插件的页面之后,经常会遇到Shockwave Flash插件CPU占用超过50%的情况(在Chrome的任务管理器可以 ...

  3. HttpUploader2 -chrome 45+安装教程

    HttpUploader2-Chrome 45+安装说明 步骤如下: a.先安装HttpUploader2.exe,HttpUploader2.exe为插件集成安装包. b.再安装HttpUpload ...

  4. Chrome启动后打开第一个网页很慢的解决方案

    Chrome启动后打开第一个网页很慢的解决方案 Chrome/Chromium以速度快著称,最近每当打开chrome的时候,打开第一个页面都非常慢,往往需要数十秒的时间,经分 析,应该是卡在了域名解析 ...

  5. spring MVC 拦截有几种实现方式

    spring MVC 拦截有几种实现方式 实现HandelInterceptor接口方式        继承HandelInterceptor 的方式.一般有这两种方式 spring 如何走单元测式 ...

  6. .NET MVC中登录过滤器拦截的两种方法

    今天给大家介绍两种ASP中过滤器拦截的两种方法. 一种是EF 的HtppModule,另一种则是灵活很多针对MVC的特性类 Attribute 具体什么是特性类可以参考着篇文章:https://www ...

  7. 解决“chrome提示adobe flash player 已经过期”的小问题

    这个小问题也确实困扰我许久,后来看到chrome吧里面有人给出了解决方案: 安装install_flash_player_ppapi, 该软件下载地址:http://labs.adobe.com/do ...

  8. chrome新版安装flash控件失败解决方法

    今天chrome打开后出现插件过期,之后更新一直安装失败 度娘找到一个方法: 1.下载flash最新版for chrome : https://fpdownload.macromedia.com/pu ...

  9. Ubuntu16.04/centos7 下为chrome/firefox安装flash player插件

    为chrome安装flash: 打开终端,输入:sudo apt-get install pepperflashplugin-nonfree 或官网下载安装google-chrome-stable 为 ...

随机推荐

  1. 在菜鸟教程学 HTML(一)

    注意:对于中文网页需要使用 <meta charset="utf-8"> 声明编码,否则会出现乱码.有些浏览器会设置 GBK 为默认编码,则你需要设置为 <met ...

  2. <meta http-equiv="X-UA-Compatible" content="IE=7" />

    <meta http-equiv="X-UA-Compatible" content="IE=7" />意思是将IE8用IE7进行渲染,使网页在IE ...

  3. 一个SQL调优/优化(SQL TUNING)“小把戏”“哄得”小朋友挺满意

    前几天,去一个用户那里,解决完问题,和一个小朋友闲聊,他有点愁眉不展.郁郁寡欢的样子,似乎没心情和我说话,之前,他的话是最多的,见此状,我就问:怎么了?小朋友?,他说,这几天应用人员说他的某个模块的性 ...

  4. Mac安装fish shell

    1.brew update 2.brew install fish 3.sudo vi /etc/shells 增加内容:/usr/local/bin/fish   ##增加fish到shell环境变 ...

  5. SQL基础用法(实例二)

    /* 2006年10月01日 SQL Server 数据库的高级操作 (1) 批处理 (2) 变量 (3) 逻辑控制 (4) 视图 (5) 函数 (6) 高级查询 */ ()批处理 将多条SQL语句作 ...

  6. Python 数据类型--Bytes类型

    一.Bytes类型 在Python3以后,字符串和bytes类型彻底分开了.字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用甚至内置方法上和字 ...

  7. selenium(三)浏览器操作

    from time import sleep from selenium import webdriver #定义浏览器是firefox driver=webdriver.Firefox() #页面打 ...

  8. 宿主环境(host environment)

    在此前的内容中,我讨论的都是JavaScript语言及其规范,而并非该语言的应用环境.在大多数人看来,JavaScript应用环境都是Web浏览器,这也的确是该语言最早的设计目标.然而从很早开始,Ja ...

  9. L1-001 Hello World

    这道超级简单的题目没有任何输入. 你只需要在一行中输出著名短句“Hello World!”就可以了. 输入样例: 无 输出样例: Hello World! #include<stdio.h> ...

  10. 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(五)

    MyEclipse限时秒杀!活动火热开启中>> [MyEclipse最新版下载] 六.部署到JBoss服务器 1. 右键单击Servers视图,然后选择New>Server,选择您安 ...