[转帖]Mootools源码分析-49 -- Asset

原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355

原作者:我佛山人

 

ExpandedBlockStart.gif代码
//脚本,样式和图片的资源加载
var Asset = new Hash({

    
//脚本资源的加载
    javascrīpt: function(source, properties)    {
        
//合并属性项
        properties = $extend({
            
//脚本加载完成后的事件通知
            onload: $empty,
            
//脚本标签所属的DOM
            document: document,
            
//约束检查
            check: $lambda(true)
        }, properties);

        
//创建scrīpt Element,指定路径及脚本类型
        var scrīpt = new Element('scrīpt', {'src': source, 'type''text/javascrīpt'});

        
//绑定脚本加载后的onload事件
        var load = properties.onload.bind(scrīpt), check = properties.check, doc = properties.document;
        
//删除非scrīpt标签的属性
        delete properties.onload; delete properties.check; delete properties.document;

        
//添加事件监听
        scrīpt.addEvents({
            
//加载完成事件
            load: load,
            
//加载状态更改事件
            readystatechange: function()    {
                
//如果状态码为loaded或complete中的一种,表明加载完成
                if (['loaded''complete'].contains(this.readyState))    load();
            }
            
//设置标签属性
        }).setProperties(properties);

        
//对Safari的hack处理,需要提供check方法手动检查有否加载完成
        if (Browser.Engine.webkit419) var checker = (function()    {
            
//尝试执行check方法,如果出错或检查未加载完成,退出
            if (!$try(check))    return;
            
//清除计时器
            $clear(checker);
            
//加载完成通知
            load();
            
//每50毫秒执行一次调用
        }).periodical(50);

        
//插入scrīpt标签到当前文档的头部
        return scrīpt.inject(doc.head);
    },

    
//样式资源的加载
    css: function(source, properties)    {
        
//创建link Element,设置属性并插入到当前文档头部
        return new Element('link', $merge({
            
'rel''stylesheet''media''screen''type''text/css''href': source
        }, properties)).inject(document.head);
    },

    
//图片资源的加载
    image: function(source, properties)    {
        
//合并属性
        properties = $merge({
        
//加载完成事件
        'onload': $empty,
        
//取消加载事件
        'onabort': $empty,
        
//加载失败事件
        'onerror': $empty
        }, properties);
        
//创建Image对象
        var image = new Image();
        
//如果Image对象无法Element化,创建img Element
        var element = $(image) || new Element('img');
        
//遍历处理load,abort和error事件
        ['load''abort''error'].each(function(name)    {
            
//为当前事件加上on前缀
            var type = 'on' + name;
            
//从属性集中读取事件
            var event = properties[type];
            
//删除属性集中的事件成员
            delete properties[type];
            
//为image对象绑定事件
            image[type] = function()    {
                
//如果对象不存在,退出
                if (!image) return;
                
//如果存在父节点
                if (!element.parentNode)    {
                    
//设置宽度
                    element.width = image.width;
                    
//设置高度
                    element.height = image.height;
                }
                
//销毁对象及事件
                image = image.onload = image.onabort = image.onerror = null;
                
//延时执行事件
                event.delay(1, element, element);
                
//延时触发事件
                element.fireEvent(name, element, 1);
            };
        });
        
//设置图片路径
        image.src = element.src = source;
        
//如果图片加载完成,延时执行onload事件
        if (image && image.complete)    image.onload.delay(1);
        
//设置img标签属性并返回Element的引用
        return element.setProperties(properties);
    },

    
//批量图片加载
    images: function(sources, options)    {
        
//合并参数
        options = $merge({
            
//图片集加载完成
            onComplete: $empty,
            
//图片集加载过程
            onProgress: $empty
        }, options);
        
//使source数组化,以兼容只有一个图片时不传数组的情况
        if (!sources.push)    sources = [sources];
        
//图片数组,项类型为Element
        var images = [];
        
//图片加载数量标记
        var counter = 0;
        
//遍历加载
        sources.each(function(source)    {
            
//使用Asset.image加载(new属多余,可省略)
            var img = new Asset.image(source, {
                
//添加加载完成事件监听,以实现进度通知及加载完成通知
                'onload'function()    {
                    
//进度通知,传送当前已加载数及当前图片的顺序索引值
                    options.onProgress.call(this, counter, sources.indexOf(source));
                    
//计数器加1
                    counter++;
                    
//如果计数器与source数组长度一致,表明全部加载完成,调用加载完成事件通知
                    if (counter == sources.length) options.onComplete();
                }
            });
            
//加载到数组
            images.push(img);
        });
        
//Elements化
        return new Elements(images);
    }
});

 

 

