实例索引

  1 function CreateList() {
  2     this.oWrap = document.createElement("div");
  3     this.copyright = document.createElement("div");
  4     this.initialize.apply(this, arguments);
  5     /**
  6         arguments就是构造函数接受的参数,构造函数调用时
  7         new CreateList(aData[])传入的是一个数组
  8         数组的每一个项都是json对象
  9          json对象的格式为
 10             project:[
 11                     {
 12                         text:"测试文字",
 13                     },
 14                     {
 15                         text:"测试文字",
 16                         href:""
 17                     }
 18                 ]
 19         每一个project数组的项对应一个DL----(对应无序列表的ul)-----自定义列表dl---dt--dd
 20
 21
 22
 23
 24     */
 25     this.click.call(this)
 26 }
 27 CreateList.prototype = {//对CreateList的的函数进行定义
 28     initialize: function(aData) {
 29         var oDl, oElem, project, i;
 30         while(aData[0]) {//解析arguments的数据,赋给各局部变量
 31             oDl = document.createElement("dl");
 32             project = aData[0].project;
 33             for(i = 0; i < project.length; i++) {//遍历project数组
 34                 if(project[i].href) {
 35                 /*project数组中,有href的保存为"dd",并用innerHTML加上标签<a href="project[i].href" target="_blank"
 36                     target参数为_blank意思是打开新窗口
 37                 */
 38                     oElem = document.createElement("dd");
 39                     oElem.innerHTML = i + ") <a href=\"" + project[i].href + "\" target=\"_blank\">" + project[i].text + "</a>"
 40                 }
 41                 else {
 42                     /**
 43                         没有href属性时,保存为dt
 44                         并在dt里面添加project[i].text + " (" + (project.length - 1) + ")"    !!
 45                         oElem.innerHTML = project[i].text + " (" + (project.length - 1) + ")"
 46                     */
 47                     oElem = document.createElement("dt");
 48                     oElem.innerHTML = project[i].text + " (" + (project.length - 1) + ")"
 49                 }
 50                 oDl.appendChild(oElem);//for循环内,每次创建好一个dt或者dd,就append进oDL
 51                 oDl.style.height = "31px";//将当前创建好的dl高度设置为31px
 52             }
 53             this.oWrap.appendChild(oDl);//for循环外,dl已经创建好了,将其加入外层DIV也就是oWrap
 54             aData.shift();//将arguments[0],也就是传进的第一个大参数json数组的第一项删除
 55             //这样可以保证while(aDate[0])下一次循环时读取到的是最新的数据
 56         }
 57         this.oWrap.id = "wrap";
 58         this.copyright.id = "copyright";
 59         this.copyright.innerHTML = "\u539f\u751fJavaScript\u5b66\u4e60, QQ:21314130, By &mdash; Ferris 京ICP备10209901号";
 60         document.body.appendChild(this.oWrap);
 61         document.body.appendChild(this.copyright)
 62     },
 63     click: function() {
 64         var that = this;
 65         //console.log(this.tagName);
 66         this.oWrap.onclick = function(event) {
 67             //console.log(this.tagName);
 68
 69             var oEv, oTarget, oParent, i;
 70             oEv = event || window.event;
 71             oTarget = oEv.target || oEv.srcElement;//当前点击的元素
 72             oParent = oTarget.parentElement || oTarget.parentNode;//当前点击元素的父元素
 73             oParent.height = function() {
 74                 var iHeight = 0;
 75                 for(i = 0;i < oParent.children.length; i++) iHeight += oParent.children[i].offsetHeight;
 76                 return iHeight
 77             }();//获取当前点击元素的父元素的height
 78
 79
 80             if(oTarget.tagName.toUpperCase() == "DT") {//当点击的是dt时执行以下代码,此时oParent是dl
 81                 //oTarget是dt,而dt的父级元素就是dl
 82                 var aSiblings = that.siblings(oParent), count, i;//获取dl所有的aSiblings,即aSiblings是所有dl元素的数组
 83                 for(count = i = 0; i < aSiblings.length; i++) {
 84                     //alert( oTarget.offsetHeight);
 85                     that.startMove(aSiblings[i], oTarget.offsetHeight, "buffer", function() {
 86 //将所有的aSiblings[]全部收拢,然后执行回调函数
 87                         console.log(this.tagName);
 88                         this.children[0].className = "";
 89
 90                         if(++count == aSiblings.length) {//确保收拢之后执行
 91
 92                             if(oParent.offsetHeight == oTarget.offsetHeight) {//如果dl的高度与dt的高度相同
 93                                 //则需要flex展开
 94                                 oTarget.className = "current";
 95                                 that.startMove(oParent, oParent.height, "flex")
 96                             }
 97                             else {//否则需要buffer收拢
 98                                 that.startMove(oParent, oTarget.offsetHeight, "buffer", function() {
 99                                     oTarget.className = ""
100                                 })
101                             }
102
103
104                         }
105
106                     })
107                 }
108             }//end if
109
110
111
112         }//onclick end
113     },
114     startMove: function(obj, iTarget, type, callback) {
115         var that = this;
116         clearInterval(obj.timer);
117         obj.iSpeed = 0;
118         obj.timer = setInterval(function() {
119             that[type].call(that, obj, iTarget, callback)
120         }, 30)
121     },
122     buffer: function(obj, iTarget, callback) {
123         obj.iSpeed = (iTarget - obj.offsetHeight) / 5;
124         obj.iSpeed = obj.iSpeed > 0 ? Math.ceil(obj.iSpeed) : Math.floor(obj.iSpeed);
125         obj.offsetHeight == iTarget ? (clearInterval(obj.timer), callback && callback.call(obj)) : obj.style.height = obj.offsetHeight + obj.iSpeed + "px"
126     },
127     flex: function(obj, iTarget, callback) {
128         obj.iSpeed += (iTarget - obj.offsetHeight) / 6;
129         obj.iSpeed *= 0.75;
130         if(Math.abs(iTarget - obj.offsetHeight) <= 1 && Math.abs(obj.iSpeed) <= 1) {
131             clearInterval(obj.timer);
132             obj.style.height = iTarget + "px";
133             callback && callback.call(obj)
134         }
135         else {
136             obj.style.height = obj.offsetHeight + obj.iSpeed + "px"
137         }
138     },
139     siblings: function(element) {//自己实现jquery的获取同级兄弟节点数组的函数
140         var aTmp = [],
141              oParent = element.parentElement || element.parentNode,
142              i;
143         for(i = 0; i < oParent.children.length; i++)//如果当前element!=oParent.children[i]为真,则执行&&后的push函数
144              element != oParent.children[i] && aTmp.push(oParent.children[i]);
145         return aTmp
146     }
147 };

