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 };