JS基础

第一部分 js基础

一、           定义变量

var 变量名;
 使用typeof 运算符判断变量的类型。

二、           输出

(1)       window.alert();主要用于做代码的调试。

(2)       document.write();在页面中输出内容,它可以输出html标记。

(3)       console.log();控制台输出,主要用于做代码的调试。

三、           程序的流程控制

1、  if语句

2、  if…else语句

3、  if..elseif …..else语句。

练习:输入一个成绩,求其等级。

<script type="text/javascript">

             var a=window.prompt('输入一个成绩',60);

             if(a>100||a<0){

                  alert('成绩不合法');

             }else{

                  if(a>=90){

                      alert('优秀');

                  }else if(a>=80){

                      alert('良好');

                  }else if(a>=70){

                      alert('中等');

                  }else if(a>=60){

                      alert('及格');

                  }else{

                      console.log('张三<br/>');

                      document.write('<b style="color:red;">不及格</b>');

                  }

             }

         </script>

 

练习:输入两个数,和一个运算符,求四则运算(+ - * /),并输出结果。

<script type="text/javascript">

           var a=prompt('请输入第一个数','');

           a=parseInt(a);

           var b=prompt('请输入第二个数','');

           b=parseInt(b);

           var c=prompt('请输入一个运算符','');

           if(c=='+'){

                alert(a+b);

           }else if(c=='-'){

               alert(a-b);

           }else if(c=="+"){

               alert(a*b);

           }else{

               alert(a/b);

           }

          

         </script>

4、  多分支选择语句switch

格式:

Switch(表达式){

  Case 常量:语句break;

  Case 常量:语句 break;

  …

  Default:

    语句n

}

练习:输入一个成绩,求其等级。

<script type="text/javascript">

           var  a=prompt('输入成绩',0);

           a=parseInt(a/10);//转换到0-10之间的数。

           switch(a){

               case 10:

               case 9:alert('优秀');break;

               case 8:alert('良好');break;

               case 7:alert('中等');break;

               case 6:alert('及格');break;

               default:

                   alert('不及格');

           }

         </script>

5循环结构

(1)       while(条件){

   循环语句

   应该有使循环趋于结束的语句、i++

(2)       do{

   循环体

}while(条件);

(3)       for(1;2;3){

   循环体

}

如:

 

For(;;){

}

While循环 1+2+3+。。。+100

<script type="text/javascript">

             var sum=0;//定义一个变量存储和

             var i=1;

             while(i<=100){

                 sum=sum+i;//sum存储中间结果也存储最终结果。

                 i++;

             }

             alert('sum='+sum);

             /*

              (1)sum=0 i=1 i<=100? sum=0+1;i=2

              (2)i=2 i<=100? sum=0+1+2

              0+1+2+3+4+5+6

              * */

         </script>

for循环 1+2+3+。。。+100

<script type="text/javascript">

        var sum=0;

        for(var i=0;i<=100;i++)

        {

             sum=sum+i;

        }

        alert(sum);

         </script>

第二部分  js的高级部分

一、函数

1、定义也叫方法 它可以完成一个功能。类似于封装。它的好处是定一次,可以反复调用。

2、如何定义函数

function 函数名(参数){

         函数体;

}

说明:

(1)函数名要符合标识符的命名规则(字母、数字、下划线和$符号)如:

function $(){

}//在jquery 中$(‘#one’)

(2)函数名后手圆括号不能省,括号中是参数,可以有,也可以没有,如果没有参数就叫无参函数,如果有,就叫有参函数。如:

function print(){//无参函数

    alert(‘hello funtion’);

}

function sum(a,b){//有参函数

    alert(a+b);

}

说明:在定义函数时,函数的形式参数在定义时不能指定var 关键字。

3、函数的调用

函数名(实际参数);函数不调用,是不会执行的。

4、函数的返回值 return

在一个函数内部可以有,也可以没有return语句,可以有一个,也可以有多个,但遇到第一个return语句,函数就不再往下执行了。有没有return语句,取决于我们是不是要用这个返回值做其它的运算,如果用必须有return.

练习:定义一个函数,求1+2+…..+n的和。N自行输入。

function sum(n){

                 var total=0;

                 for(var i=0;i<=n;i++){

                      total+=i;

                 }

                 return total;

             }

             var n=prompt('请输一个数n',0);

//         var c=sum(n);

//         alert(c);

             alert(sum(n));

说明:在函数定义时,不会为形式参数分配存储空间,只有发生函数调用时,才会为形参分配空间,而且当函数调用结束,形参自动释放掉。在函数调用时传递实参给形参,如果实参是普通变量,改变形参的值不会改变实参的值。

5、函数的嵌套调用,它是指在调用一个函数的过程,又调用了其它的函数。

练习:

<script type="text/javascript">

             function test1(a,b){

                 alert(a+b+test2(a,b));

             }

             function test2(x,y){

                 return x-y;

             }

             test1(3,4);

         </script>

6、递归调用,在调用一个函数的过程中又直接或间接调用自己。

练习:求5!1*2*3*4*5; 1的阶乘。

var t=1;//存储阶乘的结果

             function test(n){

                 if(n==1){

                     return 1;

                 }else{

                      t=n*test(n-1);

                 }

                 return t;

             }

7、回调函数,是指在调用一个函数的过程,使用一个函数作为参数,并且在调用的过程中回调了作为参数的函数。这里会使用匿名函数,匿名函数用于回调函数中使用。那么回调用函数通常用于js的事件处理中。

<script>

             //函数名是什么东西?

             /*function fun(){

                 alert('test');

             }

             alert(fun);

             结论:函数名代表整个函数的定义

             */

             //函数名可不可以做为函数的参数使用

             /*function fun1(a,b,fun){

                 alert(fun);

             }

             function fun2(){

                 alert('fun2');

             }

             fun1(3,4,fun2);

             结论:函数名可以作为函数的参数使用是可以的。

             * */

             /*function fun1(a,b,fun){

                 alert(fun);

             }

             function fun2(){alert('fun2');}

             fun1(3,4,function fun2(){

                          alert('fun2');

                      }

             );

             结论:把整个函数定义作为参数使用是可以的

             * */

             function fun1(a,b,fun){

                 fun(a,b);

             }

             fun1(3,4,function(x,y){

                 alert()

             });

         </script>

8、函数定义的另一种形式

  var 变量名=function(){

     函数体;

}

//函数定义的另一种形式

             var test=function(){

                 alert('ok');

             }

                 test();

注意:此时变量名,就相当于函数名。

作业:定义一个函数,实现以下功能:

1.求一个输入区间如:1-100,输出这个区间能被3整除的数。

2.求一个输入区间如:-100-100,输出这个区间的所有负数

要求用回调函数实现。

<script type="text/javascript">

             //定义的函数它可以取出能被3整除的数

            function ys(start,end,fun){

                 for(var i=start;i<=end;i++){

                      if(fun(i)){

                          document.write(i+"<br/>");

                      }

                 }

             }

             ys(1,100,function(num){

                 if(num%3==0){

                      return true;

                 }else{

                      return false;

                 }

             });

             ys(-100,100,function(num){

                 if(num<0){

                      return true;

                 }else{

                      return false;

                 }

             });

         </script>

9、自调用函数,就是自己调用自己。

格式:

(function(形参列表){

函数体

})(实参列表);

(function(x,y){

                 alert(x+y);

})(3,5);

10、全局变量和局部变量

全局变量:不是定义在函数内部的变量,就是全局变量,它的生命周期是从定义的位置开始到程序结束。

局部变量,一般就是定义在函数内部的变量。

var num=5;

             function test(){

                 var num=8;

             }

             test();

alert(num);

11、函数的参数数组。Arguments,在调用函数时,在被调用的函数中隐藏着一个数组arguments,它用来存储函数调用时,传递过来的参数。

function fun(){

                 //alert('ok');

                 //alert(arguments[3]);

                 for(var i=0,sum=0;i<arguments.length;i++){

                      sum+=arguments[i];

                 }

                 alert(sum);

             }

             fun(1,3,5);

二、数组

1、为什么要使用数组?数组元素的值是无规律的,而数组的下标是有规律。

2、如何定义数组?

(1)字面量定义形式  var a=[];a是数组名,[]是用于存储数组元素的,在js中数组不需要指定大小。数组元素可以是任意类型的(包括对象类型)。

(2)使用构造函数定义数组 格式:

  var 数组名=new Array();

var a=[

                 {

                      name:'张三',

                      age:10

                 },

                 {

                      name:'李四',

                      age:20

                 }

             ];

             alert(a[0].name);

 

在定义数组时,直接赋值。

var arr=new Array(1,3,5,7,9);

         alert(arr[3]);

当只指构造函数指定一个值时,不是表示一个数组元素,而是表示数组的大小。

var arr=new Array(2);

             alert(arr[0]);

3、数组元素的引用

使用下标的方式引用数组元素,注意:数组下标是从0开始的。

4、数组名代表什么?

ar arr=new Array(1,3,5,7,9);

             alert(arr);

通过数组名,可以输出全部的数组元素。

5、使用数组作为函数的参数进行传递

var a=[1,3,5,7,9];

             function fun(b){

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

                      b[i]+=1;

                 }

             }

             fun(a);

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

                     document.write(a[i]+"<br/>");

             }

