/* Copyright 2011, KISSY UI Library v1.1.5 MIT Licensed build time: Sep 11 10:29 */ /** * AJBridge Class * @author kingfo oicuicu@gmail.com */ KISSY.add('gallery/form/1.3/uploader/plugins/ajbridge/ajbridge', function(S,Flash) { var ID_PRE = '#', VERSION = '1.0.15', PREFIX = 'ks-ajb-', LAYOUT = 100, EVENT_HANDLER = 'KISSY.AJBridge.eventHandler'; // Flash 事件抛出接受通道 /** * @constructor * @param {String} id 注册应用容器 id * @param {Object} config 基本配置同 S.Flash 的 config * @param {Boolean} manual 手动进行 init */ function AJBridge(id, config,manual) { id = id.replace(ID_PRE, ''); // 健壮性考虑。出于 KISSY 习惯采用 id 选择器 config = Flash._normalize(config||{}); // 标准化参数关键字 var self = this, target = ID_PRE + id, // 之所以要求使用 id,是因为当使用 ajbridge 时,程序员自己应该能确切知道自己在做什么 callback = function(data) { if (data.status < 1) { self.fire('failed', { data: data }); return; } S.mix(self, data); // 执行激活 静态模式的 flash // 如果这 AJBridge 先于 DOMReady 前执行 则失效 // 建议配合 S.ready(); if (!data.dynamic || !config.src) { self.activate(); } }; // 自动产生 id config.id = config.id || S.guid(PREFIX); // 注册应用实例 AJBridge.instances[config.id] = self; // 动态方式 if (config.src) { // 强制打开 JS 访问授权,AJBridge 的最基本要求 config.params.allowscriptaccess = 'always'; config.params.flashvars = S.merge(config.params.flashvars, { // 配置 JS 入口 jsEntry: EVENT_HANDLER, // 虽然 Flash 通过 ExternalInterface 获得 obejctId // 但是依然存在兼容性问题, 因此需要直接告诉 swfID: config.id }); } // 支持静态方式,但是要求以上三个步骤已静态写入 // 可以参考 test.html // 由于完全基于事件机制,因此需要通过监听之后进行初始化 Flash if(manual)self.__args = [target, config, callback]; else S.later(Flash.add,LAYOUT,false,Flash,[target, config, callback]); } /** * 静态方法 */ S.mix(AJBridge, { version: VERSION, instances: { }, /** * 处理来自 AJBridge 已定义的事件 * @param {String} id swf传出的自身ID * @param {Object} event swf传出的事件 */ eventHandler: function(id, event) { var instance = AJBridge.instances[id]; if (instance) { instance.__eventHandler(id, event); } }, /** * 批量注册 SWF 公开的方法 * @param {Class} C * @param {String|Array} methods */ augment: function (C, methods) { if (S.isString(methods)) { methods = [methods]; } if (!S.isArray(methods)) return; S.each(methods, function(methodName) { C.prototype[methodName] = function() { try { return this.callSWF(methodName, S.makeArray(arguments)); } catch(e) { // 当 swf 异常时,进一步捕获信息 this.fire('error', { message: e }); } } }); } }); S.augment(AJBridge, S.EventTarget, { init: function() { if(!this.__args)return; Flash.add.apply(Flash, this.__args); this.__args = null; delete this.__args; // 防止重复添加 }, __eventHandler: function(id, event) { var self = this, type = event.type; event.id = id; // 弥补后期 id 使用 switch(type){ case "log": S.log(event.message); break; default: self.fire(type, event); } }, /** * Calls a specific function exposed by the SWF's ExternalInterface. * @param func {String} the name of the function to call * @param args {Array} the set of arguments to pass to the function. */ callSWF: function (func, args) { var self = this; args = args || []; try { if (self.swf[func]) { return self.swf[func].apply(self.swf, args); } } // some version flash function is odd in ie: property or method not supported by object catch(e) { var params = ''; if (args.length !== 0) { params = "'" + args.join("','") + "'"; } //avoid eval for compressiong return (new Function('self', 'return self.swf.' + func + '(' + params + ');'))(self); } } }); // 为静态方法动态注册 // 注意,只有在 S.ready() 后进行 AJBridge 注册才有效。 AJBridge.augment(AJBridge, ['activate', 'getReady','getCoreVersion']); window.AJBridge = S.AJBridge = AJBridge; return AJBridge; }, { requires:["flash"] }); /** * NOTES: * 20120117 移植成kissy1.2.0的模块(明河修改) */