`
sailorlee
  • 浏览: 42738 次
  • 性别: Icon_minigender_1
  • 来自: 河北唐山
最近访客 更多访客>>
社区版块
存档分类
最新评论

EXT典型范例 Image Chooser源码大剖析

阅读更多

EXT做出来的效果不用多说。但EXT只是JS+CSS,究竟是什么 能量 或者说“技术”吸引大家的眼球呢?
Jack自然是最清楚的,不过好歹小弟我也研究多时,且让我慢慢揣摩其奥秘之处!

p.s:下列代码肯定是重构过,一般写JS开始时不会有如此有条理的,--可先不理条理、优雅的代码 反正先弄懂API再说

Image Chooser Demo:http://extjs.com/deploy/ext/examples/view/chooser.html

chooser-example.js:

Ext.onReady(function(){
       
        //先声明一些变量
    var chooser, btn;
   
//    创建一个Button XHTML页面中必须有下列makup容器(style可根据需求修改):
//    <div id="buttons" style="margin:20px;"></div>
     btn = new Ext.Button('buttons', {
            text: "Insert Image",
                handler: choose //当按钮被按下的时候,接着发生的事情。注意是没有括号的函数名称
                /**
                 * 在JS中, 一个函数有括号 和没有括号,是不同的。
                 * 通常来说括号()可理解为对函数的执行,表示一个动作;
                 * 使用不带括号的函数名称,则表示 “获取函数的地址”。
                 * 具体说明参阅微软文档:[url]http://jstang.5d6d.com/thread-64-1-1.html[/url]
                 */
       
        });
     function choose(btn){
             //判断是否已有chooser (Singleton)
            if(!chooser){
                    chooser = new ImageChooser({
                            url:'get-images.php',
                            width:515,
                            height:400
                    });
            }
            chooser.show(btn.getEl(), insertImage); //show()为ImageChooser的方法
    };
    function insertImage(data){
            //利用DomHelper动态加入元素,而这些都是div id="images“的子元素。
            //img的url地址由参数传入的data中的url属性决定(data的类型为object)
            //初始样式为外补丁10px,不可见       
            Ext.DomHelper.append('images', {
                    tag: 'img', src: data.url, style:'margin:10px;visibility:hidden;'
            }, true).show(true);// 这里先隐藏在show()的目的是做出动画效果,true为带有动画。
            btn.getEl().focus();
    };

});


chooser.js

var ImageChooser = function(config){
        // 创建一个对话框 -开始
    /*
     * config.id || Ext.id() 意思为:优先使用config.id;没有的话,用Ext.id()
     * 【逻辑运算符”||“常用与设置默认值】
     * Ext.id()方法能动态生成不重复的id,如:
              Ext.id()
                        "ext-gen87"
                Ext.id()
                        "ext-gen88"
                Ext.id()
                        "ext-gen89"
     */
   
    var dlg = new Ext.LayoutDialog(config.id || Ext.id(), {
                autoCreate : true,
                minWidth:400,
                minHeight:300,
                syncHeightBeforeShow: true,
                shadow:true,
        fixedcenter:true,
        center:{autoScroll:false},
                east:{split:true,initialSize:150,minSize:150,maxSize:250}
        });
        dlg.setTitle('Choose an Image');
        dlg.getEl().addClass('ychooser-dlg');
        dlg.addKeyListener(27, dlg.hide, dlg); // Esc键可隐藏
       
    // 创建一个对话框 -结束
    //在对话框上加入‘ok'按钮,
    // this.ok指针指向该按钮对象(对象由addButton()执行后返回),
    // 并分配一个callback( this.doCallback 作用:将选好的图片,加入背景中)
   
    this.ok = dlg.addButton('OK', this.doCallback, this);
    this.ok.disable();//先禁止,因为刚开始时数据加载中
    /**
     * 这里完成了两件事情:a.新建一个cancel按钮 b.设置这个按钮为默认的
     */
    dlg.setDefaultButton(dlg.addButton('Cancel', dlg.hide, dlg));
    dlg.on('show', this.load, this); //当对话框显示时,立刻加载数据
        this.dlg = dlg;
        var layout = dlg.getLayout();
       
        // filter/sorting toolbar
        this.tb = new Ext.Toolbar(this.dlg.body.createChild({tag:'div'}));
        this.sortSelect = Ext.DomHelper.append(this.dlg.body.dom, {
                tag:'select', children: [
                        {tag: 'option', value:'name', selected: 'true', html:'Name'},
                        {tag: 'option', value:'size', html:'File Size'},
                        {tag: 'option', value:'lastmod', html:'Last Modified'}
                ]
        }, true);
        this.sortSelect.on('change', this.sortImages, this, true);
       
        this.txtFilter = Ext.DomHelper.append(this.dlg.body.dom, {
                tag:'input', type:'text', size:'12'}, true);
               
        this.txtFilter.on('focus', function(){this.dom.select();});
        this.txtFilter.on('keyup', this.filter, this, {buffer:500});
       
        this.tb.add('Filter:', this.txtFilter.dom, 'separator', 'Sort By:', this.sortSelect.dom);
       
        // 在布局中加入一些面板panel beginUpdate()
        layout.beginUpdate();
        var vp = layout.add('center', new Ext.ContentPanel(Ext.id(), {
                autoCreate : true,
                toolbar: this.tb,
                fitToFrame:true
        }));
        var dp = layout.add('east', new Ext.ContentPanel(Ext.id(), {
                autoCreate : true,
                fitToFrame:true
        }));
    layout.endUpdate();
        // 在布局中加入一些面板panel endUpdate()       
        var bodyEl = vp.getEl();
        bodyEl.appendChild(this.tb.getEl());
        //
        /*vp-->包含this.tb(工具条)和 viewBody(视图view的主体)
         * 试比较appendChild()和createChild()的区别
         * appendChild()->"Appends the passed element(s) to this element "
         *   
     *                         加入传入的element(s)到该element
     *                         @param {String/HTMLElement/Array/Element/CompositeElement} el
     *                         @return {Ext.Element} this
     *
         * createChild()-->"Creates the passed DomHelper config and
         * appends it to this element or optionally inserts it before the passed child element. "
         */
        var viewBody = bodyEl.createChild({tag:'div', cls:'ychooser-view'});
        vp.resizeEl = viewBody;
       
        this.detailEl = dp.getEl();
       
        // 创建缩略图的HTML模板
        this.thumbTemplate = new Ext.Template(
                '<div class="thumb-wrap" id="{name}">' +
                '<div class="thumb"><img src="{url}" title="{name}"></div>' +
                '<span>{shortName}</span></div>'
        );
        this.thumbTemplate.compile();        //编译DOM加速
        // 创建详细资料的HTML模板
        this.detailsTemplate = new Ext.Template(
                '<div class="details"><img src="{url}"><div class="details-info">' +
                '<b>Image Name:</b>' +
                '<span>{name}</span>' +
                '<b>Size:</b>' +
                '<span>{sizeString}</span>' +
                '<b>Last Modified:</b>' +
                '<span>{dateString}</span></div></div>'
        );
        this.detailsTemplate.compile();        //编译DOM加速
   
    //初始化view视图
        this.view = new Ext.JsonView(viewBody, this.thumbTemplate, {
                singleSelect: true,
                jsonRoot: 'images',
                emptyText : '<div style="padding:10px;">No images match the specified filter</div>'
        });
    this.view.on('selectionchange', this.showDetails, this, {buffer:100});//事件触发后延时100才执行
    this.view.on('dblclick', this.doCallback, this); //双击图片,加入背景中
    this.view.on('loadexception', this.onLoadException, this);
    this.view.on('beforeselect', function(view){
        return view.getCount() > 0;
    });
    //将配置项对象的属性 和this合二为一
    Ext.apply(this, config, {
        width: 540, height: 400
    });
    //格式化kb的小函数
    var formatSize = function(size){
        if(size < 1024) {
            return size + " bytes";
        } else {
            return (Math.round(((size*10) / 1024))/10) + " KB";
        }
    };
   
    // 创建一个lookup对象,用查找图片名时用
    var lookup = {};
    //这里override了prepareData(),可在模板中使用自定义的属性
    this.view.prepareData = function(data){
            data.shortName = data.name.ellipse(15);
            data.sizeString = formatSize(data.size);
            data.dateString = new Date(data.lastmod).format("m/d/Y g:i a");
            lookup[data.name] = data;//保存到lookup的hash table中
            return data;
    };
    this.lookup = lookup;//成为对象的一员
    /*
     * this.width, this.height哪里来?由config配置项对象获得(前面已经apply())
     */
        dlg.resizeTo(this.width, this.height);

        this.loaded = false;
};
分享到:
评论

相关推荐

    ImageChooser:一个Android ImageChooser

    Android 设备的屏幕尺寸和分辨率差异较大,因此 ImageChooser 需要能够适配各种设备。在设计 UI 时,需要考虑响应式布局,确保在不同设备上都能正常显示。同时,加载图片时要考虑性能优化,避免内存溢出,例如使用 ...

    ImageChooser-Android 仿QQ图片选择器,包含图片裁剪,浏览大图功能。.zip

    /**图片加载的占位图片*/public static int placeResId=R.mipmap.image_chooser_placeholder;/**图片加载的动画*/public static int loadAnimateResId=0;/**选中图片的滤镜颜色*/public static int ...

    AutoJs源码-file-chooser-dialog

    AutoJs源码-file_chooser_dialog。本资源购买前提醒:本源码都是实际autojs项目模板,安装好autojs直接运行即可打开。1、支持低版本autojs。2、资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己...

    JImageFileChooser

    2. **拖放支持**: 支持拖放操作是`JImageFileChooser` 的另一大优点。用户可以方便地通过鼠标拖动图片从一个位置到另一个位置,如从文件选择器到某个容器(如JPanel或JFrame),这对于文件管理和应用内部操作尤其...

    im-chooser-0.5.3-1.fc8.i386

    标题“im-chooser-0.5.3-1.fc8.i386”指的是一个特定版本的输入法选择器软件,适用于Linux操作系统中的Fedora 8(FEDORA9的错误描述可能是笔误)。这个软件的主要功能是为用户提供一个界面,以便在多种不同的输入法...

    Android应用源码之TXT文本阅读器源码.zip

    【Android应用源码之TXT文本阅读器源码.zip】是一个包含了一个简单的Android应用程序源代码的压缩包,这个程序主要用于阅读TXT格式的文本文件。通过分析这个应用,我们可以深入理解Android应用开发中的几个关键知识...

    Pantone_Color_Chooser

    Pantone Color Chooser是一款专为纺织业设计的色彩选择工具,它以其直观易用的特点,为设计师们提供了一个高效、准确的色彩参考平台。 Pantone色卡是全球公认的色彩标准,被广泛应用于各行各业,尤其是纺织品设计。...

    jqGrid插件源码

    4. **优化性能**:分析源码以提高jqGrid在大数据量下的加载速度和用户体验,例如,理解如何实现分页和懒加载机制。 5. **美化界面**:通过修改CSS文件,可以调整表格的样式,使其符合现代Web设计标准。 总结来说,...

    android打电话源码.zip

    本项目源码提供了实现这一功能的详细示例,对于学习和理解Android编程,特别是涉及电话服务API的使用,有着极大的帮助。以下是这个"android打电话源码.zip"中的关键知识点: 1. **权限管理**: 在AndroidManifest....

    android the file chooser manager

    在Android平台上,文件选择器管理器("android the file chooser manager")是一个至关重要的组件,它允许用户在应用中选择本地存储的文件。文件选择器是Android应用与用户交互,处理文件操作的关键部分,比如读取、...

    DNS Chooser

    DNS Chooser是一款实用工具,主要用于帮助用户选择和切换不同的DNS(域名系统)服务器。在日常网络使用中,DNS是互联网的重要组成部分,它负责将我们输入的网址(如www.example.com)转换为对应的IP地址(如192.168....

    48.Chooser CompoundChooserandStraddle1114.xls

    48.Chooser CompoundChooserandStraddle1114.xls

    im-chooser-common-1.6.4-4.el7.x86_64.rpm

    离线安装包,亲测可用

    Android-自定义应用选择器源码.zip

    2. **源码结构分析** - `AppChooser-master`: 这是源码的主要目录,可能包含项目的主模块,包括Java源代码、布局XML文件、资源文件等。 - `说明.htm`: 这可能是关于项目的一份简要说明,涵盖了如何编译、运行以及...

    《拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现》对应源码

    if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) { Uri selectedImage = data.getData(); // 使用Uri加载图片,例如使用 Glide 或 Picasso 库 } } ``` 最后,裁剪功能通常使用第三方库...

    CM魅族主题(含Theme Chooser)

    CM魅族主题是一款专为魅族手机用户设计的个性化主题应用,其中包含了Theme Chooser功能。这个主题包不仅提供了丰富的视觉样式,还允许用户自定义手机界面,打造出独特的操作体验。下面将详细介绍CM魅族主题及其相关...

    java处理execl表格源码

    JFileChooser chooser1 = new JFileChooser(); int state = chooser1.showOpenDialog(null); chooser1.show(); String filepath=null; boolean flag = true; if (chooser1.getSelectedFile() != null ...

    file_chooser:安全无效的file_chooser

    Flutter的桌面嵌入 该项目最初是为了开发Windows,macOS和Linux嵌入式而创建的。 自那以后,这项工作已成为Flutter的一部分,这里剩下的只是实验性的,早期阶段的桌面。 如果要在台式机上开始使用Flutter,现在开始...

Global site tag (gtag.js) - Google Analytics