技巧1:

  oDiv.onclick=function (e){

    var ev=e||window.event;
    var oTarget=ev.srcElement||ev.target;
}

溯源 ,oTarget的值为当前点击的oDiv内的子DIV

技巧2:

this.initialize.apply(this, arguments);//等价于this.initialize(arguments[0]);

切记,arguments 是参数列表数组

this.click.call(this);

等价于this.click();

技巧3:

while(aDate[0]){

    ........
    aData.shift();
}

shift()为删除数组的第一个项,

技巧4:

    startMove: function(obj, iTarget, type, callback) {
        var that = this;
        clearInterval(obj.timer);
        obj.iSpeed = 0;
        obj.timer = setInterval(function() {
            that[type].call(that, obj, iTarget, callback)
        }, 30)
    },
    buffer: function(obj, iTarget, callback) {
        obj.iSpeed = (iTarget - obj.offsetHeight) / 5;
        obj.iSpeed = obj.iSpeed > 0 ? Math.ceil(obj.iSpeed) : Math.floor(obj.iSpeed);
        obj.offsetHeight == iTarget ? (clearInterval(obj.timer), callback && callback.call(obj)) : obj.style.height = obj.offsetHeight + obj.iSpeed + "px"
    },
    flex: function(obj, iTarget, callback) {
        obj.iSpeed += (iTarget - obj.offsetHeight) / 6;
        obj.iSpeed *= 0.75;
        if(Math.abs(iTarget - obj.offsetHeight) <= 1 && Math.abs(obj.iSpeed) <= 1) {
            clearInterval(obj.timer);
            obj.style.height = iTarget + "px";
            callback && callback.call(obj)
        }
        else {
            obj.style.height = obj.offsetHeight + obj.iSpeed + "px"
        }
    },

startMove预留了一个type,来制定运动的方式  这里定义了两种 一种是flex,一种是buffer

在定时器内  that[type].call(that,obj,iTarget,callback)

  that是指的全局对象,所以that[type]即是that.type,访问制定类型type代表的函数

    特点是type是字符串变量,因此可以实现不同成员函数的访问

obj.offsetHeight == iTarget ? (clearInterval(obj.timer), callback && callback.call(obj)) : obj.style.height = obj.offsetHeight + obj.iSpeed + "px"语句1:(clearInterval(obj.timer), callback && callback.call(obj))
语句2:obj.style.height = obj.offsetHeight + obj.iSpeed + "px"
拆开来看就算  当obj的高度已经到达给定值iTarget时,执行语句1,清楚定时器,并判断callback是否存在,若存在,则调用----牢记&&,逻辑与,为真时往后执行,||逻辑或,为假时才往后执行        当obj高度未达到指定值时,执行语句2,继续运动callback&&callback.call(obj)关于call函数与apply函数,下篇文章在分析
时间: 2024-07-31 12:15:49

实例索引的相关文章

