Day4

Tab栏封装函数:

多个Tab栏的函数封装:
 <script>
        window.onload = function(){
            //要想多个盒子不相互影响 ,我们可以通过id 给他们分开
            //封装tab栏切换函数
            function tab(obj){
                var target = document.getElementById(obj);
                var spans = target.getElementsByTagName("span");
                var lis = target.getElementsByTagName("li");
                for(var i=0;i<spans.length;i++)
                {
                    spans[i].index = i;
                    spans[i].onmouseover = function(){
                        for(var j=0; j<spans.length;j++)
                        {
                            spans[j].className = "";
                            lis[j].className = "";
                        }
                        this.className = "current";
                        lis[this.index].className = "show";
                    }
                }
            }
            tab("one");
            tab("two");
            tab("three");
         }
    </script>

 

注: onchange 事件:

  当域内容发生改变时触发事件.

小结:

  主要运用了对象的自定义属性获取并赋值索引号(obj.index = i) 以及排他思想和函数传参的特点进行的,

 

解读多个tab栏中封装函数具体实现流程:

首先创建函数进行封装,声明形参获取ID变量(var target = document.getElementById(id);),以便为下面的变量提供需要改变类别的相关内容(如:属性,具体内容等),接着获取某个类别的标签元素,(如:span,li等.),然后再通过target形参的某个对象进行指定某个类别中的span,li等.接着跟之前的tab切换和排他思想 对象的自定义属性值用以对当前对象的className进行赋值,最后调用函数给予某类对象参数.

 

三个循环:

1 for(){...;}  

2

    var i = 0;

    while(表达式){

  ...;

  i++;

}

3 do(...;){

         表达式;

      i++;

}


obj = 值; switch: switch(值){ case “值1”: 代码.. break; case “值2”: 代码.. break; case “值3”: 代码.. break; default: 代码.. break; }

 

下拉菜单选项改变背景:

  知识点: switch的应用  

  回顾代码:

var sele = document.getElementById(“seleObj”);
sele.onchange = function(){
switch(this.value){  //以获取当前的value值进行对case匹配

case “1”:
           document.body.style.backgroundImage = “url(xx.jpg)”;
           break;

case “2”:
          document.body.style.backgroundImage = “url(xx.jpg)”;
          break;

case “3”:
           document.body.style.backgroundImage = “url(xx.jpg)”;
           break;

case “4”:
           document.body.style.backgroundImage = “url(xx.jpg)”;
           break;
           }
}

 

 

 

星座运势:

关键点:

  1 obj.index = 值;

  2 this.value 以及 this.value 对position 和 width的计算和使用的小细节.[ “0 ”+ (this.value * -平均值) + “px” ]

  3 原有逻辑代码简化的函数封装.

  4 数组的应用.

  5 默认显示第一个的相应内容.

 

数组的添\删常用方法:

添加:

  push():给数组末尾加入新值并返回新长度.

 

 注意:

      var arr = [1,2,3,4];

      console.log(arr.push(8));     结果是  5      返回改数组的长度

      如果这么写:

      var arr = [1,2,3,4];

      arr.push(8);

      console.log(arr);      结果 就是  [1,2,3,4,8]

 

 

unshift():给数组最前加入新值并返回新长度.

 

 

 

删除:

pop(): 删除数组最后一个加入新值并返回最后一个值.

 

注意:

var arr = [1,2,3,4,5,6,12];

      console.log(arr.pop());     结果是 12  返回最后一个元素

      var arr = [1,2,3,4];

      arr.pop(); //删除最后一个元素

      console.log(arr);      结果 就是  [1,2,3]

 

 

shift():删除数组第一个值并返回第一个值.

 

concat ():

  两个数组合并:  var arr1 = [1,2,3]  var arr2 = [‘a’,’b’,’c’]

  用法: arr1.concat(arr2);   得到 [1,2,3,’a’,’b’,’c’];

 

join(): 数组转换为字符串

 

语法:

  arrayObject.join(separator)  //分隔符

  数组名.join(符号)

  参数 separator 可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

  var arr = [1,2,3];

  console.log(arr.join(“-”))    结果就是:  1-2-3    字符串

 

例:

 var  arr = [1,2,3,4];

   var test = arr.join(“-”);

   console.log(test)    1-2-3-4

   var arr = [1,2,3,4];

   arr.join(“*”);

   console.log(arr);      [1,2,3,4]  

 

 

split():

  把字符串转换为数组.

语法:

  stringObject.split(separator,howmany) //多少

参数 separator 可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

 

例:

  var  txt = “1-2-3”;

    var  test = txt.split(“-”)

    console.log(test)     [“1”,”2”,”3”];

 

DOM:

  分为三个部分:

    1 ECMAscript 欧洲计算机制造商协会

      制定js操作节点的规范.描述了JS的语法和基本对象。

    2 DOMdocument object modle 文档对象模型

      访问节点的对象模型

    3 BOMbrowser object modle浏览器对象模型

      与浏览器交互的方法和接口

 

DOM 定义:

  DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.

  目的就是为了让JS操作HTML元素制定的一个规范.

节点\访问节点:

就是访问结构中的元素. 如:  标签  标记  元素,  都是 节点.

  整个文档就是一个文档节点。

  而每一个HMTL标签都是一个元素节点。标签中的文字则是文字节点。标签的属性是属性节点。一切都是节点……

 

几个访问节点 :

  getElementById()    id 访问节点

  getElementsByTagName()      标签访问节点

  getElementsByClassName() 类名    有兼容性问题

  主流浏览器支持     ie 678      不认识   

 

