欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java day18第十八课JavaScript、DOM、jQuery

程序员文章站 2022-07-14 19:00:22
...

JavaScript概述

JavaScript是基于对象和事件驱动的脚本语言,主要应用在客户端。
特点:
1、交互性:它可以做的就是信息的动态交互
2、安全性:不允许直接访问本地磁盘
3、跨平台性:主要是可以解释Js的浏览器都可以执行,与平台无关。

JavaScript与Java不同

1、Js是Netscape公司的产品。前身是LiveScript;java是sun公司的产品,现在是Oracle公司的产品
2、Js是基于对象,Java是面向对象。
3、Js值需解释就可以执行,Java需要先编译成字节码文件,再执行。
4、Js是弱类型,Java是强类型

JavaScript与Html的结合方式

想要将其他代码融入到Html中,都是以标签的形式
1、Js代码存放在标签对<script> js code... </script>
2、当有多个html页面使用到相同的JS脚本时,可以将js代码封装到一个文件中,只要在script标签的src属性引入一个js文件。(方便后期维护,扩展)
注意:如果在script标签中定义了src属性,name标签中的内容不会被执行。
例:<script src="test.js" type="rext/javascript"></script>

注:规范中script标签早期有一个属性language,而现在使用type属性。

JavaScript语法

每一种语言都有自己的语法规则,JS语法与Java很像,所以学习起来比较容易。Js中也一样有变量,语句,函数,数组等常见语言组成元素。

通常高级程序设计语言所包含的语法内容:
1、关键字:该语言中被赋予了特殊含义的单词。
2、标示符:用于标示数据所表达的符号。通常可以理解为在程序中自定义的名称。比如变量名,函数名。
3、注释:注释说明解释程序,用于调试程序。
4、变量:用于标示内存中一片空间。用于存储数据,该空间中的数据是可以变化的。什么时候使用变量?当数据不确定的时候。
    通过关键字var来定义,弱类型既类型既是不用指定具体的数据类型。
    例:var x = 3; x = "heelo";
    注:Js中也属的常量值,undefined,当变量没有初始化就被使用,该变量的值就是undefined(未定义)。
    注意:Javascript的语句在结尾处是可以不用分号结束的,非严谨语言的特点。
但为了符合编程规范,需要像java一样定义结束符。
而且有些情况是必须写分号的,如:var x = 3; var y = 5;如果两条语句写在同一行,就需要分号隔开。
    全局变量和局部变量体验?
    在函数里面定义的变量为局部的,在java脚本里面定义的变量为全局的
    
5、运算符:可以让数据进行运算的符号。
    算数运算符
        + - * / % ++ --
        注意:在js中,false默认是0或者null。非0或者非null就是true默认为1;所以:alert(1+true)为2;
    赋值运算符
        = += -= *= /= %=
        例如:
            var a = 3;
            a = a+3;
            alert(a);
    比较运算符(运算结果要么是true要么是false)
        > < >= <= != ==
        例如:
            var a = 3;
            alert(a==4);//false
    逻辑运算符(用来连接两个boolean型的表达式)
        &&  || !
        例如:
            var a = 3;
            alert(a>2 && a<4); 
            
    位运算符
        & | ^ >> << >>>
        var a = 6;
        alert(a&3);//2
        alert(5^3^3);//5
        alert(a>>>1);//3
        alert(a<<2);//24
    
    三元运算符
        ? :
        alert(3>1?alert("yes"):alert("0"))
    typeof:判断属于什么类型?
6、语句:用于对程序的运行流程进行控制的表达式。
    (1)、顺序结构
        从上往下执行
        例如:
        alert("a");
        alert("b");
        //输出顺序a,b
    
    (2)、判断语句
        var x = 3;
        if(x==3){
            alert("yes")
        }else{
            alert("no");
        }
        
        if(x=4){//此种情况注意:这里相当于重新给x赋值
            alert("yes")
        }else{
            alert("no");
        }
        
        综合上述所以我们建议写法
        if(4==x){//如果写成4=x会报错
            alert("yes")
        }else{
            alert("no");
        }
    (3)、选择结构
        var a = "b"
        switch(a){
            case "a":alert("a");break;
            case "b":alert("b");break;
            case "c":alert("c");break;
            default:
                alert("输入的是没有选项的");
                break;
        }
        判断语句有if和switch语句。如果有固定的几个选项建议使用switch。不过开发过程中,switch用的比较少
    (4)、循环结构
        var a = 3;
        while(a<3){
        alert("a="+a);
        //将数据直接写入到当前页面当中
        document.write("a="+a);
        a++;
        }
        
        for(var i = 0;i<=4;i++){
            document.write("i="+i);
        }
    (5)、其他语句
        break:跳出选择,跳出循环结构;
        contine:用于循环语句,结束本次循环,继续下次循环
    
7、函数:用于对功能代码进行封装,便于提高复用性。
    函数就是一个功能的封装体;
    定义功能通常需要两个明确:
    (1)、功能的结果;
    (2)、功能实现中的参与运算的未知的内容;
    js中定义函数的格式:
        通过指定关键字来定义:
        function 函数名(参数列表){
            函数体;
            return 返回值;//如果没有具体的返回值,return语句可以不写;
        }
        
    函数的注意细节:
        a、只要使用函数的名称就是对这个函数的调用
        b、函数中有一个数组在对传入的参数进行存储,这个数组就是arguments;
        
        注意点:
        
    function getnum(){
        return 100;
    }
    var arr = getnum();//getnum函数运行,并将返回的结果赋值给arr。
    var arr1 = getnum;//getnum本身是一个函数名,而函数本身在js中就是一个对象,getnum就是这个函数对象的引用。将getnum这个引用的地址赋值给了arr1 这时,arr1也指向了这个函数对象,此时这个函数对象有两个函数对象。
    alert(arr);//100
    alert(arr1);//function getnum(){
    //  return 100;
//  }
    var arr = getnum();
    
js函数的其它表现形式
动态函数:使用的是js中内置对象Function
参数列表和函数列表都是通过字符串指定的。
    var add = new Function("x,y","var sum;sum = x + y;return sum; ");
    alert(add(4,8));
    一般用的不多
    
匿名函数:没有名字的函数
    例如:
    function(a,b){
    return a+b
    }   
8、数组:对多个数据进行存储,便于操作。就是传说中的容器。
    数组用于存储更多的数据,是一个容器。
        特点:
        a、长度是可变的;
        b、元素的类型是任意的;
        建议:在使用数组时,存储同一类型的元素,操作起来方便。
    js中的数组定义的两种格式:
    (1)、var arr= [];
     (2)、var[] arr = [1,2,4,5,7];
     使用了javacriipt中的Array对象来完成定义
        var arr = new Array();//var arr = [];
        var arr1 = new Array(3);//数组定义并且长度为3;
        var arr2 = new Array(3,4,5);//定义一个数组,元素为3,4,5;
     
9、对象:只要是基于对象的语言,或者是面向对象的语言,就存在着对象的概念,对象就是一个封装体。既可以封装数据又可以封装函数。
    声明一个String对象:
        var str2 = new String("hello");
        var str1 = "hello world";

    演示String对象:
        var str = "abcde";
        document.write(str.bold());//加粗
        document.write("<br/>");
        document.write(str.fontcolor("red"));//字体颜色
        document.write("<br/>");
        document.write(str.link("http://www.baidu.com"))//将字符串变成超链接
        document.write("<br/>");
        document.write(str.substr(1,3));//bcd
        document.write("<br/>");
        document.write(str.substring(1,3));//bc
    因为js中的string对象方法优先,想要对字符串的操作其它的功能,比如:去除string两端的空格,这时我们只能自定义
    代码示例:
    function delect(str){
        //定义两个变量,一个记录开始的位置,一个记录结束的位置
        /* 对开始的位置对字符进行判断,如果是空格,就进行递增 ,直到不是空格为止*/
        /* 对结束的位置对字符进行判断,如果是空格,就进行递减 ,直到不是空格为止*/
        /* 必须要保证开始<= 结束,这样才可以进行截取 */
        var start,end;
        start = 0;
        end = str.length-1;
        while(start <= end && str.charAt(start)==" "){
            start++;
        }
        while(start <= end && str.charAt(end)==" "){
            end--;  
        }
        return str.substring(start,end+1);
    }
    var a = "     ab    c   ";
    alert("!"+delect(a)+"!");
    
    原型:
    从上代码分析:既然delcet方法是用来操作字符串的方法,那么我们可以将该方法定义在字符串对象中,直接用字符串对象调用。
    这里可以使用该字符串的原型属性来完成
    原型:就是该对象的一个描述。该描述中如果添加了新功能,那么该对象都会具备这些新功能。
    而prototype就可以获取到这个原型对象,通过prototype就可以对对象的功能进行扩展。
    String.prototype.delect=function(){
        var start,end;
        start = 0;
        end = this.length-1;
        while(start <= end && this.charAt(start)==" "){
            start++;
        }
        while(start <= end && this.charAt(end)==" "){
            end--;  
        }
        return this.substring(start,end+1);
        
    };

