require、backbone等重构手机图片查看器

本文是对之前的部分补充,也是对最近学习require、backbone的一次实例化的实践,希望对正在学习理解中的同学们有帮助

前文请前往:制作手机使用的网页图片查看器

新手机图片查看器

网页部分

require引入是重点,指明了主函数所在文件路径

<!doctype html>
<html lang="zh-cn">
<head>
<title>webapp图片查看器</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<script src="http://cdn.file1.goodid.com/static/js/require.min.js" data-main="/static/js/pic/main"></script>
</head>
<body>
<section class="index">
    <h1>手机网页图片查看器</h1>
    <figure class="download">
        <a>其它文件</a>
        <a url="http://static.bootcss.com/www/assets/img/opencdn.png">图片a</a>
        <a url="http://static.bootcss.com/www/assets/img/buttons.png">图片b</a>
        <a>其它文件</a>
        <a>其它文件</a>
        <a url="http://static.bootcss.com/www/assets/img/gruntjs.png">图片c</a>
        <a url="http://static.bootcss.com/www/assets/img/lesscss.png">图片d</a>
        <a>其它文件</a>
    </figure>
</section>
</body>
</html>

require.js加载完成后即加载main.js;样式部分就不占篇幅了,后面自己看完整网页

模版引擎部分

第一个是对话框、第二个是当前位置、第三个是当前展示图片

<script id="dialog_tmpl" type="text/template">
<section></section>
<figure id="swipe"><ul></ul></figure>
<footer>
    <span id="l">左旋</span>
    <span id="r">右旋</span>
    <span id="pos" index="<%=index %>" length="<%=length %>"><%=index %>/<%=length %></span>
</footer>
</script>

<script id="pos_tmpl" type="text/template">
<span id="pos" index="<%=index %>" length="<%=length %>"><%=index %>/<%=length %></span>
</script>

<script id="item_tmpl" type="text/template">
<img src="<%=src %>" width="<%=width %>" height="<%=height %>" url="<%=url %>" />
</script>

3个模版需要写入HTML文件内

程序开发部分

主函数main.js

require.config({
    paths : {
        jquery     : ‘http://cdn.file1.goodid.com/static/js/zepto.min‘,
        fastclick  : ‘http://cdn.file1.goodid.com/static/js/fastclick.min‘,
        underscore : ‘http://cdn.file1.goodid.com/static/js/underscore.min‘,
        backbone   : ‘http://cdn.file1.goodid.com/static/js/backbone.min‘,
        swipe      : ‘http://cdn.file1.goodid.com/static/js/swipe.min‘
    },
    shim  : {
        jquery : {
            exports : ‘$‘
        },
        fastclick : {
            deps : [‘jquery‘]
        }
    }
});

require([‘underscore‘, ‘backbone‘, ‘fastclick‘], function (){
    FastClick.attach(document.body);
    require([‘./view/global‘], function(Global){
        var global = new Global;
    });
});

paths定义了各模块路径;shim中重新解析了jquery模块,fastclick(一款帮助提高触摸体验的微型插件)指明依赖模块jquery

require首先依次加载underscore、backbone、jquery、fastclick模块,然后再加载全局控制视图global模块并实例化

全局控制视图global.js

