Agile框架之懒人加载源码剖析 (转)

大家都知道懒人加载可以让HTML5页面中的img图片可以在界面可见的时候进行显示,而不是一下子全部显示出来,极大的减缓了页面的加载效率和服务器的请求压力。
那么,在Agile中,通过给img设置data-source即可达到懒人加载的效果,这时候可以给img设置placeholder指明图片在请求完成之前显示的默认图片。
示例一:

<li class="table-view-cell media">
<a class="navigate-right">
<img class="media-object pull-left" data-source="http://yourdomain/test.png" data-type="base64" placeholder="../../image/42x42.gif">
<div class="media-body">
Item 1
<p>eeeeeeeeeeeeeeeeeeeeeeeeee</p>
</div>
</a>
</li>
示例二:

<li class="table-view-cell media">
<a class="navigate-right">
<img class="media-object pull-left" data-source="http://www.ExMobi.cn/images/common/qq-logo-dark.png" placeholder="../../image/42x42.gif">
<div class="media-body">
Item 1
<p>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</p>
</div>
</a>
</li>

可以看到上面示例一有个data-type="base64",指明这个data-source返回值需要是一个base64的编码,而示例二没有这个设置,默认是要求返回二进制流。

核心代码实现如下:

/**
     * 初始化懒人加载组件
     */
    var _init_lazyload = function(el){
            var $el = $(el);
            var source = $el.data(‘source‘);
            if(!source){
                    $.map(_getMatchElements($el,SELECTOR.lazyload.selector),SELECTOR.lazyload.handler);
                return;
            }
            var placeholder = $el.attr(‘placeholder‘)||A.settings.lazyloadPlaceholder;
            if(!$el.attr(‘src‘)&&placeholder) $el.attr(‘src‘, placeholder);
            
            var eTop = $el.offset().top;//元素的位置
            var validateDistance = 100;
            var winHeight = $(window).height()+validateDistance;
            if(eTop<0||eTop>winHeight) return;            
            
            var _injectImg = function(data){
                    if(!$el.data(‘source‘)) return;
                    A.anim($el,‘fadeOut‘, 200, function(){
                            $el.attr(‘src‘, data);
                            $el.removeAttr(‘data-source‘);
                            _init_scroll($(‘section.active article[data-scroll]‘));
                            A.anim($el,‘fadeIn‘, 200);
                    });                        
            };
            
            var type = $el.data(‘type‘);            
            if(type==‘base64‘){
                    A.ajax({
                            url : source,
                            success : function(data){
                                    _injectImg(data);
                            },
                            isBlock : false
                    });
            }else{
                    var img = new Image();
                    img.src = source;
                    if(img.complete) {
                            _injectImg(source);
                            img = null;
                }else{
                        img.onload = function(){
                                    _injectImg(source);        
                                    img = null;
                        };
                        
                }
            }
    };