6、数组常用的属性和方法

(1)length属性,用于获取数组的长度。

(2)push(x),它是向数组中最后的位置添加数组元素x。返回数组的大小。

(3)pop();删除数组中的最后一个元素。

(4)unshift(x),作用是向数组开头添加x元素。

(5)shift(),作用是删除数组中的第一个元素。

练习:定义一个数组arr,里面包含5个数分别是42,58,93,79,85,求出数组中的最大值,最小值和平均值。

var a=[42,58,93,79,85];

             var max=a[0];

             var min=a[0];

             var sum=0,avg=0;

             a.push(50,40,30,100,9);

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

                 if(max<a[i]){

                      max=a[i];

                 }

                 if(min>a[i]){

                      min=a[i];

                 }

                 sum+=a[i];

             }

             avg=sum/a.length;

            document.write('max='+max+"<br/>");

            document.write('min='+min+"<br/>");

             document.write('avg='+avg);

二、js面向对象编程

澄清一个问题,js中不存在类的概念。在js中实质上叫原型对象。但是为了统一在js中也都称为类和对象。

1、什么是类?类实质上就是一个模版,所有的对象都参照类来进行创建。

2、什么是对象?对象是依据类模版来创建的一个具体实例。

3、什么是属性?它是用于描述对象特征的。如人的身高、体重、身份证号等等。

4、什么是方法?是类或对象具有的行为动作。

5、如何创建类 格式:

function 类名称(参数){

   成员属性

成员方法

}

说明:

(1)在js中定义的类和函数方式相同,但是类名称在写书写是要大写,用于区分函数。

(2)参数是用于创建对象时使用的,主要是给成员属性赋值。

(3)成员属性,是用于描述对象特征的,它也分为公有属性和私有属性。

(4)成员方法,是用于描述对象的行为动作的,它也分为公有方法和私有方法。

6、如何创建对象?格式:

(1)var 对象名=new 类名称();

function Cat(){

var name='小白';

var age='5';

}

var cat=new Cat();

alert(typeof cat);

注意:在类内部,通过var关键字定义的成员属性,它实质上是私有属性,不能被外界直接访问。

(2)var 对象名=new Object();不用创建类,直接使用Object祖先类,直接创建对象。

7、成员属性

(1)在定义类时,在类内部直接定义成员属性,它是私有的。

(2)先创建类,再创建对象,动态为类添加成员属性。但是动态添加的成员属性只用于当前对象。

(3)成员属性的引用:

对象名.属性名和对象名[“属性名”]

注意:在js中通过对象名[“属性名”]引用属性的方式,很有实际用处,在js处理css样式属性时会使用。

(4)this关键字,代表当前对象,在js中通过this关键可以实现将成员属性公有化。此外,this在方法调用中也非常有用,这时this通常代表调用方法的对象。谁调用了该方法this就代表谁。

(5)通过工厂方法访问私有属性,格式:

function 类名称(参数){

  Var 对象名=new Object();

  对象名.动态属性=属性值;

  对象名.动态属性=属性值;

  return 对象名;

}

创建对象,var 对象名=new 类名称(参数);

工厂方法也是解决在类外部访问私有属性的一种方法。

8、为对象添加成员方法

(1)在定义类时,也可以直接添加成员方法,但是它是私有的。

function Person(name,age){

                 this.name=name;

                 this.age=age;

                 function study(){

                      alert('I can study');

                 }

             }

             var p=new Person('张三',25);

             p.study();//私有方法,无法访问

(2)为类对象动态添加成员方法。

第一种,先定义成员方法(函数),然后为类对象指定成员方法。

先定义函数

function 函数名(){

}

再创建对象并指定成员方法

var 对象名=new 类名();

对象名.成员方法名=函数名;

通过对象名.成员方法名()的方法调用函数,就实现了为类对象动态添加成员方法。

function Person(name,age){

                 this.name=name;

                 this.age=age;

             }

             var p=new Person('张三',25);

             function study(){

                 alert('我不学习,就挂科了!');

             }

             p.action=study;

             p.action();

 

第二种:直接将一个匿名函数的定义赋值给成员方法。

对象名.成员方法名=function(){

   函数体

}

function Person(name,age){

                 this.name=name;

                 this.age=age;

             }

             var p=new Person('张三',25);

             p.action=function(){

                 alert('我不学习,就挂科了!');

             }

             p.action();

注意:动态添加成员方法,只针对当前对象是有效的。其它对象无效。

(3)为类对象添加公有方法

function 类名(){

  成员属性

  this.成员方法=function(){

 

}

}

但是,通过以上方式添加的公有方法,存在问题。

alert(p.speak==p2.speak);

系统为每个对象的speak方法都分配一个内存空间。浪费内存。