define([‘model/pic‘, ‘collection/set‘, ‘view/imager‘], function (Pic, Set, Imager){
    var set = new Set;

    // 全局控制视图
    var global = Backbone.View.extend({
        el : ‘body‘,
        data : $(‘.download [url]‘),
        events : {
            ‘click .download [url]‘ : ‘open‘
        },
        open : function (model){
            var url    = $(model.target).attr(‘url‘);
            var index  = this.data.index($(model.target));
            var length = this.data.length;
            var total  = new Pic.total({
                index  : index + 1,
                length : length
            });
            var dialog = new Imager.dialog({
                model : total
            });
            $(this.el).prepend(dialog.render().el); // 绘制图片查看器

            this.collect();
            this.list();
            this.swipe(index);
            this.loading(url, index);
        },
        collect : function (){
            if(set.length > 0) return false;

            this.data.each(function(){
                var name = $(this).text();
                var url  = $(this).attr(‘url‘);
                var item = new Pic.item({
                    name : name,
                    url  : url
                });
                set.add(item); // 添加模型
            });
        },
        list : function (){
            var obj = $(‘#swipe ul‘);
            set.each(function(model){
                var list = new Imager.list({
                    model : model
                });
                obj.append(list.render().el); // 绘制图片列表
            });
        },
        swipe : function (index){
            require([‘swipe‘], function(){
                var swipe = new Imager.swipe;
                swipe.render(index).el; // 绘制图片滑动特效
            });
        },
        loading : function (url, index){
            var item    = new Pic.item({
                url : url
            });
            var loading = new Imager.loading({
                model : item,
                el : $(‘#swipe li‘).eq(index).find(‘img‘)
            });
            loading.render(); // 绘制图片加载
        }
    });

    return global;
});

依次加载它依赖的数据模型pic模块、数据集合set模块、渲染视图imager模块并实例化了一个集合模块

全局控制视图中我们定义了:绘制图片查看器的open方法、添加模型的collect方法、绘制图片列表的list方法、绘制图片滑动特效的swipe方法、绘制图片加载的loading方法

渲染视图imager.js

define([‘model/pic‘], function (Pic){
    var imager = Object;

    // 图片查看器视图
    imager.dialog = Backbone.View.extend({
        initialize : function (){
            _.bindAll(this, ‘render‘);
        },
        tagName : ‘section‘,
        className : ‘dialog‘,
        template : _.template($(‘#dialog_tmpl‘).html()),
        events : {
            ‘click #l, #r‘ : ‘turn‘
        },
        render : function (){
            $(this.el).html(this.template(this.model.toJSON()));
            return this;
        },
        turn : function(model){
            var index = parseInt($(‘#pos‘).attr(‘index‘)) - 1;
            var obj   = $(‘#swipe li‘).eq(index).find(‘img‘);
            var deg   = parseInt(obj.attr(‘deg‘) ? obj.attr(‘deg‘) : 0);
            var type  = model.target.id;
            if(type && type == ‘l‘) deg -= 90;
            else if(type && type == ‘r‘) deg += 90;
            if(deg > 360) deg -= 360;
            else if(deg < -360) deg += 360;
            obj.css({‘-webkit-transform‘:‘rotate(‘ + deg + ‘deg)‘}).attr({‘deg‘:deg});
        }
    });

    // 图片列表视图
    imager.list = Backbone.View.extend({
        initialize : function (){
            _.bindAll(this, ‘render‘);
        },
        tagName : ‘li‘,
        template : _.template($(‘#item_tmpl‘).html()),
        events : {
            ‘click img‘ : ‘close‘
        },
        render : function (){
            $(this.el).html(this.template(this.model.toJSON()));
            return this;
        },
        close : function (){
            $(‘.dialog‘).remove();
        }
    });

    // 图片滑动定位视图
    imager.fix = Backbone.View.extend({
        initialize : function (){
            _.bindAll(this, ‘render‘);
        },
        el : ‘#pos‘,
        template : _.template($(‘#pos_tmpl‘).html()),
        render : function (){
            $(this.el).replaceWith(this.template(this.model.toJSON()));
            $(‘#swipe [deg]‘).removeAttr(‘deg‘).removeAttr(‘style‘);
            return this;
        }
    });

    // 图片加载视图
    imager.loading = Backbone.View.extend({
        initialize : function (){
            _.bindAll(this, ‘render‘);
        },
        template : _.template(‘<img src="<%=url %>" />‘),
        render : function (){
            var obj  = $(this.el);
            var html = this.template(this.model.toJSON());
            var img  = new Image();
            img.src  = this.model.attributes.url;
            img.onload = function(){
                obj.replaceWith(html);
            };
            return this;
        }
    });

    // 图片滑动特效视图
    imager.swipe = Backbone.View.extend({
        initialize : function (){
            _.bindAll(this, ‘render‘);
        },
        render : function (index){
            var obj = document.getElementById(‘swipe‘);
            window.mySwipe = Swipe(obj, {
                startSlide    : index,
                continuous    : false,
                disableScroll : true,
                callback      : function(index, element){
                    var length = $(‘#pos‘).attr(‘length‘);
                    var total  = new Pic.total({
                        index  : index + 1,
                        length : length
                    });
                    var fix    = new imager.fix({
                        model : total
                    });
                    fix.render(); // 绘制图片滑动定位

                    var url = $(element).find(‘img‘).attr(‘url‘);
                    if(!url || url.length == 0) return false;

                    var item    = new Pic.item({
                        url : url
                    });
                    var loading = new imager.loading({
                        model : item,
                        el : $(element).find(‘img‘)
                    });
                    loading.render(); // 绘制图片加载
                }
            });
            return this;
        }
    });

    return imager;
});

数据模型pic.js

define(function (){
    var pic = Object;

    // 图片数据统计模型
    pic.total = Backbone.Model.extend({
        defaults : {
            index  : 1,
            length : 1
        }
    });

    // 图片数据模型
    pic.item = Backbone.Model.extend({
        defaults : {
            name   : ‘图片加载中...‘,
            src    : ‘http://cdn.file1.goodid.com/static/images/loading.gif‘,
            url    : ‘‘,
            width  : 40,
            height : 40
        }
    });

    return pic;
});

数据集合set.js

define([‘model/pic‘], function (Pic){
    // 图片数据集合
    var set = Backbone.Collection.extend({
        model : Pic.item
    });

    return set;
});

好了,上图啦

或者 点我看链接

模块定义让程序更加清晰了,模块加载让文件加载执行在我们的掌控之中;MVC模式(C还没用上)让数据逻辑层等分离更加顺手减少了代码混乱

时间: 2024-12-17 00:20:04

require、backbone等重构手机图片查看器的相关文章

制作手机使用的网页图片查看器

这几天抽空在为项目开发一个量身的图片查看器,目前已初步完成需求 开发场景是:在一个多文件下载展示列表中,如检测某些文件为图片时,则点击该文件时打开图片查看器展示该图片,并将列表内其它图片同时展示查看器队列内,可供前后滑动查看及其它附带功能 乍一听功能点似乎有点多而且有些复杂,需要梳理一下 功能点整理 首先,我们要获得点击的图片文件对象及符合条件的图片文件对象集 其次,图片查看器的制作及图片队列展示 然后,图片友好加载方式 最后,图片查看器触摸滑动及滑动后相关功能的实现 简单整理了一下,好像也不多

分享一款强大的图片查看器插件,手机PC 通吃,功能超级齐全!

一款强大的图片查看器插件,手机PC 通吃,功能超级齐全! 地址:http://photoswipe.com/

Android笔记二十七.Bitmap之简易图片查看器

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 为了增强用户之间的交互,Android系统中提供了一些API和部件给我们开发美观有趣的应用.比如Android系统提供了ImageView来显示静态图片.AnimationDrawble来开发逐帧动画以及通过Animation对普通图片使用不减动画等.另外,Android应用中的图片不仅包括*.png.*.jpg.*.gif等格式的位图,也包括使用XML资源文件定义的各种Drawable对象.关

Qt项目实战2:简单的图片查看器(1)

在博文http://www.cnblogs.com/hancq/p/5817108.html中介绍了使用空的Qt项目创建带有菜单栏.工具栏的界面. 这里,使用一个简单的图片查看器项目,来熟悉一下Qt的图片显示和基本操作. 该项目分为两部分: (1)实现图片的打开.关闭.居中显示.上一张/下一张切换 (2)实现图片的放大.缩小.左旋.右旋.另存为等操作 需要用的Qt类: QFileDialog QImage QPixmap QFileInfo 使用空的Qt项目创建带有菜单栏和工具栏的界面的操作参考

Canvas---Canvas图像处理、图片查看器实现思路整理、拖动边界控制

没想到一个图片查看器花了我这么多时间,而且没做好. 现在整理下思路,然后把不足的地方记一下,日后请教他人. 基本思路: 一.图片查看器功能---缩放 要实现自由缩放,先要实现图片对canvas的自适应,就是给你一张大图片,你能够把它合理缩放后恰好绘制在canvas中. 具体做法是:例如:图片为500*500,canvas为240*320,那就取缩放宽度为240,长度为240/500*500,利用缩放宽度与长度,绘制图片即可. 然后是自由缩放,这时,你的缩小放大对象只要是一个矩形就好,然后图片去适

发布两款JQ小插件(图片查看器 + 分类选择器),开源

图片查看器,github地址:https://github.com/VaJoy/imgViewer 效果如下: 这款当初大概写了2小时,有点匆忙地赶出来的,使用的接口很简单: $.bindViewer(".viewer-item"); 它的实现其实也没啥复杂的原理,唯一觉得可说的地方是图片展开的过程 —— 从小变大动态过程的实现.主要是靠这一段代码实现的: $(this).css({"top": win_h / 2 + sroll_t, "margin-l

最简单的图片查看器

最简单的图片查看器,支持放大.缩小.鼠标拖动. 下面是代码,非常简单: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>pic view</title> </head> <body> <div id="pic" class="pic"

WPF下的仿QQ图片查看器

本例中的大图模式使用图片控件展示,监听控件的鼠标滚轮事件和移动事件,缩略图和鹰眼模式采用装饰器对象IndicatorObject和Canvas布局.百分比使用一个定时器,根据图片的放大倍数计算具体的数值显示. 首先看看效果图: 以下开始绘制图片 定义缩略图上白色的矩形,这其实是一个Indicator,它的外围是一个Canvas,然后缩略图是一个Image控件 internal class IndicatorObject : ContentControl { private MaskCanvas

Android图片查看器(图片可移动、缩放)

要实现图片在手指点击后移动和缩放有好几种方法,在这里是通过onTouch来实现的. 实例代码如下: 首先是在View中有一个ImageView <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren