八、JavaScript

JavaScript

概述
  • 简称JS,由网景公司和Sun公司联合推出的一门编写前端脚本动作的编程语言;本质上与Java没有关系,是一门独立的编程语言

  • JS是一门前端的编程语言,主要用于给网页添加动作,如表单的验证、动态的请求服务器等

  • JS通常是书写在HTML页面中的指定位置,当使用浏览器运行HTML时浏览器会解析HTML中的JS代码并执行;属于解释型编译语言,JS的执行依赖于浏览器提供的JS解释器

  • 开发JS

    • 第一种编写位置:在html页面的head部分书写
    <head>
            <script type="text/javascript">
              书写JS代码的位置,单引号双引号都行,执行顺序从上到下
              //向浏览器的控制台输出内容
              console.log("HelloWorld");//调试JS常用的输出语句
              //浏览器弹窗
              //window.alert("来嘛~");
              //向浏览器页面输出内容
              document.write("成年人的世界可以用两个字概括:算了<br/>");
              document.write("不太想活,又不敢去死");
              document.write("<a href='wallhaven-q29z2l.jpg'>图片</a>")
            </script>
    </head>
    
    • 第二种编写位置:在一个 .js结尾的脚本文件中编写,然后在需要使用的HTML
    //外部文件:jq.js
    <head>
    		<!-- 引入外部的JS文件,且标签必须成对出现 -->
    		<script type="text/javascript" src="jq.js"></script>
    </head>
    
JS基础语法
  • 变量

    • 声明:JS是一门弱类型的编程语言,变量没有具体的类型,所有的变量的声明都可以使用var;JS会将所有var声明的变量提到最前面,称为声明前置

    • JS对语句末的分号不是特别敏感,会自动检测与下一条语句匹配

    • 赋值:赋值不提前,还在原来位置

      <script type="text/javascript">
              {
                //局部变量声明,用let声明;var声明但变量都是全局变量
                let a = 10;
              }
              //书写JS代码
              //声明
              var a;
              var a=100,b,c,d;
              //赋值
              b = 20;
              //一个变量声明但没有赋值,输出为undefined
              console.log(a,b,c,d);
              //声明并赋值
              var s=d=f=200;
              console.log(s,d,f);
              //JS解构变量赋值方式,按照数组的语法进行位置的匹配赋值
              var [aa,bb,dd] = ["hang","yuan","kun"];
              console.log(aa,bb,dd);
      </script>
      
  • 数据类型:JS的变量不区分类型,但是变量存的值有数据类型

    • 数值类型:整形,小数

    • 字符串类型:JS中可以用单引号或双引号代表字符串

    • 布尔类型:JS中有真值和假值的区分

      真值假值
      truefalse
      非空的变量0
      非空的内容null(手动赋值为null或者一个对象没有值)、
      undefined(一个变量声明但为赋值)
    • 特殊数据类型:

      • undefined
      • Infinity(把零作为除数时,无穷大)
      • NaN(not a number不是一个数,非法的算数运算)
      • 一个函数:isNaN(变量 / 值),是不是 不是一个数
      console.log(1/0);//Infinity
      
      console.log(isNaN('hang'));//true
      
  • 运算符

    • 算数运算符:+ - * / % ++ –

    • 赋值运算符:= += -= *= /= %=

    • 关系运算符:> >= < <= == === != !==

    • 逻辑运算符:&& || !

    • 三元运算符(三目运算符):布尔表达式?值1:值2

      <script type="text/javascript">
          var str1 = '123';
          var m = 123;
          //两个等号比较的是变量里实际的值
          console.log(str1==m);
          //三个等号比较变量的值以及数据类型
          console.log(str1===m);
      
      	//不等号  多一个等号会兼顾数据类型
          console.log(str1!=m); //false
          console.log(str1!==str2); //false
      
      </script>
      
  • 分支语句

  • 循环语句

    //分支语句:
    	if(){
         	//实现
         }else if(){
         	//实现   
         }else{
        	//实现
         }
    
    //循环语句:for循环、while循环、do ... while循环
    	var sum = 0;
    	for(var i = 0; i <= 100; i++){
    		sum += i;
    	}
    
  • 数据类型转换

    //隐式转换:指JS在执行过程中觉得有必要,则自动完成转换
    			//当遇到  -   *   /  时都会把字符串类型转换成数字类型
    			//任何一个值与字符串做 + 运算,得到的还是一个字符串
    		//手动转换:
    			//Number():只能转换纯数值的字符串,包含字符的会返回NaN(not a number)
    			//parseInt():可以转换包含字符的字符串,规则是取第一个数值作为返回的结果,如果字符串的第一个字符不是数组,则返回NaN
    		//函数isNaN():用于判断给定的值或变量,是不是一个数,数值返回false,字符串返回false
    
    //表达式:由运算符连接的变量,最终会产生一个结果
    
函数
  • 函数是由多个语句组成的,完成特定功能的代码块。可以提高代码的复用性

  • 函数的定义:

    • JS中的函数没有强制的返回值类型约束
    • 参数的定义不用书写类型,直接书写变量名
    function 函数名(参数列表){ 	
            //函数体	
            //函数的返回值,没有类型约束,返回什么类型的值都可以
            return 返回值;  	//可以结束函数的执行
    }
    
  • 函数的调用

    • 函数名(参数列表)

    • 参数传递的个数与参数列表可以不匹配

    • JS中每一个函数内都有一个隐含的对象arguments数组,里面封装保存了传递的所有参数

      //函数的基本使用
      <script type="text/javascript">
              //声明一个无参,无返回值的函数
              function fun1(){
                console.log('无参函数');
              }
              //定义一个有参有返回值的函数
              function sum(a,b){
                console.log('计算两个数的和');
                return a+b;
              }
              //调用函数
              fun1();
              var s = sum(1,2);
              console.log('和是:',s);
      </script>
      
      
      function funSum(a,b){
            	//JS函数中有一个隐含的封装了参数值的对象:arguments,是一个数组
            	//可以从arguments中获取调用函数传递的所有参数
                  console.log('funSum:',arguments);
                  for(var i = 0; i < arguments.length; i++){
                      console.log('funSum:',arguments[i]);
                  }
                  return a+b;
      }
      
      //调用函数
      //var sum = funSum();   相当于两个undefind相加
      var sum = funSum(1,8,200);
      console.log(sum);
      
  • JS函数的特殊用法

    • 匿名函数

      var fun2 = function(a,b){
             console.log('匿名函数',a,b);
      }
      //调用
       fun2('呵呵',9);
      
    • 定义只能使用一次的函数

       //定义完函数原地调用,没有函数名,只能调用一次
      ( function(){
                  console.log('调用一次性函数')
      } )();
      
    • 将函数作为参数传递

      //将函数作为变量进行传递
      function fun3(){
        	console.log('函数作为变量')
      }
      //一共调用了两次fun3()
      var fun4 = fun3;
      console.log(fun4);
      fun4();
      //定义一个函数
      function fun5(m){
        	m();
      }
      fun5(fun4); //把fun4当作参数传递
      
    • 函数作为函数的返回值

      //函数可以作为返回值
      function fun6(){
            console.log('fun6被调用')
            return function (){
              	console.log('fun6的返回值')	
            }
      }
      fun6()();
      
  • 全局作用域:全局作用域内定义的变量,在全局范围内任何位置都可以使用

  • 局部作用域:定义在函数内部的变量,作用范围仅限当前函数内部,但是如果函数内的一个变量没有用var声明,会自动晋升为全局变量

    • 当全局变量和局部变量命名冲突,局部优先
    • 函数在定义的过程中一定避免与变量名命名冲突
    <script type="text/javascript">
            //此时m的范围是全局的
            var m = 10;
            function fun1(){
                //n的使用范围仅限当前代码块中
                var n = 20;
                //没有用var声明,则自动提升为全局
                x = 100;
                console.log('fun1:',m,n,x);
            }
            function fun2(){
                console.log('fun2:',m,x)
            }
            fun1();
            fun2();
            console.log('**************');
            function fun3(){
                var a = b = c = 20;  //此时var的作用仅对a有效
            }
            fun3();
            console.log(b);
    
    </script>
    