(4)通过prototype指定公有方法,可以解决内存浪费的问题。格式:

类名称.prototype.成员方法名=function(){}

练习:

定义一个Student类,该学生类的对象具有以下功能:

1.定义一个方法speak,,可以输出显示“我是学生,职责就是学习”。

2.定义一个方法sum,可以完成求1-100的和。

3.定义一个add方法,实现输入两个数,求a+b的和。

function Student(){

                 this.sum=function(){

                      for(var i=1,sum=0;i<=100;i++){

                          sum+=i;

                      }

                      alert('sum='+sum);

                 }

             }

             var stu=new Student();

             stu.speak=function(){

                 alert('学习吧,再不学习,就找不到工作啦!');

             }

            Student.prototype.add=function(a,b){

                 alert("a+b="+(a+b));

             }

             stu.speak();

             stu.sum();

             stu.add(3,4);

9、创建对象常用形式

var 对象名={

属性:属性值,

属性:属性值,

…..,

run:function(参数){

}

}

说明:此种表现形式在ajax和json 中经常遇到。属性与属性值使用冒号分隔,多个属性之间使用逗号分隔。最后一个属性或方法后不需要添加逗号。

var p={

                 name:'tom',

                 age:8,

                 run:function(){

                      alert('I can run');

                 }

             };

             alert(p.name);

                 p.run();

三、js中的内部类

1、分类:分为动态内部类和静态内部类。

静态内部类:对象不需要new关键字创建,直接使用类名称就可以。Math对象

动态内部类:必须使用new 关键字创建对象。Date对象。

2、Array、Date、String、Math

(1) Math

属性:

PI:获取圆周率的值。alert(Math.PI);

方法:

abs(x):求x的绝对值

ceil(x):返回大于x的最小整数。

var a=3.14;

      alert(Math.ceil(a));

floor(x):返回小于x的最大整数

var a=3.56;

             alert(Math.floor(a));

round(x):返回四舍五入之后的x值。

var a=3.12;

         alert(Math.round(a));

random():返回17位随机小数,小数范围是在0-1之间,但不包含0和1。

练习:

产生1-10之间的随机整数

产生5-10之间的随机整数

alert(Math.ceil(Math.random()*10));

alert(Math.round(Math.random()*5)+5);

alert(Math.round(Math.random()*5+5));

alert(Math.floor(Math.random()*6)+5);

(2) Date 用于获取日期和时间,它是一个动态内部类。

    var 时期对象=new Date();

常用的方法

toLocaleString();将日期时间转换为本日期和时间。

getYear();获取年份

getFullYear();获取四位完整年份。

getMonth();获取月份。从0-11表示12个月。

getDate();获取月天数。

getDay();获取星期,从0-6表示周一到周六

getHours();获取小时数

getMinutes();获取分钟数

getSeconds();获取秒数。

getMilliSeconds();获取毫秒数。

练习:动态在页面显示年月日时分秒及问侯语

如:

2018年10月15日 星期一11:21:30 中午好

5:00-7:00  早上好

7:01-11:30  上午好

11:31-14:30 中午好

14:31-16:30 下午好

16:31-18:30 傍晚好

18:31-11:59晚上好

12:00-4:59凌晨好

window.setInterval(程序代码,时间间隔);时间间隔函数

含义是:每隔指定的时间间隔,执行一次程序代码。时间间隔是以毫秒为单位,1000ms=1s.

(3)String 动态内部类。

var str=”hello”;

var str1=new String(“hello”);

属性:

length:获取字符串的长度。所以字符串本身就相当于一个数组。

方法:

str.split(‘分隔符’);按照指定的分隔符将字符串拆分成字符数组。

ar str1=new String('wor,ld');

             var a=str1.split(',');

             alert(a[1]);

str.indexOf(字符串,起始位置);作用是查找指定字符串在str中首次出现的位置。

         str.substr(起始位置,长度);是在str字符串指定起始位置开始,截取指定长度的字符串。

var str="hello world";

      alert(str.substr(0,3));

   str.substring(起始位置,结束位置);在str字符串中,从起始位置开始截取到结束位置之前的字符串。

第三部分BOM和DOM

一、BOM :Browser Object Model

BOM主要讲解的是Document对象和Window对象

1、window对象,它是一个全局对象。

function test(){

                  alert(this.name);

                  alert(window.name);

             }

             var name='tom';

             window.test();

2、window对象常用方法和属性

(1)window.alert(字符串);弹窗显示文本

(2)window.prompt(提示文本,默认值);提示用户输入。

(3)window.confirm(提示文字);确认框

(4)window.open(打开的文件,文件名称,窗口属性);