可以看到当data-type="base64"的时候实际上是发起了一个ajax请求得到编码后的信息设置到src里的,而非base64的类型则实例化img后将实例化src给原来的img(如何显示base64格式图片说明http://bbs.exmobi.cn/thread-3271-1-1.html
这样就达到了图片加载完成后显示的功能。

好了,说到这我们有一个很重要的说明。
在ExMobi里有服务端的概念,即当我们要集成一个内网的系统的时候,经过服务端可以屏蔽内网的网络联接问题,让服务端的JSP去做与内网的交互,而客户端只需要联接到服务端即可。

那么使用webview或者browser控件来显示img就有个问题了。因为这两个控件都是依赖于系统浏览器的,系统浏览器只认系统本身的网络,如果网络是外部网络比如3G、4G,而不是内网,那么img就因网络不通显示不出来。
这时候就可以使用懒人加载来实现,这里就要求必须是data-type="base64",这时候给img设定一个data-source,并且设置ajax走服务端($util.ajax),即

A.launch({
        showPageLoading : false,
        isAutoRender : true,
        crossDomainHandler : $util.ajax
    });

这样就给data-source的地址配置mapp路由进到一个jsp,jsp需要请求完图片转换成base64编码,比如:

<%@ page language="java" import="java.util.*,com.fiberhome.bcs.appprocess.common.util.*"
 contentType="application/uixml+xml; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/client/adapt.jsp"%>
<!-- 这里需要传递一个url参数过来,为了示例这里写死了 -->
<aa:http id="img" url="http://www.exmobi.cn/images/common/qq-logo-dark.png"></aa:http>
<%
byte body[] = aa.rsp.getAttachBody("img");
sun.misc.BASE64Encoder encode =  new sun.misc.BASE64Encoder();
String base64 = encode.encode(body);
System.out.println(base64);
%>
<%="data:image/png;base64,"+base64%>

这样就可以实现图片走服务端解析后返回浏览器内部显示。

原作者:http://bbs.exmobi.cn/forum.php?mod=viewthread&tid=3270&extra=page%253D1&page=1

时间: 2024-10-30 18:19:40

Agile框架之懒人加载源码剖析 (转)的相关文章

插件式换肤框架搭建 - 资源加载源码分析

1. 概述 大部分控件我们都会使用,但是我们未必知道其资源加载的原理,目前换肤的框架比较多我们可以随随便便拿过来用,但早在几年前这些资料是比较少的,如果想做一个换肤的框架那就只能自己一点一点啃源码. 如果说我们现在不去用第三方的开源框架,要做一个换肤的功能,摆在我们面前的其实只有一个问题需要解决,那就是如何读取另外一个皮肤apk中的资源. 所有分享大纲:2017Android进阶之路与你同行 视频讲解地址:http://pan.baidu.com/s/1bC3lAQ 2. 资源加载源码分析 2.

IOS懒人笔记应用源码

这个源码是懒人笔记应用源码,也是一个已经上线的apple应用商店的应用,懒人笔记iOS客户端源码,支持语音识别,即将语音转化成文本文字,所用语音识别类库为讯飞语音类库. 懒人笔记是一款为懒人设计的笔记本,你只需要通过语音输入,即可完成笔记的书写.同时支持发邮件,分享到朋友圈等附加功能.大部分情况下你无需动笔,只需要靠说,就可以轻松记笔记.发邮件,是提高效率的好工具. <ignore_js_op> <ignore_js_op> <ignore_js_op> 详细说明:ht

Maxwin-z/XListView-Android(下拉刷新上拉加载)源码解析(一)

本次解析的内容,是github上一个用于下拉刷新上拉加载的控件xlistview,这个功能相信大家在开发的过程中会经常用到. 控件的源码地址是https://github.com/Maxwin-z/XListView-Android 在这个控件之前,我看过一些相同功能的控件,挑选后觉得XListView功能比较完善,而且易于理解.在android-open-project里面,有提到一个DropDownListView,个人使用过以后,觉得功能是具备了,但是操作体验不好,原因就是没有使用到Scr

springMVC容器加载源码分析

springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理.这里我们来分析下springMVC的源码. 首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet.把它配置在web.xml中,并且处理我们在整个mvc中需要处理的请求,一般如下配置: <servlet> <servlet-name

Maxwin-z/XListView-Android(下拉刷新上拉加载)源码解析(二)

转载请注明出处http://blog.csdn.net/crazy__chen/article/details/45980399 源文件下载地址http://download.csdn.net/detail/kangaroo835127729/8736887 本文主要是贴出xlistview的源代码和一个使用实例,没有过多讲解 使用实例,MainActivity public class MainActivity extends Activity { private LinkedList<Str

Python爬虫框架Scrapy 学习笔记 7------- scrapy.Item源码剖析

在前面的example中,我们知道定义一个Item类很简单,只要继承scrapy.Item,然后添加几个类型为scrapy.Field的对象作为类属性,就像下面这样 import scrapy class Product(scrapy.Item):     name = scrapy.Field()     price = scrapy.Field()     stock = scrapy.Field()     last_updated = scrapy.Field(serializer=st

eclipse中自动加载源码的方法

1.选中项目右键properties--java build path--Libraries--Add External class Folder 找到项目将项目添加进去 2.然后就是这样 3.OK 原文地址:https://www.cnblogs.com/xiangkejin/p/8974649.html

《Ruby源码剖析》现已上市

豆瓣页面已创建 天猫购买链接 当当预售地址 京东预售地址 来自原作者的祝贺: 我翻译的<Ruby under a Microscope>中文版<Ruby源码剖析>现在已经上市了. 这本书从2015年4月开始翻译,历经翻译--审核--修订--编辑一审--修订--编辑二审--修订--编辑三审--修订--终审--修订--印刷,现在终于上市了.在翻译期间有不少人追着我问这本书什么时候上市,那么现在大家终于可以入手了:天猫购买链接 京东或当当应该还没有铺开,马上就会有货了!另外电子书可能会在

Qt5的插件机制(1)--Qt 框架中的插件加载机制概述

概述 Qt的源码中通过 Q<pluginType>Factory.Q<pluginType>Plugin 和 Q<pluginType> 这三个类实现了Qt的插件加载机制, 这个机制可用于加载特定种类的插件.比如通过 QPlatformIntegrationFactory\QPlatformIntegrationPlugin\QPlatformIntegration 三个类可以实现平台类QPA插件(PlatformIntegration)的加载,通过QPlatformI