数组
  • 声明

  • JS中数组的类型没有限制

    • 定义数组

      //第一种创建数组方式,声明一个空的数组,与var arr2=[];是等效的
      var arr1 = new Array();
      arr1[0] = 'hehe';
      arr1[1] = 100;
      console.log(arr1);
      
      //第二种创建数组方式
      var arr2 = [];
      console.log(arr2);
      var arr3 = [1,2,'erha'];
      console.log(arr3[2]);
      
    • 遍历数组:for…in针对于稀疏数组时只输出有值的元素

      //声明一个数组
      var arr1 = [1,3,2,5,6];
      arr1[10] = 100;//现在数组下标为10的位置有了值,但是标4-9的位置是没有值的
      //遍历数组
      console.log('=========for循环遍历=======');
      for(var i=0;i<arr1.length;i++){//遍历所有的元素,包括undefined
        	console.log(arr1[i]);
      }
      
      //for...in    
      //idx代表数组的下标,可变;且在遍历稀疏数组时只输出有值的元素
       for(idx in arr1){//只遍历有效的元素
            console.log(idx,arr1[idx]);
          }
      
    • 针对数组的一些函数

      		var arr1 = [1,23,4,5,9];
              //向数组末尾添加元素
              arr1.push(100);
              //向数组头部添加元素
              arr1.unshift(200);
              //删除数组最后一个元素
              arr1.pop();
              //删除数组第一个元素
              arr1.shift();
              //将数组的元素使用指定字符进行拼接,返回一个字符串
              var str = arr1.join(':')
              //从指定下标位置,删除n个元素
              arr1.splice(0,1);
              
              var arr2 = [10,20,30];
              var arr3 = [40,50,60];
              //concat函数,会返回两个数组合并后的大数组
              var arrs = arr2.concat(arr3);
              
              var arr4 = [1,23,2,5,19];
              //数组排序,默认按照从第一个位置从小到大排序,需要自定义规则
              arr4.sort(function(a,b){
                  return a-b; //升序排列
                  //return b-a;   降序排列
              });
      
对象
  • 对象的创建和对象中属性定义的操作

    • 通过new Object()创建

      <script type="text/javascript">
              //创建一个对象
              var obj1 = new Object();
              //给对象中设置属性
              obj1.name = 'hang';
              obj1.age = 18;
              //设置对应属性的get/set方法
              obj1.setName = function(name){
                //this指当前对象
                this.name = name;
              }
              obj1.getName = function(){
                return this.name;
              }
              //调用对象中的方法
              obj1.setName('yuan');
              //访问属性
              console.log(obj1.name,obj1.age);//输出结果yuan 18
              console.log(obj1.getName());//输出结果yuan
      </script>
      
    • 通过JSON字符串格式定义JS对象

      • JSON字符串本质就是个字符串,但JSON字符串的格式是固定的一种国际标准:{“name”:“value” , “name2”:“value2” , …},是键值对的方式,对应的值可以为数组
      <script type="text/javascript">
          //创建一个对象
          var obj = {
              //"name":"hang",
              name:"yuan",//在定义JS对象中的属性key时,可以省略双引号
              "age":18,
              setName:function(name){
                this.name = name;
              },
              getName:function(){
                return this.name;
              },
              setAge:function(age){
                this.age = age;
              },
              getAge:function(){
                return age;
              }
          };
          //访问属性
          console.log(obj);
          console.log('直接过去属性值',obj.name);
          console.log('通过方法获取属性值',obj.getName());
      </script>
      
  • 日期对象

     <script type="text/javascript">
            //创建日期对象
            //var date = new Date();//当前系统时间
            var date = new Date('2022-10-22');
            //日期对象常用方法
            document.write(date+'<br>');
            document.write('年:'+date.getFullYear()+'<br>');
            document.write('月:'+date.getMonth()+1+'<br>'); //月必须加1
            document.write('日:'+date.getDate()+'<br>');
            document.write('时:'+date.getHours()+'<br>');
            document.write('分:'+date.getMinutes()+'<br>');
            document.write('秒:'+date.getSeconds()+'<br>');
            document.write('星期:'+date.getDay()+'<br>');
    </script>
    
  • 常用的其他函数

    //字符串相关
    	//str.length  返回字符串str长度
    	//str.indexOf(字符)  返回指定的字符串在str中出现的第一次的下标,没有返回-1
    	//str.lastIndexOf(字符)  返回指定的字符串在str中最后一次出现的下标,没有返回-1
    
    //运算相关
    	//Math.random()   返回0到1之间的一个随机数
    	//Math.pow(m,n)	 返回m的n次幂
    	//Math.round();      返回四舍五入
    
  • 复杂数组小练习

    <script type="text/javascript">
    			//书写JS代码
    			function fun1(option){
    				console.log(option);
    				//option传入一个对象,在函数的内部使用option对象的属性值
    				console.log(option.name);
    				console.log(option.age);	
    			}
    			var o = {
    					name:'hang',
    					age:18
    			}
    			fun1({
    				name:'yuan',
    				age:18
    			});	
    			//复杂数组
    			var arr = [
    			           {
    			        	   id:1,
    			        	   name:'北京'
    			           },
    			           {
    			        	   id:2,
    			        	   name:'天津'
    			           },
    			           {
    			        	   id:3,
    			        	   name:'上海'
    			           }
    			           ];
    			document.write('<select>');
    			for(var i=0;i<arr.length;i++){
    				console.log(arr[i]);
    				console.log(arr[i].id);
    				console.log(arr[i].name);
    				document.write('<option value="">'+arr[i].name+'</option>')
    			}
    			document.write('</select>');	
    </script>
    
