一、 什么是javaScript对象?
对象是javaScript中最重要的API。
javaScript包含多种对象有:内置对象、外部对象(window对象、dom对象)、自定义对象。
二、 如何使用对象?
对象包含属性和方法。
访问对象属性:对象.属性
访问对象方法:对象.方法()
三、 常用内置对象
JS中常用内置对象有:String对象、Number对象、Boolean对象、Array对象、Math对象、Date对象、RegExp对象、Function对象。
1. String对象
(1)创建String对象有两种方式:
var str1=”hello word”;
var str2=new String(“hello word”);
(2)String对象的属性:
str.length;
(3)String对象的常用方法
##大小写转换方法
str1.toLowerCase()、str1.toUpperCase()
##获取指定字符
srt1.charAt(index):返回指定位置的字符
str1.charCodeAt(index):返回指定位置字符的Unicode编码。(index表示字符位置)
##查询指定字符串
str1.indexOf(findstr,[index])、str1.lastIndexOf(findstr,[index])
PS:findstr表示要查询的字符串,lastIndexOf表示从最后开始找起,如果没有找到则返回-1.
##获取子字符串(含头不含尾,下标均是从0开始)
str1.substring(start,[end])
##替换子字符串
str1.replace(findstr,tostr)
PS:findstr为要找的子字符换,tostr替换为的字符串,返回替换后的字符串。
##拆分子字符串
Str1.split(bystr,[howmany])
PS:bystr分割用的字符串,howmany指定返回的数组的最大长度,可以省略,返回分割后的字符串。
注意:字符串是不可变的,一些可以修改的字符串的API,实际上是返回一个新的字符串,并不改变原始字符串.
2.Number对象
(1)Number是数值对象,创建Number对象如下:var a=1.1;
(2)Number对象的常用方法
##toFixed(num):转换为字符串,并保留小数点后一定位数。如果必要该数字可以被舍弃,也可以用0补足。
3.Array对象
##JS中的数组均是Object,如var a1=[1,25,"男朋友",true];
数组的长度是可变的。
##JS中的数组可以像集合一样操作
var a2=new Array();
a2.push(8);
a2.push(false);
console.log(a2[2]);
##访问数组元素console.log(a1[0])
##数组中元素倒转:a1.reverse();
##数组排序*重点*:a1.sort();默认按照字符串的Unicode编码排序,可以通过替换比较方法影响排序结果。(一般比较方法无需复用,采用匿名方法)
举例如下:
a1.sort(Function(a,b){
return a-b;
});
Console.log(a1);
4.Math对象
Math对象用于执行数学任务,无需创建,直接使用即可。如下所示:
console.log(Math.PI);console.log(Math.E);
console.log(Math.round(Math.PI));
PS:Math.round()表示为取整。
5.Date对象
Date对象用于处理日期和时间,封装了系统时间毫秒数。
##创建Date对象(Date对象会自动把当前的日期和时间保存为初始值)
Datedate1=new Date();
Datedate2=new Date(“2015/1/1 1:12:11”);
##Date对象常用方法
读写时间毫秒数:date1.getTime()、date1.setTime(毫秒)
读写时间分量:
date1.getDate()、date1.getDay()、date1.getFullYear()等。
date1.setDate()、date1.setDay()、date1.setFullYear()等。
转化为字符串:
toString()、toLocaleTimeString()、toLocaleDateString()
6.RegExp对象
RegExp对象表示正则表达式,作用也就是用来检查字符串。
##创建RegExp对象
VarrgExp=new RegExp(“pattern”,[“flags”]);
VarrgExp=/pattern/flags;
PS:flags的标识有两种
(1) g:设定当前匹配为全局模式。
(2) i:忽略匹配中的大小写检测。
注意:全局模式(第N次调用则找出第N个匹配的部分),非全局模式(找出首次匹配的部分)。
##RegExp对象的常用方法
RegExpObject.test(string)*重点*
如果字符串string中含有与RegExpObject匹配的文本,则返回true,否则返回false.
reg.exec(str):检测字符串中指定的值,返回指定的值。
reg.test(str):检测字符串中指定的值,返回false或true.
##String对象与正则表达式(regexp代表正则表达式或字符串)
--x.replace(regexp,tostr),返回替换后的结果。
--x.match(regexp),返回匹配字符串的数组。
--x.search(regexp),返回匹配字符串的首字符位置索引。
7.Function对象
JS中的函数就是Function对象。
函数名就是指向Function对象的引用,使用函数名可以访问函数对象,函数名()是调用函数。
##定义函数对象
函数的返回值默认为undefined,也可以使用return返回具体的值。
##函数的参数
JS的函数没有重载。
调用时只要函数名一样,无论传入多少个参数,调用的都是同一个函数。
没有接收到实参的参数值是undefined.
所有的参数传递给arguments数组对象。
##arguments对象*重点*..
Arguments是一种特殊的对象,在函数代码中,表示函数的参数数组。
在函数代码中,可以使用arguments访问所有参数。
arguments.length:函数的参数个数
arguments[i]:第i个参数
可以利用arguments实现可变参数的函数。
##eval函数*重点*
eval函数用于计算表达式字符串,或者用于执行字符串中的javascript代码。
只接受原始字符串作为参数。
如果函数中没有合法的表达式或语句,则抛出异常。
小案例
1.登录页面的代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<style>
.ok {
color:green;
border:1px solid green;
}
.error {
color:red;
border:1px solid red;
}
</style>
<script>
//校验账号的格式
function check_code() {
console.log(1);
//获取账号
var code=document.getElementById("code").value;
//校验其格式(\w 字母或数字或下划线)
var span=document.getElementById("code_msg");
var reg=/^\w{6,10}$/;
if(reg.test(code)){
//通过,增加OK样式
span.className="ok";
return true;
}else{
//不通过,增加error样式
span.className="error";
return false;
}
}
</script>
<script>
//校验密码
function check_pass() {
//获取密码
var pass=document.getElementById("pass").value;
//校验
var span=document.getElementById("pass_msg");
var reg=/^\w{8,20}$/;
if(reg.test(pass)){
//通过,增加OK样式
span.className="ok";
return true;
}else{
//没通过,增加error样式
span.className="error";
return false;
}
}
</script>
</head>
<body>
<!--check_code() && check_pass(),中的与&&会发生短路,为防止短路,可以利用一个boolean值中的true值为1,false值为0进行改进-->
<form action="http://www.tmooc.cn" οnsubmit="return check_code()+check_pass()==2;">
<p>
账号:
<input type="text" id="code"
οnblur="check_code();"/>
<span id="code_msg">6-10位字母、数字、下划线</span>
</p>
<p>
密码:
<input type="password" id="pass"
οnblur="check_pass();"/>
<span id="pass_msg">8-20位字母、数字、下划线</span>
</p>
<p><input type="submit" value="登录"/></p>
</form>
</body>
</html>
补充:onsubmit,表单提交事件,是form的事件,当点击表单内的submit按钮时触发,在该事件内返回true,则提交成功,默认就是返回true,若返回false,则不提交。
网页效果显示:
2.计算器代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>计算器</title>
<script>
function cal() {
//获取文本框
var input=document.getElementById("num");
//获取span
var span=document.getElementById("jg");
//获取框内的算式
var ss=input.value;
try {
var result=eval(ss);
//计算成功,将结果写入文本框input
span.innerHTML=result;
}catch(e) {
//出错时给予提示
span.innerHTML="Error";
}
}
</script>
</head>
<body>
<input type="text" id="num"/>
<input type="button" value="=" οnclick="cal();"/>
<span id="jg"></span>
</body>
</html>
网页效果显示:
四、 外部对象
浏览器提供的对象,浏览器的API,用来操作浏览器。
1.BOM(Browser Object Model):
#浏览器对象模型,用来访问和操纵浏览器窗口,使JAVAScript有能力与浏览器“对话”。(浏览器与JS是两个不相关的内容,JS依附于浏览器上)
#通过使用BOM,可移动窗口、更改状态栏文本,执行其他不与页面内容发生直接联系的操作。
2.DOM(Document Object Model):
#文档对象模型,用来操作文档。定义了访问和操作HTML文档的标准方法。
#应用程序通过对DOM树的操作,来实现对HTML文档数据的操作。
BOM与DOM关系如下图示:
PS:window代表浏览器,它的子对象(属性)代表浏览器的不同部位。
外部对象分为两个部分BOM与DOM,其中BOM包含DOM.
3.window对象(BOM)
window表示浏览器窗口,所有JAVAScript全局对象、函数以及变量均自动成为window对象的成员。
##常用属性:
#history:浏览过窗口的历史记录对象。
history对象包含用户(在浏览器窗口中)访问过的URL,常用方法:
--back()
--forward()
--go(num):num可以取正数或者负数,正数表示前进,负数表示后退。
#location:窗口文件地址对象。
location对象常用于获取和改变当前浏览器的网址。
href:当前窗口正在浏览器的网页地址,也可以用于修改网址。
--reload():重新载入当前网址,就像按下刷新按钮。
PS:location与超链接都可以改变当前窗口,两者的区别是---location改变当前窗口时可以添加条件,比如可以在页面上显示“您确定要离开此页面吗?”,而超链接不能添加条件,不灵活,一般建议采用location。
显示小代码:
functiontarena() {
var b=confirm("您确定要离开此页面吗?");
if(b){
//确认为true时,跳转。
//location=地址栏
//修改href就是修改网址。
location.href="http://www.tmooc.cn";
}
}
#screen:当前屏幕对象。
screen对象包含有关客户端显示屏幕(比如说ipad、笔记本电脑、手机)的信息,常用于获取屏幕的分辨率和色彩,常用属性:
--width/height
--availWidth/availHeight
#navigator:浏览器相关信息。
常用于获取客户端浏览器和操作系统信息。
Navigator.userAgent;
##常用方法:
(1)alter(str),提示对话框,显示str字符串的内容。
(2)confirm(),确认对话框,显示str字符串的内容,按确定按钮返回true,其他操作返回false.
(3)定时器*重点*
多用于网页动态时钟、制作倒计时、跑马灯效果等。分为两种:
#周期性定时器:以一定的间隔执行代码,循环往复。
setInterval(exp,time):周期性触发代码exp.返回已经启动的定时器对象。
exp为执行语句,time为时间周期,单位为毫秒。
clearInterval(tID):停止启动的定时器。
tID:启动的定时器对象。
小案例:动态时钟代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>动态时钟</title>
<style>
#clock {
width:150px;
border:1px solid red;
line-height:30px;
height:30px;
font-size:20px;
text-align:center;
}
</style>
<script>
//id为空时表示未启动。
var id=null;
function ks(){
//若id非空,表示已启动,不要再次启动了
if(id){
return;
}
id=setInterval(function(){
var date=new Date();
var now=date.toLocaleTimeString();
var p=document.getElementById("clock");
p.innerHTML=now;
},1000);
}
function zt(){
clearInterval(id);
//将id重置为null,便于下次启动时做判断
id=null;
}
</script>
</head>
<body>
<p>
<input type="button" value="开始" οnclick="ks();">
<input type="button" value="暂停" οnclick="zt();">
</p>
<p id="clock"></p>
</body>
</html>
网页显示如下图:
#一次性定时器:在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。
setTimeout(exp,time):一次性触发代码exp.返回已经启动的定时器。
exp为执行语句,time为时间间隔,单位为毫秒。
clearTimeout(tID):停止启动的定时器。
小案例:发送消息代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>发送消息</title>
<style>
#msg {
width:150px;
height:30px;
line-height:30px;
border:1px solid red;
font-size:20px;
text-align:center;
}
</style>
<script>
//默认id为null
var id=null;
function fs() {
var p=document.getElementById("msg");
p.innerHTML="正在发送...";
//启动定时器后id非空
id=setTimeout(function(){
p.innerHTML="发送成功";
//发送成功是id为null
id=null;
},3000);
}
function cx(){
//id非空时表示已启动定时器但未完成,只有此时才能停止定时器。
if(id){
var p=document.getElementById("msg");
p.innerHTML="已撤销";
clearTimeout(id);
}
}
</script>
</head>
<body>
<p>
<input type="button" value="发送" οnclick="fs();"/>
<input type="button" value="撤销" οnclick="cx();"/>
</p>
<p id="msg"></p>
</body>
</html>
网页显示如下图:
4.document对象
4.1 DOM(文档对象模型)
当网页被加载时,浏览器会创建页面的文档对象模型。
DOM节点树(DOM模型被构造为对象的树,这棵树的根就是document对象)
#DOM操作:查找节点、读取节点信息、修改节点信息、创建新节点、删除节点。
4.2 读取、修改
##读取节点的名称和类型
#nodeName:节点名称
--元素节点和属性节点:标签或属性名称。
--文本节点:永远是#text.
--文档节点:永远是#document
#nodeType:节点类型(返回数值)
元素节点返回1,属性节点返回2,文本节点返回3,注释节点返回8,文档节点返回9.
##读写节点的内容(<x>这就是内容</x>),双标签中间的文本。
#innerHTML:设置或获取位于对象起始和结束标签内的HTML(带标签)。
#innerText:设置或获取位于对象起始和结束标签内的文本(不带标签)。
##读写节点的属性
#通用API,任何版本浏览器都支持
getAttribute()方法:根据属性名称获取属性的值。
setAttribute(),removeAttribute().
#新的API,低版本的浏览器不支持(只要增和改)
节点.属性名(class例外,需要写className)
小案例:图片轮播代码演示如下
PS:凡是在funciton外的方法,读取时均是按照顺序读取。
4.3查询
##通过id查询(标准)
document.getElementById(),通过制定的ID来返回元素节点,忽略文档的结构,如果ID错误,则返回null。
##根据标签名查询(标准)
#在整个页面上根据标签名查询节点。
document.getElementsByTagName(“li”),
#在某节点下根据标签名查询其子节点。
ul. getElementsByTagName(“li”),
PS:”li”为要查询的子节点。
##根据name查询(标准)
document.getElementsByName().
##根据class查询某节点(非标准)
getElementsByClassName(),
##根据层次(关系)查询
#查询父亲(标准)
parentNode
#查询孩子(标准)
childNodes.
getElementsByTagName(“li”),建议使用此根据标签名查询孩子的方法。
#查询孩子(非标准)
children.
#查询兄弟(标准)
//某节点.父亲.孩子[n]
jd.parentNode. getElementsByTagName(“li”)[1];
#查询兄弟(非标准)
jd.previousElementSibling;
jd.nextElementSibling;
4.4增删节点
##创建节点
document.createElement(“li”);
li为要创建的元素标签名称,返回新创建的节点。
##增加节点
#追加到所有子节点之后
parentNode.appendChild(newNode);新节点作为父节点的最后一个子节点添加。
#插入到某子节点之前
parentNode.insertBefore(newNode,refNode);refNode为参考节点,新节点位于此节点之前添加。
##删除节点
#父亲删孩子
node.removeChild(childNode);node为childNode的父节点。
#自己删自己(非标准)
(1)sz.parentNode.removeChild("sz");
(2)var tj=document.getElementById("tj");
tj.remove();
小案例:联动菜单代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>联动菜单</title>
</head>
<body>
省:
<select id="province" οnchange="chg();">
<option value="-1">请选择</option>
<option value="0">河北省</option>
<option value="1">山东省</option>
<option value="2">山西省</option>
</select>
市:
<select id="city">
<option>请选择</option>
</select>
<script>
//模拟加载城市
function loadCities() {
return [
["石家庄","廊坊","保定"],
["济南","青岛","德州"],
["太原","大同","阳泉"]
];
}
var cities=loadCities();
function chg() {
//获取省份的下拉选
var sel1=document.getElementById("province");
//获取省份的序号
var pindex=sel1.value;
//获取该省份对应的城市
var pcities=cities[pindex];
//先删除城市下拉选内所有的城市
var sel2=document.getElementById("city");
//
//sel2.innerHTML="<option>请选择</option>";
var options=sel2.getElementsByTagName("option");
for(var i=options.length-1;i;i--){
sel2.removeChild(options[i]);
}
//再增加该省份的城市。
if(pcities){
for(var i=0;i<pcities.length;i++){
var opn=document.createElement("option");
opn.innerHTML=pcities[i];
sel2.appendChild(opn);
}
}
}
</script>
</body>
</html>
网页显示效果如下:
五、自定义对象
自定义对象是一种特殊的数据类型,由属性和方法封装而成。
---属性指与对象有关的值:对象名.属性名。
---方法指对象可以执行的行为或者可以完成的功能:对象名.方法名()
1.创建自定义对象
(1)采用直接量(JSON"JavaScript Object Notation"是一种轻量级的数据交换格式)的方式创建自定义对象
名称需要使用“”引起来,多对定义之间使用,隔开,名称可以是属性。
function f1() {
var stu= {"name":"zs","age":25,"work":function(){alert("我学Java")}};
alert(stu.name);
alert(stu.age);
//work的function方法无返回值,则不需要加alert。
stu.work();
}
(2)采用构造器创建对象
##采用自定义构造器创建对象(自定义了一个构造器Coder,然后每次写时都可以调用Coder构造器)
function f3() {
var c=new Coder("lisi",26,function(){alert("我写Java")});
alert(c.name);
alert(c.age);
c.work();
}
function Coder(name,age,work) {
//this=创建出来的对象
//this.name给该对象声明一个属性
this.name=name;
this.age=age;
this.work=work;
}
六、事件
1.事件概述
事件:指页面元素状态改变,用户在操作鼠标或者键盘时触发的动作。分为鼠标事件、键盘事件、状态改变事件。
event对象:事件触发后将会产生一个event对象。
事件属性:通过一个事件属性,可以在某个事件发生时对某个元素进行某种操作。
2.事件定义
(1)直接定义事件:在html属性定义中直接处理事件。
<input type="button" value="小苹果" οnclick="alert('小苹果 ');"/>
(2)后绑定事件//:在页面加载后执行,写在<body>的整个页面后。(过度的,仅需要了解)
(3)后绑定事件(onload):onload是网页加载事件,在网页加载后自动触发。
为了便于格式的完美性,该段代码,放在<head>中的<script>标签中。
window.οnlοad=function() {
//在这里写的代码相当于在body后一样
var c=document.getElementById("c");
c.οnclick=function() {
alert("小姑娘");
}
}
(4)取消事件
e.stopPropagation()
e.cancelBubbule=true;
e={"stopPropagation":function(){}}
e.stopPropagation()/e.stopPropagation
对象的方法可以看做方法的属性
if(e.stopPropagation){
//如果写成e.stopPropagation(),则没有的话会报错,不带括号的属性没有的话不会报错。
e.stopPropagation();
}else{
e.cancelBubble=true;
}
}
3.event对象
##任何事件出发后都将产生一个event对象,event对象记录事件发生时的鼠标位置、键盘按键状态、触发对象等信息。
##获得event对象,使用event对象获得相关信息,如单击位置、触发对象等。
##常用属性:clientX,clientY,cancleBubble
##获取event对象,
在事件定义时,使用event关键字将事件对象作为参数传入方法。
<input type="button" value="DDD" οnclick="d(event);"/>
<input type="button" value="EEE" id="e"/>
window.οnlοad=function() {
var ee=document.getElementById("e");
ee.οnclick=function(e) {
//后绑定事件时,浏览器会自动传入event,
//且该对象存在arguments第0个位置。
console.log(arguments[0]);
console.log(e);
}
}
function d(e) {
console.log(e);
alert(e.clientX+","+e.clientY);
}
4.事件处理机制
(1)JS事件处理机制是:冒泡机制(JS的事件是由内向外触发的,触发到最外层为止)
(2)作用:不需要再子元素上定义N次事件,只需要在父元素上定义一次事件。
PS:在采用冒泡机制简化事件时,必须知道事件源(事件发生的源头“具体位置”),事件源可以通过事件对象获取。
案例:计算器代码如下
<!DOCTYPE html>
<html>
<head>
<title>计算器</title>
<meta charset="utf-8" />
<style type="text/css">
.panel {
border: 4px solid #ddd;
width: 192px;
margin: 100px auto;
/*border-radius: 6px;*/
}
.panel p, .panel input {
font-family: "微软雅黑";
font-size: 20px;
margin: 4px;
float: left;
/*border-radius: 4px;*/
}
.panel p {
width: 122px;
height: 26px;
border: 1px solid #ddd;
padding: 6px;
overflow: hidden;
}
.panel input {
width: 40px;
height: 40px;
border:1px solid #ddd;
}
</style>
<script>
window.οnlοad=function() {
var div=document.getElementById("panel");
div.οnclick=function(e) {
//console.log(e.srcElement||e.target);
cal(e);
}
}
function cal(e) {
//获取事件源
var obj=e.srcElement||e.target;
//只处理按钮(INPUT)
if(obj.nodeName!="INPUT"){
return;
}
//判断按钮类型
var p=document.getElementById("screen");
if(obj.value=="C") {
//清空
p.innerHTML="";
}else if(obj.value=="="){
//计算
try {
var result=eval(p.innerHTML);
p.innerHTML=result;
}catch(ex){
p.innerHTML="Error";
}
}else {
//累加 旧的值 新的值
p.innerHTML=p.innerHTML+obj.value;
}
}
</script>
</head>
<body>
<div class="panel" id="panel">
<div>
<p id="screen"></p>
<input type="button" value="C">
<div style="clear:both"></div>
</div>
<div >
<input type="button" value="7">
<input type="button" value="8">
<input type="button" value="9">
<input type="button" value="/">
<input type="button" value="4">
<input type="button" value="5">
<input type="button" value="6">
<input type="button" value="*">
<input type="button" value="1">
<input type="button" value="2">
<input type="button" value="3">
<input type="button" value="-">
<input type="button" value="0">
<input type="button" value=".">
<input type="button" value="=">
<input type="button" value="+">
<div style="clear:both"></div>
</div>
</div>
</body>
</html>
页面显示效果: