/** * @ignore * Flash UA 探测 * @author oicuicu@gmail.com */ KISSY.add('swf/ua', function (S, undefined) { var fpvCached, firstRun = true, win = S.Env.host; /* 获取 Flash 版本号 返回数据 [M, S, R] 若未安装,则返回 undefined */ function getFlashVersion() { var ver, SF = 'ShockwaveFlash'; // for NPAPI see: http://en.wikipedia.org/wiki/NPAPI if (navigator.plugins && navigator.mimeTypes.length) { ver = (navigator.plugins['Shockwave Flash'] || 0).description; } // for ActiveX see: http://en.wikipedia.org/wiki/ActiveX else if (win['ActiveXObject']) { try { ver = new ActiveXObject(SF + '.' + SF)['GetVariable']('$version'); } catch (ex) { S.log('getFlashVersion failed via ActiveXObject'); // nothing to do, just return undefined } } // 插件没安装或有问题时,ver 为 undefined if (!ver) { return undefined; } // 插件安装正常时,ver 为 "Shockwave Flash 10.1 r53" or "WIN 10,1,53,64" return getArrayVersion(ver); } /* getArrayVersion("10.1.r53") => ["10", "1", "53"] */ function getArrayVersion(ver) { return ver.match(/\d+/g).splice(0, 3); } /* 格式:主版本号Major.次版本号Minor(小数点后3位,占3位)修正版本号Revision(小数点后第4至第8位,占5位) ver 参数不符合预期时,返回 0 getNumberVersion("10.1 r53") => 10.00100053 getNumberVersion(["10", "1", "53"]) => 10.00100053 getNumberVersion(12.2) => 12.2 */ function getNumberVersion(ver) { var arr = typeof ver == 'string' ? getArrayVersion(ver) : ver, ret = ver; if (S.isArray(arr)) { ret = parseFloat(arr[0] + '.' + pad(arr[1], 3) + pad(arr[2], 5)); } return ret || 0; } /* pad(12, 5) => "00012" */ function pad(num, n) { num = num || 0; num += ''; var padding = n + 1 - num.length; return new Array(padding > 0 ? padding : 0).join('0') + num; } /** * Get flash version * @param {Boolean} [force] whether to avoid getting from cache * @returns {String[]} eg: ["11","0","53"] * @member KISSY.SWF * @static */ function fpv(force) { // 考虑 new ActiveX 和 try catch 的 性能损耗,延迟初始化到第一次调用时 if (force || firstRun) { firstRun = false; fpvCached = getFlashVersion(); } return fpvCached; } /** * Checks whether current version is greater than or equal the specific version. * @param {String} ver eg. "10.1.53" * @param {Boolean} force whether to avoid get current version from cache * @returns {Boolean} * @member KISSY.SWF * @static */ function fpvGTE(ver, force) { return getNumberVersion(fpv(force)) >= getNumberVersion(ver); } return { fpv: fpv, fpvGTE: fpvGTE }; }); /** * @ignore * * NOTES: * - ActiveXObject JS 小记 - newObj = new ActiveXObject(ProgID:String[, location:String]) - newObj 必需 用于部署 ActiveXObject 的变量 - ProgID 必选 形式为 "serverName.typeName" 的字符串 - serverName 必需 提供该对象的应用程序的名称 - typeName 必需 创建对象的类型或者类 - location 可选 创建该对象的网络服务器的名称 - Google Chrome 比较特别: - 即使对方未安装 flashplay 插件 也含最新的 Flashplayer - ref: http://googlechromereleases.blogspot.com/2010/03/dev-channel-update_30.html * */