(5)window.setTimeout(程序代码,时间);延迟函数,表示延迟一定的时间后去执行程序代码.时间以毫秒为单位.但setTimout只执行一次.

练习:

先显示当前时间,再显示5秒钟后的时间.

<script type="text/javascript">

             var time=document.querySelector('#time');

             var date=new Date();//取当前时间

            time.innerHTML=date.getHours()+':'

                            +date.getMinutes()

                            +':'+date.getSeconds();

             window.setTimeout(function(){

                 var date=new Date();//取当前时间

                 time.innerHTML+=date.getHours()+':'

                            +date.getMinutes()

                            +':'+date.getSeconds();

             },5000);

         </script>

(6)clearTimeout(id值);清除setTimeout返回的id值.使setTimeout方法失效.

(7)setInterval(程序代码,时间);时间间隔函数.

  clearInterval(id值); 清除setInterval返回的id值.使setInterval方法失效.

练习:倒计时

<p>距离活动结束时间还有:</p>

        <p id="show"></p>

        <button id="btnShow">显示倒计时</button>

        <button id="btnClear">取消倒计时</button>

        <script type="text/javascript">

            //获取在js中要使用的html元素

            var btnShow=document.querySelector('#btnShow');

            var btnClear=document.querySelector('#btnClear');

            var pShow=document.querySelector('#show');

            var i=0;

            //为显示按钮添加时间

            btnShow.onclick=function(){

                 i=setInterval(function(){

                     //设置目标时间

                     var setTime=new Date('2018/11/11 00:00:00');

                     //获取当前时间

                     var nowTime=new Date();

                     //获取差值以毫秒位单位

                     var restTime=setTime.getTime()-nowTime.getTime();

                     var day=Math.floor(restTime/1000/60/60/24);//获取天数

                     var hour=Math.floor(restTime/1000/60/60%24);//获取小时数

                     var min=Math.floor(restTime/1000/60%60);//获取分钟数

                     var sec=Math.floor(restTime/1000%60);//获取秒数

                     restTime=day+'天'+hour+'小时'+min+'分钟'+sec+'秒'

                     pShow.innerHTML=restTime;

                },1000);

            }

            btnClear.onclick=function(){

                clearInterval(i);

             }

</script>

二、事件处理

1、事件

(1)事件分类

窗体事件:

  • onload加载事件
  • onunload关闭事件
  • onbeforeunload 关闭之前一般用于刷新操作

鼠标事件

  • onclick单击事件
  • ondblclick双击事件
  • onmousedown 鼠标按下事件
  • onmouseover 鼠标经过事件 
  • onmouseout  鼠标移出事件
  • onmousemove 鼠标移动事件
  • onouseup 鼠标按键抬事件。

键盘事件

  • onkeydown  键盘按下事件
  • onkeypress  键盘按下并松开事件
  • onkeyup    键盘按键抬起事件

其它事件

  • onchange   元素内容改变触发的事件
  • onfocus     元素获得焦点事件。
  • onblur      失去焦点事件
  • onscorll    滚动滚动事件
  • onmousewheel  鼠标滚轮滚动事件

声明:on实质叫前缀,on后的关键字才是事件名称。

2、如何为元素点添加事件

(1)直接在html标记中添加事件

<标记  事件名=”事件处理程序”></标记>

缺点:没有实现js代码和html代码分离。

(2)直接在html标记中添加事件,事件处理程序写在一个函数中。

<标记  事件名=”函数名()”></标记>

说明:以上两种方式都没有真正实现js代码和html代码分离。

(3)直接在js中获取html结点对象。动态添加事件

格式 :

结点对象.事件名=function(){

}

此种情况还有一种表现形式:

结点对象.事件名=函数名;

(4)第三种添加事件的方式在有些特殊操作会出现递归死锁现象。所以还有一种W3C的标准形式。

格式:

结点对象.addEventListener(‘事件名’,事件处理程序,是否冒泡);

说明:

事件名,不能包含on关键字。

事件处理程序,是一个匿名函数,用于完成事件触发时具体功能。

是否冒泡,非IE浏览器本身就不支持冒泡。只有IE支持。冒泡指的含义是:在前元素上产生的事件是否向其父元素传递。所以这个值一般就是false.

3、事件处理对象event,当一个事件产生时,会有一个事件处理对象记录事件所包含基本信息。

(1)关于兼容的问题

在事件处发时,都会产生一个event对象。但是在调用事件处理程序时,非IE浏览器会传递一个事件对象给函数。而IE浏览器,不会传递事件对象。因为它是IE的全局对象,直接通过window.event使用就可以了。

btn.onclick=function(evt){

                 var e=evt||window.event;

             }

IE11不用考虑兼容的问题。

(2)clientX和clientY,用来获取鼠标相对于浏览器窗口左上角的坐标点。它是event对象的属性。