事件开发
  • 指JS通过捕捉用户在网页上的一系列操作(如单击鼠标等),进行相关的处理

  • 事件开发的三要素

    • 事件源:指HTML标签元素
    • 事件属性:用于捕捉事件的特殊的属性。如:捕捉单击事件的属性 onclick
    • 事件监听器:针对捕捉到的事件,进行的后续处理,一般是通过函数实现
  • 完成事件开发的流程

    • 书写HTML标签

    • 在HTML标签上定义事件属性

    • 开发事件监听函数

    • 调用事件监听函数

      <!--  οnclick=""  捕捉单击事件的属性  -->
      <head>
          <script type="text/javascript">
              //编写事件监听函数
              function funClick(){
                  alert('你点我啊');
              }
          </script>
      </head>
      <body>
          <h2>事件开发</h2>
          <input type="button" value="单击鼠标事件" onclick="funClick()">
      </body>
      
  • 调用事件回调函数,在事件属性值上传参,获取标签的属性值

    • 事件属性调用函数的时候,传的this是当前的标签对象
    <script type="text/javascript">
              //编写时间监听函数
              function fn1(){
                //alert('你点啥');
                //console.log('呵呵呵');
                document.write('<select>');	
                document.write('<option>北京</option>');
                document.write('<option>上海</option>');
                document.write('</select>');
    
              }
              function fn2(arg){
                //输出 <input type="button" value="触发事件的时候传参" οnclick="fn2(this)"/>
                console.log(arg);
                //输出 value属性值:触发事件的时候传参
                console.log('value属性值:'+arg.value); 
                //输出 value属性值:button
                console.log('value属性值:'+arg.type);
              }
    			
    </script>
    
    <body>
            <input type="button" value="普通按钮" onclick="fn1()"/>
            <!-- 事件属性调用函数的时候,传的this是当前的标签对象 -->
            <input type="button" value="触发事件的时候传参" onclick="fn2(this)"/>
    </body>
    
  • 操作标签

    • var obj = document.getElementById(标签的ID属性值);

    • 获取标签的属性值:obj.属性名

    • 设置新的属性值:obj.属性名 = 要修改的内容

      <script type="text/javascript">
                function funLight(){
                  //根据标签的id属性获取标签对象
                  var imgObj = document.getElementById('bulb');
                  console.log(imgObj);
                  console.log(imgObj.title);
                  if(imgObj.title=="off"){
                    //给src属性赋新值
                    imgObj.src = "img/bulb_on.png";
                    imgObj.title="on";
                  }else{
                    //给src属性赋新值
                    imgObj.src = "img/bulb_off.png";
                    imgObj.title="off";
                  }
                }
      </script>
      
      <body>
              <img src="img/bulb_off.png" title="off" id="bulb"/><br>
              <input type="button" value="开关" onclick="funLight()">
      </body>
      
  • 常用的事件属性

    属性名触发时机
    onclick单击鼠标触发
    ondblclick双击鼠标触发
    onblur失去焦点触发
    onfocus获得焦点触发
    onmouseover鼠标覆盖触发
    onmouseout鼠标移出触发
    onmousemove鼠标移动触发
    onkeyup抬起按键触发
    onkeydown按下按键触发
    onload加载完页面触发,用于body标签
    onchange改变下拉列表选项触发
    onsubmit提交表单的事件
    • 操作标签

      <script type="text/javascript">
              function funLight(){
                //根据标签的id属性获取标签对象
                var imgObj = document.getElementById('bulb');
                console.log(imgObj);
                console.log(imgObj.title);
                if(imgObj.title=="off"){
                  imgObj.src = "img/bulb_on.png";
                  imgObj.title="on";
                }else{
                  imgObj.src = "img/bulb_off.png";
                  imgObj.title="off";
                }
              }
      </script>
      
      <body>
            <img src="img/bulb_off.png" title="off" id="bulb"/><br>
            <input type="button" value="开关" onclick="funLight()">
      </body>
      
    • 阻止表单提交

      <!-- onsubmit  -->
      
      <script type="text/javascript">
      			//表单验证的监听函数
      			function funSubmit(){
      				//书写表单验证的代码
      				return false;	//此时会阻止表单提交
      			}
      </script>
      
      <form action="http://www.baidu.com" method="post" onsubmit="return funSubmit()">
      			Username:<input type="text" id="username" /><br>
      			Password:<input type="password" id="password" /><br>
      			<input type="submit" value="提交">
      </form>
      
    • 阻止超链接的默认事件

      <!--  第一种  -->
      <a href="#" >超链接</a>
      
      <!--  第二种  -->
      <a href="javascript:void(0)" >超链接</a>
      
    • 事件冒泡:当父元素和子元素定义了相同的事件时,触发子元素的事件同时会扩散触发父元素的相同事件

      function funSup(){
      		alert('触发了父div');
      }
      function funSub(){
      		alert('触发了子div');
      }
      
      <div id="supDiv" onclick="funSup()">
      		<div id="subDiv" onclick="funSub()">
      			
      		</div>
      </div>
      
    • 阻止事件冒泡

      function funSub(){
      		alert('触发了子div');
      		//阻止事件冒泡
      		//第一种方式,针对非IE浏览器兼容性好
      		event.stopPropagation();
      		//第二种方式,针对IE浏览器兼容性好
      		event.cancelBubble = true;
      }
      
