JavaScript<交互>
一,什么是Javascript
w3school 在线教程 :https://www.w3school.com.cn/js/index.asp
菜鸟教程:https://www.runoob.com/js/js-tutorial.html
JavaScript教程:https://www.liaoxuefeng.com/wiki/1022910821149312
(1)概述
JavaScript是一门世界上最流行的脚本语言
Java、 JavaScript
(2)历史
1.1、概述
JavaScript的起源故事:
https://blog.csdn.net/kese7952/article/details/79357868
ECMAScript它可以理解为是Javascript的一个标准
最新版本已经到es6版本-
但是大部分浏览器还只停留在支持es5代码上!
开发环境一线上环境,版本不一致
二,快速入门
(1)引入JavaSciprt
1、内部标签
<script>
alert("法外狂徒张三");//...
</script>
2、外部引入
ab.js
alert("法外狂徒张三")
index.html
<!--外部引入
注意:script必须成对出现
-->
<script src="外部引入.js">
</script>
<!--不用显示定义type,也默认就是javaScript-->
<script type="text/javascript"></script>
(2)基本语法
<!--JavaScript严格区分大小写-->
<script>
//1,定义变量 java:变量类型 变量名=变量值
var score=77;
//2,条件控制
if(score>=60&&score<70){
alert("[60,70)")
}else if(score>=70&&score<80){
alert("[70,80)")
}else{
alert("other")
}
//console.log(score)在浏览器的控制台打印变量!sout
</script>
浏览器必备调试须知:
(3)数据类型
数值,文本,图形,音频,视频
1,number
js不区分小数和整数,Number
123//整数123
123.1//浮点数123.1
1.123e3//科学计数法
-99//负数
NaN //not a number
Infinity // 表示无限大
2,字符串 ‘abc’ “abc”
3,布尔值 true,false
4,逻辑运算
&& 两个都为真,结果为真
|| 一个为真,结果为真
! 真即假,假即真
5,比较运算符
=
1,"1"
== 等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样,值一样,结果为true)
这是一个JS的缺陷,坚持不要使用 == 比较
须知:
NaN === NaN,这个与所有的数值都不相等,包括自己
只能通过isNaN(NaN)来判断这个数是否是NaN
浮点数问题:
尽量避免使用浮点数进行运算,存在精度问题!
6,null 和 undefined
null 空
undefined 未定义
7,数组
Java的数组必须是相同类型的对象,JS中不需要这样
//保证代码的可读性,尽量使用[]
var arr = [1,2,3,4,5,'hello',null,true];
//第二种定义方法
new Array(1,2,3,4,5,'hello');
取数字下标:如果越界了,就会 报undefined
8,对象
对象是大括号,数组是中括号
每个属性之间使用逗号隔开,最后一个属性不需要逗号
9,变量 var score=77;
(4)严格检查格式
前提:IDEA需要设置支持ES6语法
‘use strict’;严格检查模式,预防JavaScript的随意性导致产生的一些问题
必须写在JavaScript的第一行!
局部变量建议都使用let去定义~
'use strict'
// i=1;默认为全局变量
let i=1; //ES6 let
三,数据类型
(1)字符串
1、正常字符串我们使用 单引号,或者双引号包裹
2、注意转义字符 \
\u4e2d \u##### Unicode字符
\x41 Ascall字符
3、多行字符串编写
4、模板字符串
5、字符串长度 str.length
6、字符串的可变性,不可变
7、大小写转换
注意,这里是方法,不是属性了 student.toLowerCase();
8、student.indexof(‘t’)获取指定字符的下标
9、substring 包前不包后
(2)数组
Array可以包含任意的数据类型
1、长度
注意:假如给arr.lennth赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失
2、indexOf,通过元素获得下标索引
字符串的"1"和数字 1 是不同的
3、slice()截取Array的一部分,返回的一个新数组,类似于String中substring
4、push(),pop()尾部
push:压入到尾部
pop:弹出尾部的一个元素
5、unshift(),shift() 头部
unshift:压入到头部
shift:弹出头部的一个元素
6、排序sort()
sort() 方法以字母顺序对数组进行排序
7、元素反转reverse()
8、concat()
注意:concat()并没有修改数组,只是会返回一个新的数组
9、连接符join
打印拼接数组,使用特定的字符串连接
10、多维数组
数组:存储数据
(3)对象
若干个键值对
var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:属性值
}
//定义了一个person对象,它有4个属性
var person= {
name: "张三",
age: 18,
email: "1101101109@qq.com",
score: 110
}
Js中对象,{…}表示一个对象,键值对描述属性XXX:xxx,多个属性之间用逗号隔开,最后一个属性不加逗号!
JavaScript中的所有的键都是字符串,值是任意对象!
1、对象赋值
2、使用一个不存在的对象属性,不会报错!undefined
3、动态的删减属性,通过delete删除对象的属性
4、动态的添加,直接给新的属性添加值即可
5、判断属性值是否在这个对象中!xxx in xxx
6、判断一个属性是否是这个对象自身拥有的 hasOwnProperty()
(4)流程控制
1、if判断
2、while循环,避免程序死循环
3、for循环
4、forEach循环
5、for …in 下标
for …of 值
(5)Map和Set
1、Map
2、Set:无序不重复的集合
(6)使用iterator来遍历迭代我们Map,Set
1、 for …of 遍历数组
2、 for …of 遍历Map
3、 for …of 遍历set
四,函数
(1)定义函数
1,定义方式
定义方式一
一旦执行到return代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是NaN
定义方式二
function(x){…}这是一个匿名函数。但是可以吧结果赋值给abs,通过abs就可以调用函数!
方式一和方式二等价!
2,参数问题-不存在参数
参数问题:javaScript可以传任意个参数,也可以不传递参数
假设不存在参数,如何规避?
3,参数问题-存在多个参数arguments
arguments是一个JS的关键字,其代表,传递进来的所有参数,是一个数组!
问题:arguments包含所有的参数,我们有时候想使用多余的参数来进行附加操作。需要排除已有参数
4,参数问题-存在多个参数 …rest
ES6引入的新特性,获取除了已经定义的参数之外的所有参数
rest参数只能写在最后面,必须用…标识
(2)变量的作用域
1,在javascript中,var定义变量实际是有作用域的
假设在函数体中声明,则在函数体外不可以使用(非要实现的话,可用闭包)
function f() {
var x=1;
x=x+1;
}
x=x+2;//Uncaught ReferenceError: x is not defined
如果两个函数使用了相同的变量名,只要在函数内部就不冲突
2,内部函数可以访问外部函数的成员,反之则不行
function f(){
var x=1;
//内部函数可以访问外部函数的成员,反之则不行
function ff(){
var y=x+1;
}
var z=y+2;//ReferenceError: y is not defined
}
3,假设,内部函数变量和外部函数变量,重名
假设在JavaScript中,函数查找变量从自身函数开始, 由“内”向“外”查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。
4,提升变量的作用域
结果:x undefined
说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值;
养成规范:所有的变量定义都放在函数的头部,便于代码维护
function f(){
var x=1,
y=x+1,
z,i,a;//undefined
//之后随意用
a=1;
}
5,全局变量
全局对象window
alert() 这个函数本身也是一个window的变量
var x='xxx';
window.alert(x);
var old_alert=window.alert;
//old_alert(x);
window.alert=function(){
};
//发现alert()失效了
window.alert(123);
//恢复alert
window.alert=old_alert;
window.alert(999);
javascript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错 Refrence
规范:
由于我们的所有变量都会绑定到window上,。如果不同的js文件,使用了相同的全局变量,就会产生冲突—>如何减少这样的冲突?
//唯一全局变量
var zhangsan={};
//定义全局变量
zhangsan.name='张三';
zhangsan.add=function(a,b){
return a+b;
}
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突问题~
jQuery中就是使用的该方法:jQuery.name,简便写法:$()
6,局部作用域let关键字,解决了局部作用域冲突的问题
ES6的let关键字,解决了局部作用域冲突的问题
建议使用let去定义局部作用域的变量
7,常量const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值。
在ES6引入了常量关键字 const
(3)方法
(1)定义方法
this.代表什么?拆开上面的代码看看:this默认指向调用它的对象
(2)apply在js中可以控制this指向
五,内部对象
(1)标准对象
(2)Date
1,基本使用
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear();//年
now.getMonth();//月
now.getDate();//日
now.getDay();//星期几
now.getHours();//时
now.getMinutes();//分
now.getSeconds();//秒
now.getTime();//时间戳 全世界统一
如果要创建一个指定日期和时间的Date对象,可以用:
var d = new Date(2015, 5, 19, 20, 15, 30, 123);
d; // Fri Jun 19 2015 20:15:30 GMT+0800 (CST)
2,转换
console.log(new Date(1624508138748))//时间戳转为时间
(3)JSON
1,JSON是什么
在javascript中,一切皆为对象,任何js支持的类型都可以用JSON表示
格式:
对象都用{}
数组都用[]
所有的键值对 都是用key:value
2,JSON字符串和js对象转化
JSON和JS对象的区别
3,数据传输的XML文件
<!--JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。如
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
-->
<!--jackson databind: 数据绑定包,提供Java对象与JSON数据格式进行序列化及反序列化的支持
序列化:将对象写入IO流中;
反序列化:从IO流中恢复对象;
-->
<!--简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,
然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
4,AJAX
https://www.runoob.com/ajax/ajax-tutorial.html
Ajax 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面。
5,jQuery封装好的方法 $(#name).ajax("")
jQuery API 中文文档:https://jquery.cuishifeng.cn/
//js:嵌入动态文本于HTML页面。对浏览器事件做出响应
//页面加载完成以后执行function代码
$(function () {
//jquery,使用$("#id")通过元素id获取某个页面元素
$("#login_form").submit(function () {
//ajax自己发请求
$.ajax({
url:"../login", //请求的服务路径
type: "post", //请求方法
//contentType: "", //请求的数据类型:请求头Content-Type,默认表单格式,json要指定json
data: $("#login_form").serialize(), //请求数据:使用序列化表单的数据
dataType: "json", //响应的数据类型:使用json要指定
//通过回调函数,响应200时,获得响应的数据
success: function (r) {//响应体json字符串,解析为方法参数
if(r.success){
//前端页面url直接跳转到某个路径
window.location.href="../jsp/articleList.jsp";
}else {
alert("错误码:"+r.code+"\n错误消息:"+r.message)
}
}
})
//统一不执行默认的表单提交
return false;
})
})
六,面向对象编程
(1)什么是面向对象
原型:<父类>
(2)class继承
class关键字,是在ES6引入的
1,给原型增加一个方法
function Student(name){
this.name=name;
}
//给student原型新增一个方法
Student.prototype.hello=function(){
alert("hello");
}
2,定义一个类,属性 方法
//定义一个学生的类
class Student{
constructor(name){
this.name=name;
}
hello(){
alert('hello');
}
}
var zhangsan=new Student("张三");
var wangwu=new Student("王五");
zhangsan.hello()
3,继承
本质:原型对象
4,原型链
七,操作BOM对象
(1)浏览器介绍
javascript和浏览器关系?
js的出现就是为了能让它在浏览器中运行
浏览器中包含JavaScript引擎,由JavaScript引擎提供语言层面的支持;但JavaScript引擎只是浏览器中必不可少的一小部分,浏览器中还包括网络进程、GPU进程、任务队列…是一个庞大的协作结构,浏览器通过各部分的协作提供语言之外的实现,比如网络请求、视图渲染、事件监听。
BOM:浏览器对象模型
浏览器:
IE6~11 Chrome
Safari FireFox
Opera
三方:
QQ浏览器
360浏览器
(2)window
window代表浏览器窗口
(3)Navigator(不建议使用)
Navigator封装了浏览器的信息
大多数时候,我们不会使用navigator对象,因为会被人为修改
不建议使用这些属性来判断和编写代码
(4)screen
代表屏幕尺寸
(5)location(重要)
location代表当前页面的URL信息
//设置新的地址
location.assign(“https://blog.csdn.net/m0_50507927”);
(6)document(内容DOM)
document代表当前的页面,HTML DOM文档树
获取具体的文档树节点
获取cookie
劫持cookie原理
服务器端可以设置cookie为httpOnly
(7)history(不建议使用 )
history代表浏览器的历史记录
八,操作DOM对象
DOM:文档对象模型
浏览器网页就是一个Dom树形结构
更新:更新Dom节点
遍历Dom节点:得到Dom节点
删除:删除一个Dom节点
添加:添加一个新的节点
要操作一个Dom节点,就必须要先获得这个Dom节点
(1)获得Dom节点
<body>
<div id="father">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//对应css选择器
var h1=document.getElementsByTagName('h1');
var p1=document.getElementById('p1');
var p2=document.getElementsByClassName('p2');
var father=document.getElementById('father');
var childrens=father.children;//获取父节点下的所有子节点
// father.firstChild;
// father.lastChild;
</script>
这是原生代码,之后我们尽量都使用jQuery();
(2)更新节点
1,操作文本
2,操作css
(3)删除节点
删除节点的步骤:先获取父节点,再通过父节点删除自己
注意:删除多个节点的时候,children是在时刻变化的,删除节点的时候一定要注意。
(4)插入节点
我们获得了某个Dom节点,假设这个dom节点是空的,我们通过innerHTML就可以增加一个元素了,但是这个Dom节点已经存在元素了,我们就不能这么干了!会产生覆盖
追加append
1,将已有的标签追加
2,创建新的标签追加
3,setAttribute
属性:
newP.id=‘newP’;//等价 newP.setAttribute(‘id’,‘newP’)
//创建一个标签节点
var myScript = document.creatElement('script');
myScript.setAttribute('type','text/javascript');
//可以创建一个style标签
var myStyle=document.createElement('style');//创建了一个空的style标签
myStyle.setAttribute('type','text/css');
myStyle.innerHTML='bady{background-color:chartreuse;}';//设置标签内容
相当于:
(5)insertBefore
var ee = document.getElementById('ee');
var js = document.getElementById('js');
var list = document.getElementById('list');
//要包含的节点.insertBefore(newNode,targetNode)
list.insertBefore(js,ee);
九,操作表单(验证)
(1)表单是什么?form-----DOM树
文本框----text
下拉框----select
单选框----radio
多选框----checkbox
隐藏域----hidden
密码框----password
…
表单的目的:提交信息
(2)获得要提交的信息
<body>
<form action="post">
<p>
<span>用户名:</span>
<input type="text" id="username">
</p>
<!--多选框的值,就是定义的value-->
<p>
<span>性别</span>
<input type="radio" name="sex" value="man" id="boy">男
<input type="radio" name="sex" value="women" id="girl">女
</p>
</form>
<script>
var input_text=document.getElementById('username');
var boy_radio=document.getElementById('boy');
var girl_radio=document.getElementById('girl');
//对于单选框,多选框等固定的值,boy_radio.value只能取到当前的值
boy_radio.checked;//查看返回的结果,是否为true,如果为true,则被选中
</script>
(3)提交表单
绑定按钮
(4)md5加密密码,表单优化
(4)表单绑定提交事件
<script>
function check() {
var username=document.getElementById('username');
var password=document.getElementById('input-password');
var md5pwd = document.getElementById("md5-password");
md5pwd.value=md5(password.value);
console.log(username.value);
console.log(password.value);
// //MD5算法加密
// password.value = mad5(password.value);
//可以校验判断表单内容,true就是通过提交,false,阻止提交
return true;
}
</script>
十,jQuery
jQuery API 中文文档:https://jquery.cuishifeng.cn/
javaScript和jQuery的关系?
jQuery库,里面存在大量的JavaScript函数
(1)获取jQuery 公式:$(selector).action()
封装
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- jQuery的cdn加速地址 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
</head>
<body>
<a href="" id="test-jquery">点我</a>
<script>
document.getElementById('id');
//选择器就是css的选择器
$('#test-jquery').click(function(){
alert('hello, jQuery');
}
);
</script>
</body>
</html>
(2)选择器
<script>
//原生js,选择器少,麻烦不好记
//标签
document.getElementsByTagName();
//id
document.getElementById();
//类
document.getElementsByClassName();
//jQuery css中的选择器它全部都能用
$('p').click();//标签选择器
$('#id1').click();//id选择器
$('.class1').click();//class选择器
</script>
(3)事件
鼠标事件、键盘事件,其他事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#divMove{
width: 100px;
height: 100px;
border: 1px solid red;
}
</style>
<!-- MD5工具类 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
</head>
<body>
<!--要求:获取鼠标当前的一个坐标-->
mouse:<span id="mouseMove"></span>
<div id="divMove">
在这里移动鼠标试试
</div>
<script>
//当网页加载完毕之后,响应事件
// $(document).ready(function () {
// })
$(function () {
$('#divMove').mousemove(function(e){
$('#mouseMove').text('x:'+e.pageX+'y:'+e.pageY)
})
});
</script>
</body>
</html>
(4)操作DOM元素
节点文本操作
CSS的操作
$('#test-ul li[name=python]').css("color","red");
元素的显示和隐藏,:本质display:none
$('#test-ul li[name=python]').show();
$('#test-ul li[name=python]').hide();
娱乐测试
$(window).width()
$(window).height()
$(’#test-ul li[name=python]’).toggle();//对表格切换 显示/隐藏
ajax()
$(’#form’).ajax()
$.ajax({url:“test.html”,context:document.body,success:function(){
$(this).addClass(“done”);
}})