<div id="mydiv"

          style="width:50px;height:50px;background:red;

                 position:absolute; left:10px;

                 top:0px;"

               

        > 

        </div>

        <script type="text/javascript">

             document.onc=function(evt){

                 var x=evt.clientX;

                 var y=evt.clientY;

                 var mydiv=document.getElementById('mydiv');

                 mydiv.style.left=x+'px';

                 mydiv.style.top=y+'px';

                 //console.log(mydiv.style.left);

                 //alert("x="+x+",y="+y);

             }

         </script>

(3)screenX和screenY,获取鼠标相对于屏幕窗口左上角的坐标点。它是event对象的属性。

<script type="text/javascript">

             document.onclick=function(evt){

                 var x=evt.screenX;

                 var y=evt.screenY;

                 alert("x="+x+",y="+y);

                

             }

         </script>

(4)button属性。用来获取鼠标左中右三键按键。确定你按下的是鼠标的那个键。

当button=0时,表示按下左键

当button=1时,表示按下中键

当button=2时,表示按下右键

但在IE11以下存在兼容问题。怎么解决?自己研究吧!

<script type="text/javascript">

            document.onmousedown=function(evt){

                  //var e=evt||window.event;

                  var btn=getButton(evt);

                  console.log(btn);

                  if(btn==0){

                    alert('你按的是左键');

                  }else if(btn==1){

                    alert('你按的是中键');

                  }else if(btn==2){

                    alert('你按的是右键');

                  }

                 //alert(e.button);

             }

             function getButton(evt){

                 if(evt){//代表非IE浏览器

                      return evt.button;//让IE浏览向非浏览器统一

                 }else{

                      if(window.event.button==1){

                          return 0;

                      }else if(window.event.button==4){

                          return 1;

                      }else if(window.event.button==2){

                          return 2;

                      }

                 }

             }

         </script>

(5)keyCode,它可以获取键盘的按键码即。ASCII码值。

数字键:48-57

A:65 a:97

回车键:13

空格键:32

退格键:8

向左:37

向上:38

向右:39

向下:40

  • onkeydown事件:可以获取所有的按键码,但对英文不区分大小写。
  • onkeypress事件:可以获取除功能键外的按键码,对英文区分大小写。
  • onkeyup事件:可以获取所有的按键码,但对英文不区分大小写。

<div id="mydiv"

          style="width:50px;height:50px;background:red;

position:absolute; left:10px;

top:0px;"

        </div>

        <script type="text/javascript">

             var mydiv=document.getElementById('mydiv');

             document.onkeydown=function(e){

                 var left=parseInt(mydiv.style.left);

                 var top=parseInt(mydiv.style.top);

                 switch(e.keyCode){

                      case 37:

                      left=left-10;

                      mydiv.style.left=left+'px';

                      break;

                      case 38:

                      top=top-10;

                      mydiv.style.top=top+'px';

                      break;

                      case 39:

                      left=left+10;

                      mydiv.style.left=left+'px';

                      break;

                      case 40:

                      top=top+10;

                      mydiv.style.top=top+'px';

                      break;

                 }

             }

         </script>

 

二、DOM –Document Object Model文档对象模型。

Document代表html文档

文档对象模型是按树形结构进行描述的。

   

 

 

 

 

 

 

 

 

注意:在html中,以上结构中都叫html标记,但在DOM中叫结点,具有同一个父元素的结点,叫兄弟结点。所谓的DOM就是要操作这些结点。

1、结点的分类

元素结点:所谓的元素结点就是html标记。

属性结点:所谓的属性结点就早html标记的属性。

文本结点:是指标记之间的文本内容。

空白结点:就是由于回车换行时产生的标记与标记之间的空白部分。它会对DOM操作产生影响。

2、结点的共有属性

(1)nodeName:表示结点名称。

元素结点:nodeName是标记的名称

属性结点:nodeName 就是属性名称

文本结点:nodeName=#text 标识文本结点

(2)nodeType:表示结点的类型。

元素结点:nodeType=1

属性结点:nodeType=2

文本结点:nodeType=3

(3)nodeValue:表示结点的值。

元素结点:nodeValue=null,注意元素结点nodeValue不代表标记之间的文本内容。是标记本身的值。元素结点本身就不具有nodeValue值。

属性结点:nodeValue 是元素属性的属性值。

文本结点:nodeValue 就是文本内容。

不同类型的结点的属性的值是不一样的。后面再补充讲解。

3、如何获取结点。

(1)、document.getElementById(‘id值’);在文档对象中根据元素结点的Id值,获取元素。

(2)、document.getElementsByTagName(‘标记名称’);作用是在html文档中根据标记名称获取结点,返回的是一个数组。