DOM编程
  • Document Object Model,文档对象模型

  • 所有的HTML文档中的元素都封装成了一个document对象,我们可以操作和获取这些对象

  • DOM树特点

    • 我们把每一个HTML元素称为DOM树上的一个节点(node),每一个节点可以有多个子节点,只能有一个直接父节点
    • 每一个HTML元素都在这个DOM树上
  • DOM编程主要作用

    • 使用DOM编程可以修改HTML文档的样式属性
    • 使用DOM编程可以动态的添加和删除HTML元素
    • 使用DOM编程可以完成表单的验证
  • 获取标签对象

    • 根据标签ID属性值获取标签对象:document.getElementById(ID 属性值);返回一个对象
    • 根据标签的name属性值获取标签对象:document.getElementsByName(name 属性值) ;返回一组对象
    • 根据标签的class属性值获取标签对象:document.getElementsByClassName(class 属性值) ;返回一组对象
    • 根据标签名获取标签对象:document.getElementsByTagName(标签名) ;返回一组对象
    <script type="text/javascript">
    			function getObj(){
    				//根据id获取
    				var username = document.getElementById('username');
    				console.log('根据id获取:',username);
    				
    				//根据name获取
    				var sexs = document.getElementsByName('sex');
    				console.log('根据name获取:',sexs);
    				
    				//根据class获取
    				var form_inps = document.getElementsByClassName('form_inp');
    				console.log('根据class获取:',form_inps);
    				//根据标签获取
    				var inputs = document.getElementsByTagName('input');
    				console.log('根据标签名获取:',inputs);
    			}
    </script>
    
    <form action="" method="POST" >
    			Username:<input type="text" id="username" name="username" class="form_inp"/><br>
    			Password:<input type="password" id="password" name="password" class="form_inp"/><br>
    			Sex:
    			<input type="radio" id="male" name="sex"/><input type="radio" id="female" name="sex"/><br>
    			Hobby:
    			<input type="checkbox" id="eat" value="eat" name="hobby"/>吃饭
    			<input type="checkbox" id="sleep" value="sleep" name="hobby"/>睡觉
    			<input type="checkbox" id="hetBee" value="hetBee" name="hobby"/>打豆豆
    			<br>
    			<input type="submit" value="提交" /><br>
    </form>
    <input type="button" value="测试" onclick="getObj()">
    
  • 操作标签的属性

    • 获取属性值:obj.属性名 或调用方法 obj.getAttribute(属性名);

    • 设置属性值:obj.属性名=新值 或调用方法 obj.setAttribute(属性名,属性值);

      function tagAttr(){
                //根据id获得标签对象
                var obj = document.getElementById('username');
                //console.log(obj.value);
                //获取class属性值
                //console.log(obj.getAttribute('class'));
                //设置标签属性值
                //obj.value='Hello';
                obj.setAttribute('value','world');
      }
      
    • 操作标签体内容

      • 获取标签体内容:

        • obj.innerText:只获取纯文本内容
        • obj.innerHTML:获取标签体所有内容,包含子标签
      • 设置标签体内容:

        • obj.innerText = ‘新内容’,新内容会覆盖旧内容
        • obj.InnerHTML = ‘新内容’,如果新内容包含html标签,则会解析标签功能
      //操作标签体内容
      			//获取
      			function getTagInfo(){
      				var dv = document.getElementById('dv');
      				//console.log(dv.innerText);	只能操作纯文本内容
      				console.log(dv.innerHTML);		
      				var dvd = document.getElementById('dvd');
      				//console.log(dvd.innerText);
      				console.log(dvd.innerHTML);		//可以获取到标签体内的子标签
      			}
      			//设置
      			function setTagInfo(){
      				var dv = document.getElementById('dv');
      				//dv.innerText='鲲之大,一锅炖不下';	只能操作纯文本内容
      				dv.innerHTML='<h3>鲲之大,一锅炖不下</h3>';	//可以解析html标签功能
      				var dvd = document.getElementById('dvd');	
      				//dvd.innerText='鲲之大,一锅炖不下';
      				dvd.innerHTML='<h3>鲲之大,一锅炖不下</h3>';
      			}
      
  • 操作单选按钮和多选框

    • 选中:obj.checked = true;

    • 取消选中:obj.checked = false;

    • 返回当前状态:obj.checked 返回当前状态,false:未选,反之

      <script type="text/javascript">
      		function funTest1(){
      				var man = document.getElementById('man');
      				//选中
      				man.checked = true;
      		}
      		function funTest2(){
      				var man = document.getElementById('man');
      				//取消
      				man.checked = false;
      		}
      		function funSelAll(){
      				//根据name获得所有的checkbox
      				var hobby = document.getElementsByName('hobby');
      				for(var i=0;i<hobby.length;i++){
      					hobby[i].checked = true;
      				}
      		}
      		function fun1(){
      				//获取所有单选按钮
      				var sexs = document.getElementsByName("sex");
      				console.log(sexs);
      				//选中第一个单选按钮
      				//sexs[0].checked = true;
      				//取消选中状态
      				sexs[0].checked = false;
      				console.log('单选按钮当前状态:',sexs[0].checked);
      				var likes = document.getElementsByName("likes");
      				for(idx in likes){
      					likes[idx].checked = true;
      				}
      		}
      </script>
      
  • 操作下拉列表

    //下拉列表操作
    function fun2(sel){
              //获取当前option选项的value属性值
              //console.log(sel.value);
              //获取当前option选项的下标
              //console.log(sel.selectedIndex);
              //获取所有的option选项
              console.log(sel.options);
    }
    
  • 获取当前对象的关系对象,即关系节点的对象,所有属性支持链式调用,注意中间的空文本test节点标签

    • 获取父节点对象:obj.parentNode 返回值是一个对象

    • 获取所有孩子节点对象:obj.childNodes 返回一个数组

    • 获取上一个哥哥对象:obj.previousSibling 返回一个对象

    • 获取下一个弟弟对象:obj.nextSibling 返回一个对象

      <script type="text/javascript">
      		function funGetObj(){
      				var sp = document.getElementById('dv2_inner_span1');
      				//获取父节点对象
      				console.log(sp.parentNode);
      				//获取父节点的父节点,支持链式调用
      				console.log(sp.parentNode.parentNode);
      				//获取所有的子节点对象
      				//var chileNodes = sp.childNodes;
      				var dv2 = document.getElementById('dv2');
      				//获取上一个哥哥节点
      				console.log(dv2.previousSibling.previousSibling);
      				//获取下一个弟弟节点
      				console.log(dv2.nextSibling.nextSibling);
      		}
      </script>
      
  • 通过DOM编程动态操作HTML页面的元素创建和删除

    • 添加节点

      • var obj = document.createElement(标签名); //创建标签对象

      • parentObj.appendChild(obj); //放到指定的父节点下

        function funAddNode(){
                console.log('add node');
                //创建一个span节点
                var span = document.createElement('span');
                //给节点加内容
                span.innerHTML = '新来的';
        
                //获取未来指定的父节点
                var dv3 = document.getElementById('dv3');
                //给dv3添加子节点
                dv3.appendChild(span); 
        }
        
    • 删除节点

      • parentObj.removeChild(obj); //删除指定的子节点

        function funDelNode(){
                var dv3 = document.getElementById('dv3');
                //获取dv3的子节点sp1
                var sp1 = document.getElementById('sp1');
                //删除子节点
                dv3.removeChild(sp1);
        }
        
