JavaScript
1.快速入门
1.1.第一个JavaScript程序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 内部引入-->
<!-- <script>-->
<!-- alert('Hello World');-->
<!-- </script>-->
<!-- 外部引入-->
<script src="js/firstJavaScript.js"></script>
</head>
<body>
</body>
</html>
alert("Hello world");
1.2.基本语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// 1.变量
var num=1;
var name="mashiro";
// 2.条件控制
if (true){
"...";
}else if (true){
"...";
}else{
"...";
}
// 3.控制台打印变量 console.log(xxx);
</script>
</head>
<body>
</body>
</html>
1.3.数据类型
- 数值 numbre
// 普通数
111;
111.23;
1.7e10;
-98;
// Not a Number
NaN;
// 无穷大
Infinity;
- 字符串
'ABC' "ABC" '\n'
- boolean
true false
- 逻辑运算
&&,||,!
- 比较运算
= //赋值
== //等于(类型不一样,值一样,为true)
=== //绝对等于(类型一样,值一样,为true)
NaN 不等于所有数,包括自己.判断NaN:isNaN(NaN)
- null undefine
null: 空
undefined:未定义
- 数组 []
var arr = [1,2,3,'A',"ABC",true];
- 对象 {}
var person = {
name:"mashiro",
age:8,
tags:"java"
};
1.4.严格检查模式
'use strict';
let i = 1;
2.数据类型
2.1.字符串
- 定义一个字符串用单引号或双引号包裹
- 注意转义字符 \
- 多行字符串
<script>
'use strict'
let string = `javascript
hello
wrold
~
`
</script>
- 模板字符串
<script>
'use strict'
let name = 'mashiro';
let age = 3;
var string = `hello,${name}`;
console.log(string)
</script>
- 字符串长度
console.log(student.length)
- 字符串下标
console.log(student[1]);
- 大小写切换
console.log(student.toUpperCase());
console.log(student.toLowerCase());
- indexOf()
console.log(student.indexOf('u'));
- subString()
/*从第一个字符开始到第三个字符(不包含第三个)[1,3)*/
console.log(student.substring(1,3));
2.2.数组
Array可以包含任意的数据类型
var arr=[1,2,3,4,5,6]
- 长度
console.log(arr.length);
//可以给arr,length赋值。
- indexOf
console.log(arr.indexOf(2));
- slice
console.log(arr.slice(1,5)); // 类似字符串中的subString()
- push & pop (类似出入栈)
arr.push(7);
arr.pop();
- unshift & shift
arr.unshift(7,8); // 在数组头部压入元素
arr.shift(); // 弹出数组头部元素
- 排序 & 反转
arr.sort(); // 排序
arr.reverse(); // 反转
- 数组拼接
arr.concat(arr2)
- 连接符
// 打印数组,并使用‘-’符号连接
arr2.join('-');
- 多维数组
var arr3 = [[1,2],[3,4],[5,6]]
2.3.对象 【若干个键值对】
var user = {
name: 'mashiro',
age: 18,
password: '123456'
}
- 对象赋值
user.age = 20;
- 使用不存在的属性,不会报错
user.email
//undefined
- 动态删减属性
delete user.name
- 动态添加属性【直接给新的属性添加值即可】
user.email = '111@163.com'
- 判断字段是否在对象中
'age' in user
//true
'toString' in user
//true
- 判断字段是否在原生对象中
user.hasOwnProperty('age')
//true
user.hasOwnProperty('toString')
//false
2.4.Map & Set (ES6新特性)
- Map
var map = new Map([['mashiro',100],['nagisa',90],['makoto',80]]);
var value = map.get('mashiro'); // 通过key获得value
map.set('admin',111); // 给map添加值
console.log(value);
- Set
var set = new Set([3,1,4,1,2]);
set.add(5);
set.delete(1);
set.has(3); // true
2.5.Iterator
- for-in & for-of
let arr = [10,9,8,6,7,5,3,21,54,0];
// 打印所有元素的下标
for (let number in arr){
console.log(number);
}
// 打印所有元素具体的值
for (let number of arr){
console.log(number);
}
- 遍历map和set
var map = new Map([['mashiro',100],['nagisa',90],['makoto',80]]);
for (let x of map){
console.log(x);
}
var set = new Set([3,1,4,1,2]);
for (let x of set){
console.log(x);
}
3.函数
3.1.定义函数
- 定义函数的两种方式
// 方式一:
function abs1(x) {
if (x < 0){
return -x;
}else{
return x;
}
}
// 方式二
var abs2 = function (x) {
if (x < 0){
return -x;
}else{
return x;
}
}
- 规避错误参数
function abs(x) {
//手动抛出异常 规避错误参数
if (typeof x !== "number"){
throw 'Not a Number';
}
if (x < 0){
return -x;
}else{
return x;
}
}
- arguments 【传入的所有参数是一个数组】
function a(a,b) {
for (let x of arguments){
console.log(x);
}
}
- rest [ES6新特性(获取未被定义的多余参数)]
function b(a,b,...rest) {
console.log(a);
console.log(b);
console.log(rest);
}
3.2. 变量的作用域
- 函数内部变量的作用域只在函数中,要在函数外使用该变量需要使用
闭包
function test() {
var x = 1;
x = x + 1;
}
x = x + 2;// ReferenceError: x is not defined
- 不用函数的变量互不相干【隔离】
'use strict'
function test01() {
var x = 1;
x = x + 1;
}
function test02(){
var x = 5;
}
- 内部函数可以使用外部函数的变量,而外部函数不能使用内部函数的变量
'use strict'
function test01() {
var x = 1;
// ReferenceError: y is not defined
function test02(){
var y = x + 5;
}
z = y + 1; // error
}
- 假设内外函数变量 重名
'use strict'
// 变量从自身函数开始查找
function test01() {
var x = 1;
function test02(){
var x = 5;
console.log(x);
}
console.log(x);
test02();
}
test01();
// 1
// 5
-
养成规范: JavaScript方法内部的所有变量的定义,放在函数头部。
-
全局变量
var i = 1;
function test03() {
console.log(i);
}
test03();
console.log(i);
- 全局对象 window [默认所有全局变量都会自动绑定在window类下]
var x = 'xxx';
alert(x);
alert(window.x);
- 规范 【所有全局变量都会绑定到window对象上,会产生冲突】
// 唯一全局变量
var mashiroAPP = {};
// 定义全局变量
mashiroAPP.name = 'mashiro';
mashiroAPP.add = function (a,b) {
return a+b;
}
[ 将自己的代码放在自己定义的的唯一全局空间里面,降低变量命名产生的冲突 ]
- 局部变量(let)
function test() {
for (var i = 0;i < 100;i++){
}
console.log(i+1);
// 101;
}
// ES6引入 let关键字
function test02() {
for (let i = 0;i < 100;i++){
}
console.log(i+1);
// ReferenceError: i is not defined;
}
- 常量 const
(ES6之前常量使用大写字母定义, 在ES6之后引入了const关键字定义常量)
function test() {
const PI = '3.14'; // 3.14
console.log(PI);
PI = '456';
console.log(PI); // TypeError: Assignment to constant variable.
}
test();
- 方法
var mashiro = {
name: 'mashiro',
birth: 1998,
// 方法
age: function(){
var now = new Date().getFullYear();
return now - this.birth;
}
}
- Apply
function getAge(){
var now = new Date().getFullYear();
return now - this.birth;
}
var mashiro = {
name: 'mashiro',
birth: 1998,
age: getAge
}
getAge.apply(mashiro,[])
4.常用类
4.1.Date对象
var date = new Date();
date.getFullYear(); // 年
date.getMonth();// 月 0~11月
date.getDate();// 日
date.getDay();// 星期
date.getHours();// 时
date.getMinutes();// 分
date.getSeconds(); // 秒
date.getTime();// 时间戳 1970-1-1 0:00:00 到现在的毫秒数
date.toLocaleString(); // "2020/9/13 上午10:49:56"
date.toUTCString();
date.toGMTString(); // "Sun, 13 Sep 2020 02:49:56 GMT"
4.2.JSON对象
'use strict'
var user = {
name: 'mashiro',
age: 3,
sex:'男'
}
// 对象转换为JSON字符串
var jsonString = JSON.stringify(user);
// 结果: "{"name":"mashiro","age":3,"sex":"男"}"
// JSON字符串转换为对象
var obj = JSON.parse('{"name":"mashiro","age":3,"sex":"男"}');
// 结果: {name: "mashiro", age: 3, sex: "男"}
// age: 3
// name: "mashiro"
// sex: "男"
4.3.Ajax
5.面向对象编程
5.1.面向对象
- 类: 模板
- 对象: 实例
5.2.JavaScript中的原型
var user = {
name: "user",
age: 18,
run: function () {
console.log(this.name + " running...")
}
};
var mashiro = {
name: "mashiro",
age: 22
}
// 原型对象
mashiro.__proto__ = user;
// mashiro.run() --> mashiro running...
5.3.Class继承 【ES6引入新特性】
- 定义一个类
class Student{
constructor(name) {
this.name = name;
}
hello(){
alert(this.name + " hello");
}
}
var mashiro = new Student("mashiro");
// mashiro.hello()
- 继承
class Student{
constructor(name) {
this.name = name;
}
hello(){
alert(this.name + " hello");
}
}
class js extends Student{
constructor(name,grade) {
super(name);
this.grade = grade;
}
myGrade(){
alert("Grade = "+ this.grade);
}
}
var ahaha = new js("ahaha",100);
ahaha.myGrade();
6.操作BOM对象 ( * )
浏览器介绍:
- JavaScript和浏览器的关系?
JavaScript诞生就是为了能够让他在浏览器中运行
BOM : 浏览器对象模型 - IE 6-11
- Chrome
- Safari
- FireFox
- Opera
6.1.window类
- window 代表浏览器的窗口
window.innerHeight
// 969
window.innerWidth
// 1199
window.outerHeight
// 1040
window.outerWidth
// 1920
6.2.Navigator
- 封装了浏览器的信息
// 获取当前程序的名字
navigator.appName
// "Netscape"
// 获取程序版本信息
navigator.appVersion
// "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
// 获取当前用户信息
navigator.userAgent
// "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
// 当前系统版本
navigator.platform
// "Win32"
6.3.screen
- 屏幕
screen.width
// 1920
screen.height
// 1080
6.4.location
- 代表当前页面的URL
location
// 主机
host: "localhost:63342"
// 指向的地址
href: "http://localhost:63342/JavaScriptStudy/lesson04/02.BOM%E5%AF%B9%E8%B1%A1.html?_ijt=m24jssb7pm61vkfuqjab05l3qe"
// 端口号
port: "63342"
// 协议
protocol: "http:"
// 刷新页面
reload: ƒ reload()
// 设置新的跳转网页
location.assign("https://www.baidu.com");
6.5.document
- 文档: 当前页面(HTML,DOM文档树)
- 获取网页文档树
<dl id="app">
<dt>Java</dt>
<dd>JavaSE</dd>
<dd>JavaEE</dd>
</dl>
<script>
var dl = document.getElementById("app");
</script>
dl
/*
<dl id="app">
<dt>Java</dt>
<dd>JavaSE</dd>
<dd>JavaEE</dd>
</dl>
*/
- 获取网页cookie
document.cookie
- 服务器端可以设置cookie: httpOnly 来防止cookie被劫持
6.6.hostory
- 代表浏览器的历史记录
// 后退
history.back();
// 前进
history.forward();
7. 操作DOM
-
DOM: 文档对象模型
-
浏览器网页就是一个DOM树形结构
-
添加: 增加DOM节点
-
删除: 删除DOM节点
-
更新: 更新DOM节点
-
遍历: 获取一个DOM节点
7.1.得到DOM节点
<script>
var h1 = document.getElementsByTagName("h1");
var p1 = document.getElementsByClassName("p1");
var p2 = document.getElementById("p2");
var father = document.getElementById("father");
var children = father.children;
father.firstChild;
father.lastChild;
father.firstElementChild;
father.lastElementChild;
</script>
7.2.更新DOM节点
- 1.获取节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BOM对象</title>
</head>
<body>
<div id="div1">
<script>
var div1 = document.getElementById("div1");
</script>
</body>
</html>
- 2.操作文本
div1.innerText = "123456";
div1.innerHTML = "<strong>123456</strong>"
- 3.操作CSS
div1.style.color = 'red';
div1.style.fontSize = "40px";
div1.style.padding = '20px';
7.3.删除DOM节点
<div id="parent">
<h1>h1</h1>
<p1 id="p1">p1</p1>
<p2 class="p2">p2</p2>
</div>
-
- 寻找父节点,通过父节点删除子节点
var self = document.getElementById("p1");
var parent = self.parentElement;
parent.removeChild(self);
-
- 获取父节点,删除子节点
var parent = document.getElementById('parent');
// 删除节点 动态更新
parent.removeChild(parent.children[0]);
parent.removeChild(parent.children[0]);
parent.removeChild(parent.children[0]);
-
- remove()
var self = document.getElementById('p1');
self.remove();
7.4.增加DOM节点
-
- 追加一个已存在节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BOM对象</title>
</head>
<body>
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var js = document.getElementById('js');
var list = document.getElementById('list');
list.appendChild(js);
</script>
</body>
</html>
- 2.创建新节点并追加
var newP = document.createElement('p');
newP.id = 'newP';
newP.innerText = 'newP';
list.appendChild(newP);
- 3.创建新的标签节点
var myScript = document.createElement('script');
// <script type="text/javascript" src="">
myScript.setAttribute('type','text/javascript');
list.appendChild(myScript);
// 通过 setAttribute方法可以设置任意的值
- 4.在元素前插入节点
var js = document.getElementById('js');
var list = document.getElementById('list');
var ee = document.getElementById('ee');
list.insertBefore(js,ee);
- 5.操作body
var body = document.getElementsByTagName('body');
body[0].style.backgroundColor = 'red';
7.5.操作表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BOM对象</title>
</head>
<body>
<form action="post">
<span>用户名:</span><input type="text" id="username">
<span>性别:</span>
<input type="radio" name="sex" value="男" id="boy">男
<input type="radio" name="sex" value="女" id="girl">女
</form>
<script>
var username = document.getElementById('username');
// 获取输入的值
// username.value;
// 修改表单的值
// username.value = 'xxx';
var boy = document.getElementById('boy');
var girl = document.getElementById('girl');
// boy.checked
// true
// girl.checked
// false
</script>
</body>
</html>
7.6.提交表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BOM对象</title>
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
</head>
<body>
<!-- 表单绑定提交事件 onsubmit 提交时触发函数-->
<!-- return: 如果return为false则提交失败,反之成功-->
<form action="post" onsubmit="return mit()">
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<p>
<span>密码:</span><input type="password" id="input-password">
</p>
<input type="hidden" id="md5-password" name="password">
<button type="submit">提交</button>
<!-- 给按钮绑定事件,onclick 点击触发mit() 函数-->
<!-- <button type="button" οnclick="mit()">提交</button>-->
</form>
<script>
function mit() {
var uname = document.getElementById('username');
var pwd = document.getElementById('input-password');
var md5password = document.getElementById("md5-password");
md5password.value = md5(pwd.value);
console.log(md5password.value);
return false;
}
</script>
</body>
</html>
8.jQuary
https://jquery.cuishifeng.cn/
jQuary文档
8.1.入门
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/core.js"></script>-->
<script src="lib/jquery-3.0.0.min.js"></script>
</head>
<body>
<!--
jQuary公式: $(selector).action()
-->
<a href="" id="test-jQuary">点击</a>
<script>
$('#test-jQuary').click(function () {
alert('Hello world,jQuary');
})
// tips: function()写在click()的括号中
</script>
</body>
</html>
8.2.选择器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/core.js"></script>-->
<script src="lib/jquery-3.0.0.min.js"></script>
</head>
<body>
<!--
jQuary公式: $(selector).action()
-->
<script>
// 原生js选择器
// 标签选择器
document.getElementsByTagName();
// id选择器
document.getElementById();
// 类选择器
document.getElementsByClassName();
// jQuary选择器
// 标签选择器
$('p').click();
// id选择器
$('#id1').click();
// 类选择器
$('#class1').click();
// CSS中的选择器,jQuary都能使用,详细见文档
</script>
</body>
</html>
8.3.事件 Action
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/core.js"></script>-->
<script src="lib/jquery-3.0.0.min.js"></script>
<style>
#divMove{
width: 500px;
height: 500px;
border: black solid 3px;
}
</style>
</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>
<!--
$('.class1').mousedown();
$('.class1').mouseenter();
$('.class1').mouseleave();
$('.class1').mousemove();
$('.class1').mouseout();
$('.class1').mouseover();
$('.class1').mouseup();
-->
8.4.操作Dom
- 文本操作
// 取值
$('#test-ul li[name=python]').text();
// 改值
$('#test-ul li[name=python]').text('mashiro');
$('#test-ul').html();
- css操作
$('#test-ul li[name=python]').css({'color','red'});
- 属性的隐藏与显示
// 显示
$('#test-ul li[name=python]').show();
// 隐藏(display:none)
$('#test-ul li[name=python]').hide();