(3)、document.getElementsByName(‘name值’);

作用是根据标记的name属性值获取元素结点。返回的是一个数组。IE浏览认为只有表单可以具有name属性,而非表单元素不具有name属性。非IE浏览认为所有标记都可以具有name属性。所以该方法存在兼容问题

(4)、document.getElementsClassName(‘类名称’);作用是根据类名获取元素结点。返回的也是一个数组。

(5)、document.querySelector(‘xx’);获取第一个叫xx的元素结点。Id值前需要加”#”号,类名前需要加”.”

(6)、document.querySelectorAll(‘xx’);获取所有叫xx的元素结点,返回的就是一个数组。

4、元素结点的属性

id属性:可以设置或获取元素结点的id属性值。

tagName属性:可以获取html标记的名称。

相当于nodeName.

className属性:可以设置或获取类名称。

innerHTML属性:用于设置标记之前的文本内容,它也支持html标记作为文本内容。但不会显示,而是将html标记解析显示了。

innerText属性:用于设置标记之前的文本内容,但不会对html标记进行解析。

Style属性:它可以设置或获取行内样式属性。主要作用是操作css样式表。

5、节点的层次属性

(1)childNodes,作用是获取当前元素所有子结点。它是一个集合。可以看成是一个数组。

(2)firstChild,获取父元素的第一个孩子结点。

(3)lastChild,获取父元素的最后一个孩子结点。

(4)nextSibling,获取当前结点的下一个兄弟结点

(5)previouSibling,获取当前结点的前一个兄弟结点。

(6)parentNode,获取当前元素的父结点。

6、attributes:属性结点,获取所有的属性结点。它是一个集合。也相当于一个数组。

var mydiv=document.getElementById('mydiv');

             alert(mydiv.attributes[0].nodeValue);

(1)setAttribute(属性,属性值);设置添加属性,并指定属性值。

(2)getAttribute(属性);获取属性值。

(3)removeAttribute(属性);移除属性。

7、结点的操作

(1)创建新结点。

document.createElement(‘标记名称’);

创建的新标记,不会出现在文档中。

(2)添加新结点。向父结点的最后一个位置添加子元素。

父结点.appendChild(新结点);

(3)创建文本结点

document.createTextNode(文本)

(4)父结点.insertBefore(新结点,目标结点)是在目标结点之间插入新结点。

(5)父结点.replaceChild(新结点,原结点)作用是使用新结点替换原有的结点。

(6)当前结点.cloneNode(true|false);作用是复制结点。如果里面的参数为true则不但复制结点还复制结点中文本内容。如果为false只复结点。

(7)父结点.removeChild(节点名称);删除子结点。

三、表单操作

1、获取单选按钮选中值

<input type="radio" name="sex" value="男" />男

         <input type="radio" name="sex" value="女" />女

var sexs=document.getElementsByName('sex');

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

                 sexs[i].onclick=function(){

                      alert(this.value);

                 }

             }

 

2、制作播放按钮

<!DOCTYPE html>

<html>

    <head>

        <meta charset="UTF-8">

        <title></title>

        <style type="text/css">

             #btnPlay{

                 width:30px;

                 height:30px;

                 background:red;

                 border-radius: 50%;

                 text-align:center;

                 line-height: 30px;

                 color:#fff;

                 cursor:pointer;

             }

             .rot{

                 animation: gx 2s linear infinite;

             }

             @keyframes gx{

                 from{

                      transform:rotate(0deg);

                 }

                 to{

                      transform:rotate(360deg);

                 }

             }

        </style>

    </head>

    <body>

        <div id="btnPlay" >H</div>

        <script type="text/javascript">

             var btnPlay=document.getElementById('btnPlay');

             var flag=true;

             btnPlay.onclick=function(){

                 if(flag){

                      btnPlay.className='rot';

                      flag=false;

                 }else{

                      btnPlay.className='';

                      flag=true;

                 }

             }

        </script>

    </body>

</html>

 

3、全选操作

<!DOCTYPE html>

<html>

    <head>

        <meta charset="UTF-8">

        <title></title>

    </head>

    <body>

        <form action="">

        <input type="radio" name="sex" value="男" />男

        <input type="radio" name="sex" value="女" />女

        兴趣爱好:

        <input type="checkbox" name="hobby" id="" value="" />吃饭

        <input type="checkbox" name="hobby" id="" value="" />睡觉

        <input type="checkbox" name="hobby" id="" value="" />打豆豆

        <input type="checkbox" name="checkAll" id="checkAll" />全选

        <!--<button>全选</button>

        <button>全不选</button>-->

        </form>

        <script type="text/javascript">

             var sexs=document.getElementsByName('sex');

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

                 sexs[i].onclick=function(){

                      alert(this.value);

                 }

             }

             var checkAll=document.getElementById('checkAll');

             var hobbys=document.getElementsByName('hobby');

             checkAll.onclick=function(){

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

                      if(checkAll.checked){

                         hobbys[i].checked=true;

                      }else{

                         hobbys[i].checked=false;

                      }

                 }

                

             }

        </script>

    </body>

</html>

 

4、省市县三级联动

<!DOCTYPE html>

<html>

    <head>

        <meta charset="UTF-8">

        <title></title>

    </head>

    <body>

        省:<select id="province"></select>

        市:<select id="city"></select>

        县/区:<select id="country"></select>

        <script type="text/javascript">

             var pros=['吉林省','辽宁省','黑龙江省'];

             var citys=[

                    ['长春市','吉林市','松原市'],

                    ['沈阳市','大连市','铁岭市'],

                    ['哈尔滨市','大庆市','密山市']

             ];

             var countrys=[

                 [['朝阳区','高新区','宽城区'],['丰满区','船营区','昌邑区'],['宁江区','松原B区','长岭县']],

                 [['沈阳A区','沈阳B区','沈阳C区'],['大连A区','大连B区','大连C区'],['铁岭A区','铁岭B区','铁岭C区']],

                 [['哈尔滨A区','哈尔滨B区','哈尔滨C区'],['大庆A区','大庆B区','大庆C区'],['密山A区','密山B区','密山C区']]

             ];

             var pro=document.getElementById('province');

             var mycity=document.getElementById('city');

             var country=document.getElementById('country');

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

                 var option=document.createElement('option');

                 option.innerHTML=pros[i];

                 option.value=i;//用于记录前选择的是哪个省

                 pro.appendChild(option);

             }

             /*

              当我们选择省的时候触发onchange,让市这个select标记

              添加下拉列表选项option

              * */

             pro.onchange=function(){

                 //alert('ok');

                 mycity.innerHTML="";

                 var optVal=pro.value;//获取当前省份对应的value值。

                 var city=citys[optVal];

                 //alert(optVal);

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

                      var option=document.createElement('option');

                      option.innerHTML=city[i];

                      option.value=i;

                      mycity.appendChild(option);

                 }

             }

             mycity.onchange=function(){

                 country.innerHTML="";

                 var proVal=pro.value;//确定选择那个省。

                 var cityVal=mycity.value;//确定选择那个市

                 var con=countrys[proVal][cityVal];

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

                      var option=document.createElement('option');

                      option.innerHTML=con[i];

                      country.appendChild(option);

                 }

             }

        </script>

    </body>

</html>

1、轮播图实例

2、放大镜

知识点:DOM尺寸和位置属性

(1)offsetLeft属性和offsetTop:获取当前元素相对于父元素的left和top偏移量。

(2)offsetParent:获取当前元素的父元素。

(3)offsetWdith和offsetHeight:获取当前元素的实际宽度和高度,包含边框和内边距。

 

 

 

第二部分H5+CSS3

最实用的内容:地理位置定位、Canvas画布、操作摄头等。

主要学习h5新增的标记、属性和css3新增的选择器和css样式属性

一、h5新增的标记

1、结构标记

header:表示一个网页的头部或一个区域的头部。一般会包含标题(h1-h6)

nav:表示导航区域。

hgroup:表示标题组,如果一个区域出现两级标题,应该使用hgroup包含起来。

section:为页面或区域分块儿的。一般会包含标题。

article:表示一个独立的内容,一般是文章或评论。它也可以标题。

article和section可以嵌套使用。

aside:表示与主内容不相关的信息,通常指的就是侧边栏

footer:表示一个页面结尾或一个区域的结尾。

说明:以上这些标记和div标记在显示效果上没有差别,其实质就是div改了个名。

这些结构标记,主要是在语义为搜索引擎提供支持。

2、其它语义标记

figure:用于呈现媒体信息,一般指的图像。在使用时需要结合figcaption一起使用。

<figure>

        <img src="img/2.jpg" alt="" />

        <figcaption>巧克力</figcaption>

         </figure>

progress:表示的是进度条。

<progress min="0" max="100" value="10"></progress>

                          <script>

                              var pro=document.querySelector('progress');

                              var i=0;

                              window.setInterval(function(){

                                   pro.value=i++;

                              },1000);

                          </script>

meter:用于表示度量信息以及状态。如投票功能。

<meter min="0" max="100" value="98" low="25" high="95" optimum="20"></meter>

low、high、optimum警界状态值。

mark:以黄色底纹强调文字。

menu:菜单,目前只有火狐支持。

 

posted on 2019-02-18 20:30  WYM先生  阅读(202)  评论(0编辑  收藏  举报

导航