/** * @fileoverview 本地图片预览组件 * @author 紫英(橘子) * @date 2012-01-10 * @requires KISSY 1.2+ */ KISSY.add('gallery/form/1.3/uploader/plugins/preview/preview', function(S, D, E){ var doc = document, LOG_PRE = '[Plugin: Preview] ', _mode = getPreviewMode(), _eventList = { check: 'check', success: 'success', showed: 'showed', error: 'error' }, _transparentImg = S.UA.ie < 8 ? "http://a.tbcdn.cn/p/fp/2011a/assets/space.gif" : "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="; /** * Private 检测当前浏览器适应于哪种预览方式 * @return {String} 检测出的预览方式 */ function getPreviewMode(){ var previewMode = ''; // prefer to use html5 file api if(typeof window.FileReader === "undefined"){ switch(S.UA.shell){ case 'firefox': previewMode = 'domfile'; break; case 'ie': switch(S.UA.ie){ case 6: previewMode = 'simple'; break; default: previewMode = 'filter'; break; } break; } }else{ previewMode = 'html5'; } return previewMode; } /** * Private 将图片的本地路径写入img元素,展现给用户 * @param {HTMLElement} imgElem img元素 * @param {String} data 图片的本地路径 * @param {Number} maxWidth 最大宽度 * @param {Number} maxHeight 最大高度 */ function showPreviewImage(imgElem, data, width, height){ if(!imgElem){ return false; } if(_mode != 'filter'){ imgElem.src = data || _transparentImg; }else{ imgElem.src = _transparentImg; if(data){ data = data.replace(/[)'"%]/g, function(s){ return escape(escape(s)); }); imgElem.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + data + "')"; imgElem.zoom = 1; } } return true; } /** * Constructor * @param {Object} config 配置 */ function Preview(config){ var self = this, _config = { maxWidth: 40, maxHeight: 40 }; self.config = S.mix(_config, config); // self.mode = getPreviewMode(); S.log(LOG_PRE + 'Preview initialized. The preview mode is ' + _mode); } S.augment(Preview, S.EventTarget, { /** * 显示预览图片,不支持IE * @author 明河 * @since 1.3 */ show:function(file,$img){ if(_mode != 'html5' || !$img || !$img.length) return false; var self = this; var reader = new FileReader(); reader.onload = function(e){ var data = self.data = e.target.result; self.fire(_eventList.getData, { data: data, mode: _mode }); $img.attr('src',data); self.fire(_eventList.showed, { img: data }); }; reader.onerror = function(e){ S.log(LOG_PRE + 'File Reader Error. Your browser may not fully support html5 file api', 'warning'); self.fire(_eventList.error); }; reader.readAsDataURL(file); }, /** * 预览函数 * @param {HTMLElement} fileInput 文件上传的input * @param {HTMLElement} imgElem 需要显示预览图片的img元素,如果不设置的话,程序则不会执行显示操作,用户可以从该函数的返回值取得预览图片的地址自行写入 * @return {String} 取得的图片地址 */ preview: function(fileInput, imgElem){ fileInput = D.get(fileInput); imgElem = D.get(imgElem); var self = this, onsuccess = function(){ self.fire(_eventList.getData, { data: self.data, mode: _mode }); if(imgElem){ showPreviewImage(imgElem, self.data); self.fire(_eventList.showed, { img: imgElem }); } }; self.data = undefined; if(fileInput){ S.log(LOG_PRE + 'One file selected. Getting data...'); // get Image location path or data uri switch(_mode){ case 'domfile': self.data = fileInput.files[0].getAsDataURL(); break; case 'filter': // fileInput.focus(); fileInput.select(); try{ self.data = doc.selection.createRange().text; }catch(e){ S.log(LOG_PRE + 'Get image data error, the error is: '); S.log(e, 'dir'); }finally{ doc.selection.empty(); } if(!self.data){ self.data = fileInput.value; } break; case 'html5': // TODO Mathon3 var reader = new FileReader(); reader.onload = function(e){ self.data = e.target.result; onsuccess(); }; reader.onerror = function(e){ S.log(LOG_PRE + 'File Reader Error. Your browser may not fully support html5 file api', 'warning'); self.fire(_eventList.error); }; if(fileInput.files){ reader.readAsDataURL(fileInput.files[0]); } // alert(reader.readAsDataURL); // S.log(reader, 'dir'); break; case 'simple': default: self.data = fileInput.value; break; } if(self.data){ onsuccess(); }else if(_mode != 'html5'){ S.log(LOG_PRE + 'Retrive Data error.'); showPreviewImage(imgElem); self.fire(_eventList.error); } }else{ S.log(LOG_PRE + 'File Input Element does not exists.'); } return self.data; } }); return Preview; }, { requires: [ 'dom', 'event' ] });