封装自己的class类:

场景:

  在于体现出使用多个相同样式的classname类名中,方便对这个类别进行统一更改,有非常好的维护性,复用性等..

 

回顾:

  //第一种支持该语句的方式直接返回classname

  if(document.getElememntByClassName){

    return document.getElementByClassName(classname);

}

 

//第二种不支持上段代码条件的解决方案,针对IE浏览器

 

//创建后续需要存储的数组容器

  var arr = [];

 

//获取文档内所有的标签元素用于过滤符合条件的

  var dom = document.getElementsByTagName(“*”);

 

//遍历文档所有的元素以获取符合条件的

  for(var i = 0;i<dom.length;i++){

 

//声明一个类似数组的变量用于对获取到的元素进行分割(为排出两个及两个以上的类名包含该classname)

  var txtarr = dom[i].className.split(“ ”);

 

注:该语句是为了文档内所有标签的className(类名)进行” ”的分割,支持分割符的则存储到txtarr,所以这里的txtarr类似于数组容器

 

//再进行对txtarr数组内的元素进行遍历以获取最终符合条件(classname的那个标签)

  for(var j = 0; j<txtarr.length;j++){

 

//判断该数组内的元素是否等于传参的那个对象,符合则把该元素类名的那个标签存储到arr的数组中.

  if(txtarr[j] == classname){

 

//最关键的地方:这里是满足符合classname 的这个条件的标签元素存储到arr数组中,而不是classname!!

  arr.push(dom[i]);

    }

     }

 }

return arr;

后续再进行对该存储的数组进行操作.

 

源代码:

  

<script>
	window.onload = function(){
		function getClass(classname){
			//如果浏览器支持则直接返回
			if (document.getElementsByClassName) {
				return document.getElementsByClassName(classname);
			}

			//创建存放元素的盒子
			var arr =[];

			//获取所有标签用于判断标签内是否含有classname
			var dom = document.getElementByTagName("*");

			//遍历文档内所有元素
			for(var i = 0;i<dom.length;i++)
			{
				//分割类名并转换为数组
				var txtarr = dom[i].className.split(" ");
				//遍历通过类名分割的数组
				for(var j=0;j<txtarr.length;j++)
				{
					if (txtarr[j] == classname) 
					{
						arr.push(dom[i]); //为什么是i? 因为i是该类名的盒子(div)
					}
				}
			}

			return arr;
		}
}

访问关系:

 

 

父节点:

  parentNode      最大的  亲的

  某个元素.parentNode.style.backgroundColor = “#333”;

 

兄弟节点:

  nextSibling          下一个兄弟  IE678  认识

  nextElementSibling       其他浏览器认识

  previousSibling       上一个兄弟

  previousElemetSibling  其他浏览器认识

  要兼容可写成:

    obj.previousSibling || obj.previousElementSibling

 

子节点:

  firstChild       第一个孩子        IE678

  firstElementChild  第一个孩子       正常浏览器

 

  lastChild        最后一个孩子    IE678

  lastElementChild    最后一个孩子    正常浏览器

 

孩子节点:

  childNodes:选出全部的孩子

  它是标准属性,返回指定元素的子元素集合,包括HTML节点,所有属性,文本节点

  火狐和谷歌等高版本浏览器会把注释也解析为子节点

例:

<ul>

  <li>123</li>

  <li>123</li>    //这里有七个节点

  <li>123</li>

</ul>

  利用nodeType == 1 时才是节点,来获取元素节点,标签

ps:

  nodeType == 1 元素节点

  nodeType == 2 属性节点

  nodeType == 3 文本节点

 <a href =”xxxxx”> 文本  </a>

<a>: 元素节点   href: 属性节点  文本:  文本节点

解决换行符被解析为节点的方法:

<ul id="ul">    
	<li>123</li>    
	<li>123</li>    
	<li>123</li>
</ul>
<script>    
	var ul = document.getElementById("ul");    
	var childrens = ul.childNodes;  // 选择全部的孩子  亲的    		
	//alert(childrens.length);    
	for(var i=0;i<childrens.length;i++){        
		if(childrens[i].nodeType == 1){
	            childrens[i].style.backgroundColor="pink";       
	 }
    }
</script>

 

 

 

children:

  (重要) 选取所有的孩子(只有元素节点)

  这个更合适,但是IE678包含注释节点,需要避开, 使用nodeType == 1 解决

 

DOM节点操作:

  新建 插入 删除 克隆 等.

 

创建节点:

  var somevalue = document.creatElement(“somenode”);

    生成一个新的元素节点,

插入节点:

  创建完的节点必须要插入使用才有效!

  1: appendChild( ); 添加孩子,

  2: insertBefore(插入的节点, 参照节点 ); 子节点,添加孩子

例:

  demo.insertBefore(test,childrens[0]); //放到第一个孩子的前面

  demo.insertBefore(test,null);

  如果参照的节点为null 那么这个新添加的节点则放到孩子的最后面,

 

删除节点:

  removeChild(); 孩子节点

例:

  var da = document.getElementById(“xiongda”);

  demo.removeChild(da);

 

克隆节点:

  cloneNode();

  复制节点

  里面可跟参数, 如果是true 则深层复制, 复制本身并复制子节点,

        如果是false 则浅层赋值,则只复制本身不复制子节点.

posted @ 2016-08-05 23:29  宁谧  阅读(199)  评论(0)    收藏  举报