chrome 45以上flash被拦截的一种可能解决方案

前端开发 作者: 2024-08-21 03:00:02
chrome 45以上不自动播放"非必要"flash的一种可能解决方案chrome 45以上flash被拦截的一种可能解决方案 问题 1、chrome 45以上(包含45)版本默认
1 <div style="width:1000px;height:90px;position:relative;overflow:hidden;">
2 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"3 </div>
 1 /**
 2  * 创建flash的html
 3  * @param  {Object} options 选项
 4  * @return {String}         flash的html
 5  * http://www.w3help.org/zh-cn/causes/HO8001  修改成仅用embed标签渲染flash
 6  */
 7 sinaadToolkit.swf.createHTML = function (options) {
 8     options = options || {};
 9     var item,10         k,1)">11         tmpOpt = {},1)">12         encodeHTML = sinaadToolkit.string.encodeHTML;
13 
14     // 复制options,避免修改原对象
15     for (k in options) {
16         tmpOpt[k] = options[k];
17     }
18     options = tmpOpt;
19 
20     var vars = options.vars;
21 
22      初始化flashvars参数的值
23     if ('string' === typeof vars) {
24         options.flashvars = vars;
25     } else {
26         var fvars = [];
27         28             item = vars[k];
29             fvars.push(k + "=" + encodeURIComponent(item));
30         }
31         options.flashvars = fvars.join('&');
32 33 
34      var str =35 
36      使用embed时,flash地址的属性名是src,并且要指定embed的type和pluginspage属性
37     options.name = options.id || 'sinaadtk_swf_uid_' + (sinaadToolkit.swf.uid++38     options.align = options.align || 'middle';
39     options.src  = options.url || ''40     options.type = 'application/x-shockwave-flash'41     options.pluginspage = 'http://www.macromedia.com/go/getflashplayer'42 
43     这里是hack的关键处
44     因为尺寸小于398*298,在chrome的45以上版本会自动暂停播放flash
45     所以这里只针对这两个条件进行增加逻辑处理
46     在生成的swfHTML的前面增加注释节点,用来保存当前flash的name,实际宽度和实际高度,格式如下
47     <!--fakesize:name|width|height-->
48     在后面配套使用的过程中判断是否有这个注释来决定是否需要恢复flash的尺寸
49     @link: https://news.ycombinator.com/item?id=10133771
50     if (sinaadToolkit.browser.chrome > 44 && !(options.width >= 398 && options.height >= 298)) {
51         str.push('<!--fakesize:' + options.name + '|' + parseInt(options.width,10) + '|' + parseInt(options.height,10) + '-->'52         options.width = '398px'53         options.height = '298px'54 55 
56     delete options.id;
57      options.url;
58     59 
60     str.push('<embed'61 
62      在firefox、opera、safari下,salign属性必须在scale属性之后,否则会失效
63      经过讨论,决定采用BT方法,把scale属性的值先保存下来,最后输出
64      salign;
65     66         item =67         if (item || item === false || item === 0) {
68             if ((new RegExp("^salign\x24","i")).test(k)) {
69                 salign = item;
70                 continue71             }
72 
73             str.push(' ',k,'="',encodeHTML(item),'"'74 75 76 
77     if (salign) {
78         str.push(' salign="',encodeHTML(salign),1)">79 80     str.push('/>'81 
82     return str.join(''83 };
sinaadToolkit.swf.fill(element,html) {
 2       fake,flash,cachePosition;
 3      如果匹配中<!--fakesize:name|width|height-->开头的
 4      if ((fake = html.match(/<\!--\s*fakesize\:([0-9a-zA-Z_]+)\|(\d+)\|(\d+)\s*-->/))) {
 5           防止抖动
 6           cachePosition = element.style.position;
 7           cacheOpacity = element.style.opacity;
 8           element.style.position = 'absolute' 9           element.style.opacity = 010           element.innerHTML = html;
11 
12           稍微延迟并恢复尺寸,这里的延迟没有经过考证
13           setTimeout( () {
14               flash = core.swf.getMovie(fake[1]);
15               flash.width = fake[2];
16               flash.height = fake[317 
18               恢复原来状态
19               element.style.position = cachePosition || 'relative'20               element.style.opacity = cacheOpacity || 121            },10022        } 23            否则直接填充就是了
24            element.innerHTML =25        }
26 };
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_65862.html