JavaScript
作用
用于给页面添加动态效果和动态内容
用于强化与用户的交互性
可以理解为盖房子时,给房子装智能家居,你做啥,房子就会对应的给你什么反应
注意:不要把 js 与 jsp 搞混淆了,这是两个不同的语言
js 为 JavaScript,jsp 为 Java Server Pages(JAVA服务器页面,是一种动态网页技术标准)
语言特点
- js属于脚本语言,不需要编译,由浏览器解析执行
- 属于弱类型语言
- 基于面向对象
- 安全性高:js语言只能访问浏览器内部的数据,不能访问浏览器以外(磁盘中的)的数据
- 交互性高,由于js语言可以直接嵌入到HTML页面中,可以和用户直接进行交互
三种js的引入方式
-
内联:
在标签的事件属性中添加js代码,当事件触发时js代码运行<!-- 内联方式添加js,onclick为点击事件,alert为弹框 --> <input type="button" onclick="alert('试试就试试')" value="点我试试" />
-
内部:
在html页面中任意位置添加script标签,在标签体内写js代码,当页面加载时执行js代码<!-- 内部方式引入js --> <script type="text/javascript"> alert("内部引入成功!") </script>
-
外部
在单独的js文件中写js代码,通过script标签的src属性引入到HTML页面中<!-- 外部方式引入js,src里面写外部js文件的路径,charset为设置字符集 --> <script src="first.js" type="text/javascript" charset="utf-8"></script>
注意:js文件可以在HTML任意位置引入,外部引入标签内不能使用内部js代码,写了src就只能用src路径里的
js语法
变量的声明和赋值
数据类型
语句
运算符
方法声明
面向对象
数据类型
js中只有对象类型
常见的对象类型
- 数值 number
- 字符串 string js中的字符串可以用单引号或双引号修饰
- 布尔值 boolean true/false
- 未定义 undefined 当变量只声明不赋值时,此变量为未定义类型
- 自定义对象类型 object
变量声明和赋值
var x = 10; //声明一个全局变量,页面中任意位置可以访问
let x = 10; //声明一个局部变量,有作用域,声明在哪里就只能在哪里使用
运算符
同java一样
其中不一样的点:
==先统一类型再比较值
===先比较类型再比较值
/ 除号,除法运算,会自动转换整数和小数
typeof 得到变量类型
var a = 66;
var b = "66";
typeof b;
"string"
typeof a;
"number"
typeof 66+6; //注意,会先typeof 66 ,得到66的类型字符串,再和6拼接成新字符串
"number6"
语句
if else
while
do while
for
switch case
和java大致相同
不同点:
- if和while括号里面的内容
如果不是boolean值,会自动转换为布尔值
转换规则:数值(0为false,其余为true)、字符串(空串转false)、未定义转false、null转false - for循环中 int i 改为var i 或者let i
方法声明
声明方法的三种方式
1、function 方法名(参数列表){方法体}
function 方法名(参数列表){方法体}
声明四种常见方法
- 无参无返回值
- 无参有返回值
- 有参无返回值
- 有参有返回值
<script type="text/javascript">
/* 无参无返回值 */
function fn1(){
alert("fn1无参无返回值执行!");
}
fn1();//调用
/* 无参有返回值 */
function fn2(){
return "fn2无参有返回值执行!";
}
var str = fn2();//调用
alert(str);
/* 有参无返回值 */
function fn3(name, age){
alert("fn3有参无返回值执行:"+name+","+age);
}
fn3("陶小星星", 18);//调用
/* 有参有返回值 */
function fn4(name, age){
return "fn4有参有返回值执行:"+name+","+age;
}
alert(fn4("亮晶晶", 18))//调用
</script>
2、var 方法名 = function(参数){方法体}
var fn5 = function(name, age){
alert("fn5执行:"+name+","+age);
}
fn5("章火火",20);
3、var 方法名 = new Function(“参数1”,“参数2”,“方法体”);
前面可传多个参数,只用保证最后一个是方法体
var fn6 = new Function("name","age","alert('fn6执行:'+name+','+age)");
fn6("丁睿智",19);
页面相关的方法和属性
1、通过id获取页面中的元素对象
var d = document.getElementById(“id名”);
var d = document.getElementById("d1");
2、通过标签名获取页面中的元素对象们
var arr = document.getElementsByTagName(“img”);
获取标签名为img的元素对象们
var arr = document.getElementsByTagName("img");
//结果 arr为HTMLCollection(3) [img, img, img]
3、修改元素标签中的文本内容
d.innerText=“新内容”;
d.innerText 获取元素中的文本内容
var d = document.getElementById("d1");//先获取修改的标签元素
d.innerText = "章憨憨"; //对获取的元素进行修改其文本内容
alert(d.innerText); //将获取的元素文本弹框显示
"章憨憨"
4、获取文本框中输入的值
i.value 获取值,可以重新=赋值
var i = document.getElementById("i1"); //获取文本框元素
i.value; //获取值
"丁嘚嘚"
i.value = "丁火火"; //修改值
"丁火火"
在Chrome浏览器里面,我们可以省略写元素的获取 document.getElementById(“id名”)
可以直接写id名来调用方法
d1.innerText = i1.value;
"丁火火"
5、判断是不是个数
显示NaN 表示不是个数 Not a Number
isNaN(x) 判断x是不是NaN,是NaN,返回true,表示不是个数
6、获取并修改html内容
标签.innerHTML 获取标签的HTML内容
标签.innerHTML = 设置的HTML(注意:=是修改,+=是追加)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<input type="button" value="添加" onclick="fn()" />
<div id="d1"></div>
<script type="text/javascript">
var n = 0;
function fn(){
n++;
//等号是直接覆盖
//d1.innerHTML += "<h1>"+n+"<h1>";
//加等是在下面添加
d1.innerHTML += "<h1>"+n+"<h1>";
}
</script>
</body>
</html>
7、定时器
开启定时器
var timer = setInterval(方法,时间间隔);
如果不涉及停止计时器,我们不用获取timer
停止计时器 clearInterval(timer);
只执行一次的计时器 setTimeout(方法,执行的时间);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<input type="button" value="添加" onclick="fn()" />
<div id="d1"></div>
<script type="text/javascript">
//计时器
var t = 0;
//function timefn(){
// t++;
// //等号是直接覆盖
// d1.innerHTML = "<h1>"+t+"<h1>";
//}
// setInterval(timefn,1000)
var timer = setInterval(function() {
t++;
d1.innerHTML = "<h1>" + t + "<h1>";
if (t == 10) {
//停止定时器
clearInterval(timer);
}
}, 1000);
// 只执行一次的计时器
setTimeout(function(){
alert("我是你爸爸真伟大,养你这么大");
},3000);
</script>
</body>
</html>
轮播图练习
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
div,img{
width: 600px;
height: 300px;
/* 隐藏图片 */
/* display: none; */
}
</style>
</head>
<body>
<div>
<img src="../imgs/a.jpg" >
<img src="../imgs/b.jpg" >
<img src="../imgs/c.jpg" >
</div>
<script type="text/javascript">
//获取img类标签的元素们
var arr = document.getElementsByTagName("img");
//先将不是第一张的都隐藏的都隐藏
for(let i=0;i<arr.length;i++){
if(i!=0){
arr[i].style.display = "none";
}
}
//开始轮播
var t = 0;
setInterval(function(){
t++;
//遍历每一个图片标签
for(let i=0;i<arr.length;i++){
//如果是需求下标则隐藏
// if(i==t%arr.length){
// arr[i].style.display = "inline-block";
// }else{
// arr[i].style.display = "none";
// }
//三目替代上述代码
arr[i].style.display = i==t%arr.length?"inline-block":"none";
}
},1000);
</script>
</body>
</html>
对象分类
1、内置对象
string、number、boolean…
2、浏览器相关对象 BOM
Browser浏览器Object对象Model模型
window对象(窗口对象)
在window对象中的方法和属性称为全局方法和全局属性
调用时可以省略掉window
例如:window.alert(); 我们省略为 alert();
window中常见方法
alert() 提示框
confirm() 确认框,有返回值,点确认返回true,点击取消返回false
prompt() 文本确认框,有返回值,返回文本框中输入的值
window中常见属性
- 位置 localtion
location.href 获取当前地址,可以使用=号赋值修改 - 历史 history
history.length 获取历史页面数量
history.back() 返回历史记录的上一个页面
history.forward() 前进一个页面
history.go(n) n正值前进n个页面,n负值后退n个页面 - 屏幕screen
screen.width/height() 屏幕分辨率
screen.availWidth/availHeight 可用分辨率 - 导航navigator
navigator.userAgent 获取浏览器版本信息
3、页面相关对象 DOM
Domcument文档 Object对象 Model模型
页面相关的内容
学习DOM主要学习的就是如何对页面的标签进行增删改查操作
查询标签
-
通过id查询标签
var d = document.getElementById("d1");
-
通过标签名查询标签
var arr = document.getElementsByTagName("img"); //结果 arr为HTMLCollection(3) [img, img, img]
-
获取body
document.body.innerHTML+="<h1>123</h1>";
添加标签
创建标签对象
var h = document.createElement("h3");
h.innerText="创建的标签";
添加标签
父标签.appendChild(创建的标签对象);
添加标签的方式
先创建标签对象,再将该对象添加到页面中
//添加标签方式一:写法简单,但是功能受限
document.body.innerHTML="<h3>创建的标签</h3>";
//添加标签方式二:写法麻烦,但是这样添加的标签可以添加CSS和js
//先创建一个标签对象,指定标签类型
var h = document.createElement("h3");
//给标签里面的文本内容赋值
h.innerText="创建的标签";
//将创建的标签对象添加到body元素中
document.body.appendChild(h);
删除标签
父标签.removeChild(标签名);
删除body里面的id为d1的标签
document.body.removeChild(d1);
修改标签
-
修改文本内容
标签.innerText="修改的内容";
-
修改HTML内容
标签.innerHTML="<xxx></xxx>";
-
修改CSS样式
标签.style.样式名="值";
注意:所有CSS样式名中的"-"去掉,并变成驼峰命名
练习
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<input type="text" id="i1" />
<input type="button" value="添加" onclick="addfn()" />
<input type="button" value="删除" onclick="remfn()" />
<input type="button" value="修改" onclick="upfn()" />
<ul id="myul">
<li>北京</li>
<li id="sh">上海</li>
<li>广州</li>
</ul>
<script type="text/javascript">
function addfn(){
var li = document.createElement("li");
li.innerText=i1.value;
myul.appendChild(li);
}
function remfn(){
var d = document.getElementById(i1.value);
myul.removeChild(d);
}
function upfn(){
sh.style.color=i1.value;
}
</script>
</body>
</html>
练习:QQ好友分组
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QQ好友列表</title>
</head>
<body>
<ul>
<li onclick="fn(this)">
亲戚
<ul class="c1">
<li>老大爷</li>
<li>你大爷</li>
<li>你二大爷</li>
</ul>
</li>
<li onclick="fn(this)">
同事
<ul class="c1">
<li>马云</li>
<li>马化腾</li>
<li>王健林</li>
</ul>
</li>
<li onclick="fn(this)">
女朋友们
<ul class="c1">
<li>杨幂</li>
<li>赵丽颖</li>
<li>关晓彤</li>
</ul>
</li>
</ul>
<script type="text/javascript">
//得到所有的二层
var arr = document.getElementsByClassName("c1");
for(let i=0;i<arr.length;i++){
arr[i].style.display="none";
}
function fn(li){
var ul = li.getElementsByTagName("ul")[0];
ul.style.display=ul.style.display=="none"?"block":"none";
}
</script>
</body>
</html>
事件
事件介绍
事件就是系统给提供的一些特定的时间点
事件包括:鼠标事件、键盘事件、状态改变事件
鼠标事件
- onclick 鼠标点击事件
- onmouseover 鼠标移入事件
- onmouseout 鼠标移出事件
- onmousedown 鼠标按下事件
- onmouseup 鼠标抬起事件
- onmousemove 鼠标移动事件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#d1{
width: 200px;
height: 200px;
border: 1px solid aqua;
}
</style>
</head>
<body>
<div id="d1"
onmouseover="overfn()"
onmouseout="outfn()"
onmousedown="downfn()"
onmouseup="upfn()"
onmousemove="movefn()"
></div>
<script type="text/javascript">
function overfn(){
d1.innerText = "鼠标移入";
}
function outfn(){
d1.innerText = "鼠标移出";
}
function downfn(){
d1.innerText = "鼠标按下";
}
function upfn(){
d1.innerText = "鼠标抬起";
}
function movefn(){
d1.innerText += "鼠标移动";
}
</script>
</body>
</html>
键盘事件
- onkeydown 键盘按下
- onkeyup 键盘抬起
event.keyCode 得到键盘编码
String.fromCharCode(event.keyCode); 把用户按下的编码转成字符
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<input type="text" onkeydown="keydown()" onkeyup="keyup()" />
<script type="text/javascript">
function keydown(){
// event.keyCode得到键盘编码
d1.innerText = "键盘按下"+event.keyCode;
}
function keyup () {
//把用户按下的编码转成字符
var str = String.fromCharCode(event.keyCode);
d1.innerText = "键盘抬起:"+str;
}
</script>
</body>
</html>
状态改变事件
- onchange 值改变事件
- onload 页面加载完成事件
- onresize 窗口尺寸改变事件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{
background-image: url("../imgs/c.jpg");
}
</style>
</head>
<body>
<script type="text/javascript">
//页面加载完成事件
onload = function(){
//获取窗口宽高
var w = document.body.parentElement.clientWidth;
var h = document.body.parentElement.clientHeight;
//把得到的宽高,赋值给body的背景图片尺寸
document.body.style.backgroundSize = w+"px "+h+"px";
}
//窗口尺寸改变事件
onresize = function(){
//获取窗口宽高
var w = document.body.parentElement.clientWidth;
var h = document.body.parentElement.clientHeight;
document.body.style.backgroundSize = w+"px "+h+"px";
}
</script>
<div id="d1"></div>
</body>
</html>
事件的绑定
-
标签中添加事件属性
入上述案例<input type="text" onkeydown="keydown()" onkeyup="keyup()" />
-
动态绑定
通过js代码写的,都是动态绑定<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <input type="button" value="按钮1" onclick="fn1()" /> <input type="button" value="按钮2" id="btn" /> <script type="text/javascript"> function fn1(){ alert("fn1触发") } //动态绑定事件 btn.onclick = function(){ alert("动态绑定成功") } </script> </body> </html>
事件传递
如果某一个范围需要影响多个事件,事件的响应顺序是从最底层标签往上层传递
类似于气泡从下往上冒泡,所以事件传递也叫冒泡传递
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
div,p,input{
border: 1px solid aquamarine;
}
</style>
</head>
<body>
<div onclick="alert('div')">
<p onclick="alert('p')">
<input type="button" value="按钮" onclick="alert('按钮')" />
</p>
</div>
</body>
</html>
订单计算练习
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h3>订单列表</h3>
<input type="checkbox" id="c1" value="30" onclick="cal()" />鼠标30元
<input type="checkbox" id="c2" value="80" onclick="cal()" />键盘80元
<input type="checkbox" id="c3" value="3000" onclick="cal()" />手机3000元
<input type="checkbox" id="c4" value="6000" onclick="cal()" />电脑6000元
<input type="checkbox" id="c5" onclick="fn(this)" />全选
<p id="p1">总价:0元</p>
<script type="text/javascript">
//声明计算方法
function cal(){
//定义总价
var money = 0;
//得到所有多选框
var arr = document.getElementsByTagName("input");
//循环所有多选框
for(let i=0;i<arr.length;i++){
//排除掉全选和未选中的
if(arr[i].id=="c5"||!arr[i].checked){
continue;
}
//求和,将商品价格转为整数计算
var price = parseInt(arr[i].value)
money=money+price;
}
//将计算的和写入到p中
p1.innerText = "总价:"+money+"元";
}
function fn(input){
//得到全选状态
var check = input.checked;
//得到所有的多选框
var arr = document.getElementsByTagName("input");
//循环所有多选框,让每个多选框与全选框保持一致
for(let i=0;i<arr.length;i++){
arr[i].checked = check;
}
//最后调用计算总价的方法
cal();
}
</script>
</body>
</html>