转载于:https://www.cnblogs.com/maapaa/articles/mootools-s-49.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桌面壁纸大全:50套高清 Mac 桌面壁纸背景【下篇】

这篇文章收集一组非常精美的 Mac 高清桌面壁纸分享给大家,这些都是仔细挑选的完美图片。挑选一张自己最喜欢的 Mac 高清桌面壁纸给你的电脑换上,让你的电脑看起来与众不同。 您可能还喜欢 分享18套精美的苹果风格免费图标素材10套精美的免费网站后台管理…

SpeedyCloud研发总监李孟:不要让底层细节被上层打败

随着互联网的发展,对于现代企业来说,DNS与CDN服务的作用正变得愈发重要,网络访问速度决定了前端客户体验,同时也影响着内部业务系统的运行。SpeedyCloud作为一家新晋IaaS云服务供应商,在DNS与CDN方面同样拥有丰富的实践…

springboot 关闭懒加载_SpringBoot新手入门篇

SpringBoot是干哈的介绍:springboot是由Pivotal团队提供的全新框架。spring的出现是为了解决企业级开发应用的复杂性,spring的通过注册bean的方式来管理类,但是随着业务的增加,使用xml配置bean的方式也显得相当繁琐,所…

java.security.key jar_异常: java.security.InvalidKeyException: Illegal key size

今天在做接口测试的时候遇到个异常:java.security.InvalidKeyException: Illegal key size。SecretKeySpec secretKeySpec new SecretKeySpec(aesKey, "AES");Cipher cipher Cipher.getInstance("AES/CTR/NoPadding");IvParameterSpec ips c…

CACTI 0.87e 安装

Cacti 是一个使用 RRDtool 引擎的基于网页的 PHP/MySql 图形解决方案。 Classically, 它可以使用 SNMP 来绘制网络带宽。但事实上,也可以通过 snmp,shell 或者 perl 脚本来绘制很多不同的图形。在 屏幕截图 部分,你可以浏览使用 Cacti 可以绘…

NodeManager启动流程与服务

本文介绍了NodeManager的启动流程与服务. NodeManager主流程 在main方法中new一个 NodeManager, 然后初始化并启动. 这里主要看initAndStartNodeManager方法. 首先是增加一个shutDownHook, 即CompositeServiceShutdownHook, 它的目的是为了在NodeManager crash的时候停止compos…

Unity3D的断点调试功能

这篇文章介绍的调试工具是Unity自带的MonoDevelop, 假设要用VS,须要下载unityvs http://unityvs.com/. http://liweizhaolili.blog.163.com/blog/static/162307442013214485190/ 断点调试功能可谓是程序猿必备的功能了。Unity3D支持编写js…

java模拟器分辨率_android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项...

1 Android手机目前常见的分辨率1.1 手机常见分辨率:4:3VGA 640*480 (Video Graphics Array)QVGA 320*240 (Quarter VGA)HVGA 480*320 (Half-size VGA)SVGA 800*600 (Super VGA)5:3WVGA 800*480 (Wide VGA)16:9FWVGA 854*480 (Full Wide VGA)HD 1920*1080 High D…

python中if else语句用法_Python中if-else语句的多种写法

原博文 2017-02-06 10:24 − 初学Python在看程序时发现python中if-else的多种写法,故对其进行分析。 以下为网络内容: a, b, c 1, 2, 3 1.常规 if a>b: &nb... 相关推荐 2019-11-13 15:13 − if x A: do something for A elif x B: do somethi…