BOM编程
  • Browser Object Model,浏览器对象模型

  • 可以控制浏览器的相关动作

  • window对象:控制浏览器的窗口相关动作

    • 弹窗提示:window.alert(内容)

    • 确认提示窗口:window.confirm(提示信息) 返回值为true或false

    • 弹窗接受用户信息:window.prompt(提示信息,文本框默认值) 返回用户输入的信息

      function fun1(){
                //弹窗
                //window.alert('Hello');
                //确认提示窗口
                //var boo = window.confirm("是否确认");
                //console.log(boo);
                //参数一:提示信息
                //参数二:文本框默认值,可以不要第二个参数
                //返回值:用户输入的信息
                var txt = window.prompt('请输入年龄','年龄是');
                console.log(txt);
      }
      
    • 只执行一次的定时器:var id = window.setTimeout(回调函数,定时延迟/毫秒);

      • 清除定时器:window.clearTimeout(id);
    • 周期性定时器:var id = window.setInterval(回调函数,定时延迟/毫秒);

      • 清除i定时器:window.clearInterval(id);
              //一次执行定时器
              //返回值,返回当前定时器的一个标识
              //参数一:回调函数
              //参数二:回调函数的延迟时间,单位毫秒
              /* var timeId1 = window.setTimeout(function(){
                alert('一次性定时器');
              },3000); */
              //周期执行定时器
              //返回值,返回当前定时器的一个标识
              //参数一:回调函数
              //参数二:回调函数的延迟时间,单位毫秒
              var timeId2 = window.setInterval(function(){
                alert('周期性定时器')
              },2000);
              
              //清除定时器
              function clearTime(){
                //清除指定定时器
                window.clearTimeout(timeId1);
                window.clearInterval(timeId2);
              } 
      
  • location对象:控制浏览器地址栏

    • location.href=‘路径’ 跳转页面,也可以向action发送请求

      function funBaidu(){
      		//跳转到百度
      		location.href='http://www.baidu.com';
      }
      
      <input type="button" value="百度一下" onclick="funBaidu()" />
      
  • 编程方式提交表单:formObj.submit();

    //提交表单的函数
    function funSubmit(){
            //手动提交表单
            var fom = document.getElementById('fom');
            fom.submit();
    }
    
    <form action="http://www.baidu.com" method="post" id="fom">
            Username:<input type="text" /><br>
            Password:<input type="password" ><br>
            <input type="button" value="提交" onclick="funSubmit()">
    </form>
    
  • 点击更换验证码,浏览器会把加载过的资源缓存一个验证码图片,会记录下,所以需要加后缀让浏览器不去使用缓存,让浏览器重新发送请求

    function changeCaptcha(){
            //根据id获取验证码图片对象
            var captchaImg = document.getElementById('captchaImg');
            captchaImg.src = '${path }/p1/captcha?'+Math.random(); //让浏览器每次都重新加载验证码图片
            //两种方法效果一样
            //captchaImg.src = '${path }/p1/captcha?'+new Date();
    }
    
    <img src="${path }/p1/captcha" id="captchaImg">
    <a href="javascript:void(0)" onclick="changeCaptcha()">看不清,换一张
    //可以传this,在方法中就不需要获取图片对象了,可以简化
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值