java day18第十八课JavaScript、DOM、jQuery

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

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

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



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

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

posted @ 2017-06-09 01:03  Mr、chen  阅读(283)  评论(0编辑  收藏  举报