Javascript中最常用的55个经典技巧

1. οncοntextmenu"window.event.returnValuefalse" 将彻底屏蔽鼠标右键<table border οncοntextmenureturn(false)><td>no</table> 可用于Table 2. <body onselectstart"return false"> 取消选取、防止复制 3. οnpaste"…

Reflux系列01:异步操作经验小结

写在前面 在实际项目中&#xff0c;应用往往充斥着大量的异步操作&#xff0c;如ajax请求&#xff0c;定时器等。一旦应用涉及异步操作&#xff0c;代码便会变得复杂起来。在flux体系中&#xff0c;让人困惑的往往有几点&#xff1a; 异步操作应该在actions还是store中进行&…

mysql 存储过程月单拆天单_MySQL之存储过程按月创建表的方法步骤

具体不多说&#xff0c;直接上代码。欢迎一起交流和学习。创建一个按月创建表的存储过程&#xff0c;SQL语句如下:DELIMITER //DROP PROCEDURE IF EXISTS create_table_by_month //CREATE PROCEDURE create_table_by_month()BEGIN#--提前申明变量,后面会用到DECLARE nextMonth …

python转换成c语言_把python转成c

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 推荐使用腾讯云 api 配套的7种常见的编程语言 sdk&#xff0c;已经封装了签名和请求过程&#xff0c;均已开…

开源技术选型手册

目录 第1章 闲话开源社区篇 第2章 Web框架篇 2.1 Struts 2.2 Spring 2.3 Seam 第3章 开源Web服务器 3.1 Apache 3.2 Lighttpd 3.3 Nginx 第4章 应用服务器篇 4.1 JBoss 4.2 Geronimo 4.3 JFox 第5章 开发平台篇&#xff08;IDE&#xff09; 5.1 Eclipse 5.2 NetBeans 第6章 动态…

UVA 1156 - Pixel Shuffle(模拟+置换)

UVA 1156 - Pixel Shuffle 题目链接 题意&#xff1a;依据题目中的变换方式&#xff0c;给定一串变换方式&#xff0c;问须要运行几次才干回复原图像 思路&#xff1a;这题恶心的一比&#xff0c;先模拟求出一次变换后的相应的矩阵&#xff0c;然后对该矩阵求出全部循环长度&am…

java 字体名字_JAVA:获取系统中可用的字体的名字

import java.awt.*;public class GetLocalFontFamily{public static void main(String[] agrs){//获取系统中可用的字体的名字GraphicsEnvironment e GraphicsEnvironment.getLocalGraphicsEnvironment();String[] fontName e.getAvailableFontFamilyNames();for(int i 0; i…

document.getElementsByName 标准

document.getElementsByName w3c 标准中&#xff1a; 是获得name属性获得元素 IE 中&#xff1a;是通过ID属性获得元素转载于:https://www.cnblogs.com/chen-lei/archive/2009/12/29/1635343.html

python逐行写入csv_python将列表按行写入csv

原博文 2020-05-14 13:17 − import csv rows2 [abc1/ab1c,N] for n in range(10): f open("ok.csv", a,newline) writer csv.writer(f) writer.writerow(rows2) f.cl...02349 相关推荐 2019-12-18 14:42 − 逗号分隔值&#xff08;Comma-Separated Values&#x…

怎么和产品沟通

去别的地方以后和产品交流 随意点 都是给公司打工 你背后骂骂没事&#xff0c;当面和气点 恩 以后碰这样的情况 你就答应着 最后做不完&#xff0c;责任也不是你的 做多少是多少呗 就把情况说清楚 说不保证做完 就行 话不说死 产品告不了状 怎么办哦&#xff1f;切记你是没有…

java循环单链表比较相等_java的循环单链表

packageclink;//循环单链表public classTestClink {public static voidmain(String[] args) {//TODO Auto-generated method stubClink t1 newClink();for(int i 0;i<9;i){t1.insertHead(i);}t1.show();int lent1.getlength();System.out.println(len);System.out.println…