综合练习:

1、定义功能:完成对数组的最值获取

2、对数组排序

3、对数组查找,返回该数组中的index角标

4、对数组元素进行反转

    
    原型练习:
    1、给字符串添加一个功能,将字符串变成一个字符数组。  2、给字符串添加一个功能,将字符串进行反转。

模拟下join的实现
        var arr = ["1","2","3"];
        var arr1 = ["a","b","c"];
        var newarr = arr.concat("连接上了",arr1);//在arr数组上连接一个元素,再连接一个arr1数组
        var newarr1 = arr.concat(arr1);//连接两个数组合并为一个数组
        document.write(newarr);
        document.write(arr.pop());//删除并返回最后一个元素
        document.write(arr.reverse());//颠倒数组中元素的顺序。
        document.write(arr.shift());//删除并返回数组的第一个元素
        document.write(arr.splice());//删除元素,并向数组添加新元素(替换)。
        document.write(arr.unshift());//向数组的开头添加一个或更多元素,并返回新的长度。
    
        
这些都是高级程序设计语言具备的共性内容,只不过各种语言对这些内容的表现形式有所不同,但是使用的基本思想是一致的。


Date对象
    var date = new Date();
    document.write(date);
    document.write(date.toLocaleString());//根据本地时间格式,把 Date 对象转换为字符串。
    document.write(date.toLocaleDateString());//根据本地时间格式,把 Date 对象的日期部分转换为字符串。

    //日期对象和毫秒值之间的转换
    var date1 = new Date();
    var time = date1.getTime();//获取毫秒值,日期对象转换毫秒值
    //将毫秒值转换成日期对象
    var date2 = new Date(time);
    
    
        var datea = "6/20/2017";
        var time2 = Date.parse(datea);
        var date3 = new Date(time2);

为了简化对象调用内容的书写
可以使用js中的特有语句with来完成
with(对象){
    在该区域中可以直接食用指定的对象的内容,不需要写对象。
}


Math对象
    var num1 = Math.ceil("3.14");//返回但雨等于指定参数的最小整数
    var num2 = Math.floor("3.14");//返回小于等于指定数据的最大整数
    var num3 = Math.round("3.14");//四舍五入
    
Nuber对象
     var num6 = paseInt("123dsdsa");
        //将指定禁止格式的字符串转换为十进制
        var num = parseInt("110", 2);
        var num1 = parseInt("0&3c", 16);
        //将十进制转换成其他进制,使用数字对象来完成
        var num2 = new Number(6);
        document.write(num2.toString());//110
        var num3 = 60;
        document.write(num3.toString());//3c

js中特有的语句

    for in
    格式:for(变量in对象)//对对象进行遍历的语句
        {
            
        }
    
    js自定义对象
    如果想哟啊自定义对象,应该先对对象进行描述
    js是基于对象,不是面相对象的。不具备描述事物的能力
    按照面相思想的编写js?
    function Person(){//相当于构造器
        alert("this id person");
    }
    //通过描述进行对象的建立 new
    var p = new Person();
    //通过给p对象添加属性,直接使用p.属性名即可
    p.name="张三";
    p.age = 25;
    //入伏哦定义的p对象的属性赋值为一个函数,即是给p对象添加一个方法。
    p.show = function(){
    alert(this.name+"showing舞了");
    }
    
    几种写法?

DOM

DHTML在线参考手册

用来讲标记性文档封装成对象,并讲标记型文档中的所有标签(标签,文本,属性等)都封装成对象
封装成对象是为了更方便的操作这些文档,以及文档中的所有内容,因为对象的出现就可以有属性和行为被调用。
    文档对象模型
    文档:标记性文档
    对象:封装了属性和行为的实例,可以被直接调用
    模型:所有标记型文档都剧本已写共性特征的一个体现
        标记型文档(标签,属性,标签中封装的数据)
只要是标记型文档,DOM这种技术都可以对其进行操作
常见的标记型文档:html   xml
DOM是如何操作标记型文档的?
    要操作标记型文档,必须进行解析
    DOM的解析方式
        按照标签的层次关系体现出标签的所属,形成一个树状结构,而数中的标签以及文本甚至属性称为节点
    DOM解析的特点:
        将标记型文档解析成一个DOM树,并将树中的内容都封装成节点对象。这种DOM解析的方式的好处:可以对树中的节点进行任意操作如:增删改。弊端:这种解析需要把整个标记型文档加载进内存。浪费内存空间且所占内存较大。
        
    DOM模型有三种:
    1、将html文档封装成对象。
    2、在1的基础上加入了一些新功能,比如解析一些名称空间
    3、在xml文档封装成了对象
    
DHTML:动态的HTML
    注意:这不是一种语言,是多项技术综合体的简称
    其中包涵了HTML,CSS,DOM,JavaScript
    这四个技术在动态html页面效果定义时,都处于什么样的角色呢?负责什么效果?
    HTML:提供标签,封装数据,目的时便于对该标签中的数据进行操作。
        简单讲:用标签封装数据
    css:提供样式属性,对标签中的数据进行样式定义
        简单讲:对数据进行样式定义
    DOM:负责将标签型文档以及文档中的所有内容进行解析,并封装成对象,在对象中定义更多的属性和行为,便于对对象的操作
        简单讲:将文档和标签以及其他内容变成对象
    JS:负责提供程序设计语言,对页面中的对象进行逻辑操作。
        简单讲:负责页面的行为定义。就是页面的动态效果 
BOM:browser object Model 浏览器对象模型
浏览器对应的对象就是window对象
    我们可以通过一个点击事件获取window版本信息的例子体验一下
    
window 对象
    演示代码:
    <script type="text/javascript">
var tt;
    function windowdemo2(){
        /* var a = confirm("你确定点击吗?");
        alert("a="+a); */
        
    /*  setTimeout("alert('setTimeout三秒后弹出来')", 3000); */
        tt = setInterval("alert('setInterval三秒出来一次')",3000);
        
    }
    /*  使用 setInterval 方法取消先前开始的间隔事件。 */
    function stopsetInterval(){
        clearInterval(tt);
    }
    
    function windowMove(){
        moveBy(20, 20);/*   将窗口的位置移动指定 x 和 y 偏移值。  */
        moveTo(40, 40);/* 将窗口左上角的屏幕位置移动到指定的 x 和 y 位置。 */
    }
    
    function windowopen(){
        
        open("", "_blank", "height=200,width=200,status=yes,toolbar=yes,menubar=yes,location=yes");
    }
    
</script>



<input type="button" value="window事件演示" onclick="windowdemo2()"></input>
<input type="button" value=" 停止弹" onclick="stopsetInterval()"></input>
<input type="button" value=" open" onclick="windowopen()"></input>


弹窗练习?实现弹窗最小化,都会再弹出来,focus()

location对象
演示代码:
    <script type="text/javascript">
    function windowdemo1(){
        var name =  location.pathname;
        var text = location.href;
        println(name);
        println(text);
    }
    
    function println(val){
        document.write(val+"<br/>")
    }
</script>

<input type="button" value="按钮事件演示" onclick="windowdemo1()"></input>


document对象
document最常见的操作就是获取页面中的节点
获取节点的方式:
1、getElementById    获取对 id 标签属性为指定值的第一个对象的引用。
2、getElementsByName 根据name可以有多个,所以返回的就是一个数组。
3、getElementsByTagName  获取基于指定元素名称的对象集合。
常见的节点有三种:
a、标签型节点
b、属性节点
c、文本节点
标签型节点是没有值的,属性和文本节点是有值的。
    var di = document.getElementById("div");//di为标签div的id名
    alert(di.nodeValue);
    
    //获取节点里面的文本
    var text = di.innerHTMl;
    alert(text);
    
    //改变文本
    di.innerHTML = "文本内容被改掉";
        
通过节点的层次关系获取节点对象
    关系:
    1、父节点:parcntNode:对应一个节点对象
    2、子节点:childNode:对应一个节点集合
    3、兄弟节点
        上一个兄弟节点:previousSibling
        下一个兄弟节点:nextSibling
    尽量少用兄弟节点,会根据浏览器的不同,会解析除标签间的空白文档节点   
    课堂练习:创建?添加?删除?
    

jQuery对象与DOM对象


对于才开始接触jQuery库的初学者,我们需要清楚认识一点:

jQuery对象与DOM对象是不一样的
可能一时半会分不清楚哪些是jQuery对象,哪些是DOM对象,下面重点介绍一下jQuery对象,以及两者相互间的转换。

通过一个简单的例子,简单区分下jQuery对象与DOM对象:

<p id=”imooc”></p>
我们要获取页面上这个id为imooc的p元素,然后给这个文本节点增加一段文字:“您好!通过慕课网学习jQuery才是最佳的途径”,并且让文字颜色变成红色。