【mysql】索引的优化

写在前面的话 查询容易,优化不易,且写且珍惜 mysql结构 从MySQL逻辑架构来看,MySQL有三层架构,第一层连接,第二层查询解析.分析.优化.视图.缓存,第三层,存储引擎 MySQL有哪些索引类型 ? 从数据结构角度 1.B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理 2.hash索引:a 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询b 其检索效率非常高,索引

一些有用的javascript实例分析(一)

原文:一些有用的javascript实例分析(一) 本文以http://fgm.cc/learn/链接的实例索引为基础,可参见其实际效果.分析和整理了一些有用的javascript实例,相信对一些初学者有一定的帮助.本人水平有限,有许多不足的地方还望包涵,指正.废话不多说,正文以代码开始,不在代码中死去,就在代码中重生.不经历码农,如何来做攻城狮. 1 1 控制div属性 2 //参数为对象,样式属性和值 3 var changeStyle=function(elem,attr,value){

EFK教程(3) - ElasticSearch多实例部署

基于ElasticSearch多实例架构,实现资源合理分配.冷热数据分离 作者:"发颠的小狼",欢迎转载与投稿 目录 ? 用途? 架构? 192.168.1.51 elasticsearch-data部署双实例? 192.168.1.52 elasticsearch-data部署双实例? 192.168.1.53 elasticsearch-data部署双实例? 测试 用途 前情提要: ? 在第一篇<EFK教程 - 快速入门指南>中,阐述了EFK的安装部署,其中ES的架构为

Yii源码阅读笔记(三十三)

ServiceLocator,服务定位类,用于yii2中的依赖注入,通过以ID为索引的方式缓存服务或则组件的实例来定位服务或者组件: 1 namespace yii\di; 2 3 use Yii; 4 use Closure; 5 use yii\base\Component; 6 use yii\base\InvalidConfigException; 7 8 /** 9 * ServiceLocator implements a [service locator](http://en.wi

整理大型网站架构必知必会的几个服务器知识

最近看书及系统开发部署过程中的一些心得,再对照自己之前的从业经验,很多都是听闻而已,当然也有一些已经很熟悉,有的正在搞,有的未来希望可以着手付诸实施,留此存照. 1.负载均衡服务器 负载均衡服务器主要作用是实现某些类型服务器的规模扩展.比如对于系统前端的web服务器和后端的数据库服务器,想通过加服务器实现N+1横向扩展,通过多台服务器负载分担压力,负载均衡必不可少. 2.web服务器 最常见,内存要求不是很高但cpu要求较高,主要用于部署各种web应用,如带界面的web页面.不带界面的web服务

js仿百度文库文档上传页面的分类选择器_第二版

仿百度文库文档上传页面的多级联动分类选择器第二版,支持在一个页面同时使用多个分类选择器: 此版本把HTML,CSS,以及图片都封装到"category.js"中,解决因文件路径找不到样式及图片的问题: 源码下载地址:http://download.csdn.net/detail/testcs_dn/7290577 初始状态,一个页面使用两个,可以初始化之前选中的分类: 选择状态: 当选中一个分类后,会触发"onChange"事件,如上图中的"您选择的分类编

常见的网站服务器架构有哪些?

1. 初始阶段的网站架构 一般来讲,大型网站都是从小型网站发展而来,一开始的架构都比较简单,随着业务复杂和用户量的激增,才开始做很多架构上的改进.当它还是小型网站的时候,没有太多访客,一般来讲只需要一台服务器就够了,这时应用程序.数据库.文件等所有资源都在一台服务器上,网站架构如下图所示: 2. 应用服务和数据服务分离 随着网站业务的发展和用户量的增加,一台服务器就无法再满足需求了.大量用户访问导致访问速度越来越慢,而逐渐增加的数据也会导致存储空间不足.这时就需要将应用和数据分离,应用和数据分离

两年保存的网页标签分享

下载地址:http://download.csdn.net/detail/tianma630/8838973 谷歌搜索引擎_香港www.google.com.hk打不开就用谷粉搜搜 --上不了google就上这个 揭开Javascript属性constructor/prototype的底层原理 - 一个执着的程序员 - 博客频道 - CSDN.NET --看完应该能理解js的对象.函数.原型.构造函数的广西 创建版本库 - 廖雪峰的官方网站 --学习github Node入门 ? 一本全面的No

vpp接口数据结构

dpdk_device_t 字段描述 lockp 发送队列锁,当发送队列个数少于线程个数时往port发包需要加锁,lockp是一个数组,每个元素对应一个发送队列,即每个发送队列一把锁 device_index 为port分配的index,每个port一个 vlib_hw_if_index 该port对应的hw结构的索引 vlib_sw_if_index 该port对应的sw结构的索引 per_interface_next_index 通过插件设置的下一个节点的index,如果没有设置该字段,默认