普通处理,通过标准JavaScript处理:

var p = document.getElementById('imooc');
p.innerHTML = '您好!这是Dom写入';
p.style.color = 'red';
通过原生DOM模型提供的document.getElementById(“imooc”) 方法获取的DOM元素就是一个DOM对象,再通过innerHTML与style属性处理文本与颜色。

jQuery的处理:

var $p = $('#imooc');
$p.html('您好!这是jQquery写入').css('color','red');
通过$('#imooc')方法会得到一个$p的jQuery对象,$p是一个类数组对象。这个对象里面包含了DOM对象的信息,然后封装了很多操作方法,调用自己的方法html与css,得到的效果与标准的JavaScript处理结果是一致的。

通过标准的JavaScript操作DOM与jQuyer操作DOM的对比,我们不难发现:

通过jQuery方法包装后的对象,是一个类数组对象。它与DOM对象完全不同,唯一相似的是它们都能操作DOM。
通过jQuery处理DOM的操作,可以让开发者更专注业务逻辑的开发,而不需要我们具体知道哪个DOM节点有那些方法,也不需要关心不同浏览器的兼容性问题,我们通过jQuery提供的API进行开发,代码也会更加精短。



jQuery对象转化成DOM对象
    jQuery库本质上还是JavaScript代码,它只是对JavaScript语言进行包装处理,为的是提供更好更方便快捷的DOM处理与开发中经常使用的功能。我们使用jQuery的同时也能混合JavaScript原生代码一起使用。在很多场景中,我们需要jQuery与DOM能够相互的转换,它们都是可以操作的DOM元素,jQuery是一个类数组对象,而DOM对象就是一个单独的DOM元素。

如何把jQuery对象转成DOM对象?

利用数组下标的方式读取到jQuery中的DOM对象

HTML代码

<div>元素一</div>
<div>元素二</div>
<div>元素三</div>
JavaScript代码

var $div = $('div') //jQuery对象
var div = $div[0] //转化成DOM对象
div.style.color = 'red' //操作dom对象的属性
用jQuery找到所有的div元素(3个),因为jQuery对象也是一个数组结构,可以通过数组下标索引找到第一个div元素,通过返回的div对象,调用它的style属性修改第一个div元素的颜色。这里需要注意的一点是,数组的索引是从0开始的,也就是第一个元素下标是0

通过jQuery自带的get()方法

jQuery对象自身提供一个.get() 方法允许我们直接访问jQuery对象中相关的DOM节点,get方法中提供一个元素的索引:

var $div = $('div') //jQuery对象
var div = $div.get(0) //通过get方法,转化成DOM对象
div.style.color = 'red' //操作dom对象的属性


DOM对象转化成jQuery对象
相比较jQuery转化成DOM,开发中更多的情况是把一个dom对象加工成jQuery对象。$(参数)是一个多功能的方法,通过传递不同的参数而产生不同的作用。

如果传递给$(DOM)函数的参数是一个DOM对象,jQuery方法会把这个DOM对象给包装成一个新的jQuery对象
通过$(dom)方法将普通的dom对象加工成jQuery对象之后,我们就可以调用jQuery的方法了

HTML代码

<div>元素一</div>
<div>元素二</div>
<div>元素三</div>
JavaScript代码

var div = document.getElementsByTagName('div'); //dom对象
var $div = $(div); //jQuery对象
var $first = $div.first(); //找到第一个div元素
$first.css('color', 'red'); //给第一个元素设置颜色
通过getElementsByTagName获取到所有div节点的元素,结果是一个dom合集对象,不过这个对象是一个数组合集(3个div元素)。通过$(div)方法转化成jQuery对象,通过调用jQuery对象中的first与css方法查找第一个元素并且改变其颜色。



jQuery选择器之层级选择器
文档中的所有的节点之间都是有这样或者那样的关系。我们可以把节点之间的关系可以用传统的家族关系来描述,可以把文档树当作一个家谱,那么节点与节点直接就会存在父子,兄弟,祖孙的关系了。

选择器中的层级选择器就是用来处理这种关系

子元素 后代元素 兄弟元素 相邻元素
通过一个列表,对比层级选择器的区别



 仔细观察层级选择器之间还是有很多相似与不同点

层级选择器都有一个参考节点
后代选择器包含子选择器的选择的内容
一般兄弟选择器包含相邻兄弟选择的内容
相邻兄弟选择器和一般兄弟选择器所选择到的元素,必须在同一个父元素下