############### JS简介和JS引入 ################
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<script src="1.js">script>
<div id="d1">sssdiv>
body>
html>
############### JS的基本语法和数据类型(数字和字符串) ################
/* js基础语法: 1,注释: 单行注释:// 多行注释: #################### 2,语句必须以分号结尾 3,变量生命的关键字:var 变量名 = "值" js是属于动态类型,就是同一个变量可以存储不同类型的值,类似python, 4,变量 变量命名的规则,js中$也可以作为变量名, 1,变量区分大小写 2,推荐使用驼峰命名法 3,保留字不能用作变量名 */ //变量声明 var name = "小明"; var age = 10; var $ = "女"; console.log("name",name); console.log("age",age); console.log("$",$); /* 5,数据类型: 整数,浮点数,科学计数法 还有一种NaN,表示不是一个数字,not a number * */ //数字类型 var n1 = 18; var n2 = 18.1; var n3 = 1.8e5; //字符串类型 var s1 = "123"; var s2 = "234"; var s3 = s1+s2; // 字符串拼接 console.log(s3) /* 字符串常用方法: .length 返回长度 .trim() 移除空白 .trimLeft() 移除左边的空白 .trimRight() 移除右边的空白 .charAt(n) 返回第n个字符 .concat(value, ...) 拼接,eg: concat(1) 在后面拼接1,concat(1,2,3) 在后面拼接1,2,3 .indexOf(substring, start) 子序列位置,返回的是子字符串的起始位置, .toLowerCase() 小写 .toUpperCase() 大写 .split(delimiter, limit) 分割,第一个参数是根据什么分割,第二个参数是限制分割多少个,第二个参数可以不写 ######################### .substring(from, to) 根据索引获取子序列 .slice(start, end) 切片 //substring和slice有什么相同之处: 两者的相同点: 如果start等于end,返回空字符串 如果stop参数省略,则取到字符串末 如果某个参数超过string的长度,这个参数会被替换为string的长度 substirng()的特点: 如果 start > stop ,start和stop将被交换 如果参数是负数或者不是数字,将会被0替换 silce()的特点: 如果 start > stop 不会交换两者 如果start小于0,则切割从字符串末尾往前数的第abs(start)个的字符开始(包括该位置的字符) 如果stop小于0,则切割在从字符串末尾往前数的第abs(stop)个字符结束(不包含该位置字符) * */
############### JS数据类型(布尔和数组类型) ################
/* 布尔类型 区别于Python,true和false都是小写。 ""(空字符串)、0、null、undefined、NaN都是false。 * */ //布尔类型 var a = true; var b = false; //数组类型 // 类似python中的列表 var a1 = [1,2,3] a1[0] //返回1, a1[3] //返回undefined // a1[1:2] //不支持这种冒号的 /* .length 数组的大小 .push(ele) 尾部追加元素 .pop() 获取尾部的元素,和python一样,会从列表取出,并且返回 .unshift(ele) 头部插入元素 .shift() 头部移除元素 .slice(start, end) 切片 .reverse() 反转 .sort() 排序 这个排序比较鸡肋,要转换成字符串,然后排序, ############################# .join(seq) 将数组元素连接成字符串, python中 l1=["1","2","3"] ("+").join(l1) 这是把列表中的元素,使用加号连接,返回是一个字符串 js中 l1=[1,2,3] l1.join("+") //返回1+2+3 ######################### .concat(val, ...) 连接数组, l1=[1,2,3] l1.concat(1,2,3) //结果:[1,2,3,1,2,3] l1.concat([1,2,3]) //结果:[1,2,3,1,2,3] ########################### null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null; undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。 null表示变量的值是空,undefined则表示只声明了变量,但还没有赋值。 ############################ var a1 =[12,2] typeof a1 //这是查看数据的类型,记住数组和null,返回的是object类型 typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。 typeof "abc" // "string" typeof null // "object" typeof true // "boolean" typeof 123 // "number" * */
############### JS运算符 ################
/* 算数运算符: + - * / % ++ -- var n =10; n++ //11,就是n=n+1 ################################ 比较运算符 > >= < <= != == === !== 注意: 1 == “1” // true 这是弱等于,只判断值 1 === "1" // false 这是强等于,既判断值也判断类型 ################################ 逻辑运算符 && 与 || 或 ! 非 ################################ 赋值运算符 = += //n+=1 就是 n= n+1 -= *= /= * */
############### JS流程控制语句 ################
// for循环 // a1 = [1,2,3] // for (var i =0;i// console.log(a1[i]) // } //while 循环 // var i = 0; // while (i < 10) { // console.log(i); // i++; // } // 三元运算 var a = 1; var b = 2; var c = a > b ? a : b; //? 号前面是条件,成立就是第一个a,不成立就是第二个b
############### JS函数 ################
//js中函数和python中的函数非常的相似,只是定义的方式有些不同 //函数的定义 function foo(a,b) { console.log(a); console.log(b); return a+b; //带返回值的函数 } //匿名函数 //需要使用一个变量去接收他, var func = function (a,b) { console.log(a); console.log(b); return a+b; //带返回值的函数 }; //立即执行函数 //先写两个括号,第一个括号内部定义,第二个括号内部传递具体的参数 (function (a,b) { console.log("立即执行函数"); console.log(a+b) })(11,222); //arguments function foo(a,b) { console.log(a); console.log(b); console.log(arguments.length); //这个 arguments 根据传入的参数,是一个列表[a,b] //可以遍历这个arguments对象 return a+b; //带返回值的函数 } //函数的调用 var ret1 = foo(11,22); // 调用的时候,如果传递的超出定义的,超出的不起作用,并不会导致程序报错, //如果传递的参数少于定义的,未定义的就会显示undefined,也不会程序报错, //这是js比较随便的地方, console.log(ret1); var ret2 = func(11,12); console.log(ret2); /* 局部变量: 在JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,本地变量就会被删除。 全局变量: 在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。 变量生存周期: JavaScript变量的生命期从它们被声明的时间开始。 局部变量会在函数运行以后被删除。 全局变量会在页面关闭后被删除 * */
############### JS词法分析 ################
//js的词法分析 var age =18; function foo() { console.log(age); var age =22; console.log(age); } foo(); //结果是 undefined ,22 , //为什么? //因为函数执行的时候,会对函数内部进行词法分析 /* JavaScript中在调用函数的那一瞬间,会先进行词法分析。 词法分析的过程: 当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面: 1:函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不做任何操作。 2:函数局部变量,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。 3:函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。 函数内部无论是使用参数还是使用局部变量都到AO上找。 * */
############### JS内置对象-自定义对象 ################
/* js中内置的对象和方法: * */ //js中自定义对象 var person = {name:"andy",age:18};//在js对象中,属性名默认不需要加引号,你加了js也会给你去掉的,值可以是单引号和双引号,单引号会转换成双引号 console.log(person); // 单个取属性 console.log(person.name); console.log(person.age); //遍历取属性 for (var i in person){ console.log(i); console.log(person[i]) } //自定义对象的第二种方式: var person2 = new Object(); person2.name="xiaoxiao"; person2.age=22; console.log(person2);
############### JS内置对象-Date对象 ################
//内置的Date对象,就相当于python中的模块 var d1 = new Date(); console.log(d1); //这是默认生成当前时间,这是一个时间对象, console.log(d1.toLocaleString()); //这是一个字符串 var d2 = new Date("2004/3/20 11:12"); console.log(d2.toLocaleString()); /* var d = new Date(); //getDate() 获取日 //getDay () 获取星期 //getMonth () 获取月(0-11) //getFullYear () 获取完整年份 //getHours () 获取小时 //getMinutes () 获取分钟 //getSeconds () 获取秒 //getMilliseconds () 获取毫秒 //getTime () 返回累计毫秒数(从1970/1/1午夜) * */
############### JS内置对象-json对象 ################
//json对象 var s = '{"name":"andy","age":12}'; //这是一个字符串,怎么使用js转换成为json格式的, var ret = JSON.parse(s); console.log(ret); console.log(typeof ret); //类型是一个对象 // 怎么把js中的对象,转换成字符串呢? var s2 = JSON.stringify(ret); console.log(s2); console.log(typeof s2); //类型是一个字符串 // 这两个一定要学会,后面使用ajax传递数据的时候,会使用到
############### JS内置对象-Math对象 ################
//math对象 var n = -5; n2 = Math.abs(n); //绝对值 console.log(n2); Math.floor(5.9); //直接往下去,这就是5, Math.min(1,2); Math.max(1,2); Math.pow(10,2); //返回x的y次幂 Math.random(); //返回一个0-1之间的随机数 Math.round(5.5); //四舍五入
############### JS内置模块-RegExp模块,正则模块 ################
//RegExp对象,正则,类似python中的re模块 //生成RegExp对象, var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); //这是以字母开头,5-11位的字母数字下滑线组成 var reg2 = reg1.test('xiaoming'); console.log(reg2); //true var reg3 = reg1.test('2xiaoming'); console.log(reg3); //false //简单写法 console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("xiaoming")); console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("3xiaoming")); //这里面有很多的坑 // 1,re表达式内部不能加空格,否则会产生意想不到的错误, // console.log(/^[a-zA-Z][a-zA-Z0-9_]{5, 11}$/.test("xiaoming")); //2,test里面不写值,默认不是空,是校验的一个undefined,这是大坑啊, console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test());//等同于console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("undefined")); //3,字符串替换 //两种模式,g,i, var ss = 'Ahahaha'; var sss = ss.replace("a","哈");//这样写只会替换第一个a,这个要记住, var sss = ss.replace(/a/,"哈");//这样写只会替换第一个a,这个要记住,这是正则的写法 var sss = ss.replace(/a/g,"哈");//加一个g,就是说全局有多少就替换多少, var sss = ss.replace(/a/gi,"哈");//加一个i,就是说忽略大小写,都替换 console.log(sss);
############### JS-BOM操作 ################
//BOM操作 //Windows对象 // window.open(); //打开一个新的tab页面,没什么用 // window.innerHeight; //获取浏览器的高度 // window.innerWidth; //获取浏览器的宽度 // window.close() //- 关闭当前窗口 // ###################### //window的子对象 // location对象(这些方法有用,需要记住) // window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。 // 常用属性和方法: console.log(location.href); //获取URL // console.log(location.href="URL"); // 跳转到指定页面 // console.log(location.reload()); //重新加载页面 // ############################## // 弹出框 // 可以在 JavaScript 中创建三种消息框:警告框、确认框、提示框。 // 警告框 // 当警告框出现后,用户需要点击确定按钮才能继续进行操作。 // 语法: // alert("你看到了吗?"); // 确认框(了解即可) // 当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。 // 如果用户点击确认,那么返回值为 true。如果用户点击取消,那么返回值为 false。 // 语法: // confirm("你年满18岁了吗?"); // 提示框(了解即可) // 提示框经常用于提示用户在进入页面前输入某个值。 // 当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。 // 如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为 null。 //语法: // prompt("请在下方输入","你的答案"); // ################################## // 计时相关 // 通过使用 JavaScript,我们可以在一定时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。 // 第一个:setTimeout() var ret=setTimeout("alert(123)",5000) //第一个参数是你要执行的语句是什么,第二个参数是你要等多少秒之后执行, console.log(ret) function foo() { console.log("呵呵") } console.log(setTimeout(foo,3000)); //使用的时候往往会使用函数的形式 // 对应的一个:clearTimeout() // 在指定时间之后执行一次相应函数 // var timer = setTimeout(function(){alert(123);}, 3000) // 取消setTimeout设置 // clearTimeout(timer); // 第二个:setInterval() console.log(setInterval(foo,1000));//这是每隔1秒钟执行一次函数, // setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。 // 对应的就是:clearInterval()
############### JS-DOM操作 ################
// DOM操作 // DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。 // 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 // HTML DOM 模型被构造为对象的树。 // 根节点就是html,然后分为header和body,header里面有标签以及下面的文本,body里面有各种标签和各自的文本, // ###################### //DOM标准规定HTML文档中的每个成分都是一个节点(node): // 文档节点(document对象):代表整个文档 // 元素节点(element 对象):代表一个元素(标签) // 文本节点(text对象):代表元素(标签)中的文本 // 属性节点(attribute对象):代表一个属性,元素(标签)才有属性 // 注释是注释节点(comment对象) // ############################ // JavaScript 可以通过DOM创建动态的 HTML: // JavaScript 能够改变页面中的所有 HTML 元素 // JavaScript 能够改变页面中的所有 HTML 属性 // JavaScript 能够改变页面中的所有 CSS 样式 // JavaScript 能够对页面中的所有事件做出反应,这是最为常用的, // ################################# // 要操作元素,就要先找到元素,下面讲解如何查找元素 //直接查找 //下面的语句直接输入浏览器的console中就可以执行 document.getElementById("d1"); document.getElementsByClassName("c1"); document.getElementsByTagName("p"); //根据标签名字查找 //间接查找 var d3 = document.getElementById("d3"); d3.parentElement; /* parentElement 父节点标签元素 children 所有子标签 firstElementChild 第一个子标签元素 lastElementChild 最后一个子标签元素 nextElementSibling 下一个兄弟标签元素 previousElementSibling 上一个兄弟标签元素 */ // ############################# //节点操作 //创建节点 var imgEle=document.createElement("img"); //增加节点的属性 imgEle.src="http://image11.m1905.cn/uploadfile/s2010/0205/20100205083613178.jpg"; //两种写法一样, //获取节点 var d1Ele = document.getElementById("d1"); // 追加节点(作为最后的节点) d1Ele.appendChild(imgEle); // 把增加的节点,放到某一个节点的前面 var d1Ele2 = document.getElementById("d2"); var d1Ele3 = document.getElementById("d3"); var aEle=document.createElement("a"); d1Ele2.insertBefore(aEle,d1Ele3); aEle.innerText ="点我"; aEle.href ="http://www.baidu.com"; //设置自定义的属性 imgEle.setAttribute("ss", "ss"); //获取属性 imgEle.getAttribute("ss"); //删除属性 imgEle.removeAttribute("ss"); //innerText d1Ele2.innerText; //后面不写等于号,就是获取这个标签的所有的文本, d1Ele2.innerText="hehe"; //有等号,就是把里面设置文本,而且里面的子标签都没有了,所以要找到具体的标签修改, d1Ele2.innerHTML;//这是获取到下面的标签和文本,里面可以直接写标签, //删除标签 var d1Ele = document.getElementById("d1"); var sonEle = d1Ele.firstElementChild; d1Ele.removeChild(sonEle); //替换标签 var d1Ele = document.getElementById("d1"); var sonEle = d1Ele.firstElementChild; var aEle=document.createElement("a"); aEle.innerText ="点我"; d1Ele.replaceChild(aEle,sonEle);
############### JS-DOM操作-获取值操作 ################
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>获取值相关title>
head>
<body>
<form action="">
<label>用户名
<input name="username" id="i1" type="text">
label>
<label>男
<input name="gender" value="1" type="radio">
label>
<label>女
<input name="gender" value="0" type="radio">
label>
<select name="from" id="s1">
<option value="010">北京option>
<option value="021">上海option>
<option value="023">重庆option>
<option value="022">天津option>
select>
<textarea id="t1" name="memo" cols="30" rows="10">
textarea>
form>
<script>
var iEle = document.getElementById("i1");
console.log(iEle.value);
var sEle = document.getElementById("s1");
console.log(sEle.value);
var tEle = document.getElementById("t1");
console.log(tEle.value);
script>
body>
html>
############### JS-DOM操作-class操作 ################
//class的操作 //获取class的值 var divs = document.getElementsByTagName("div"); //这是返回一个数组 divs[0] // 这是取值第一个 divs[0].className; //这是取classname的值, //移除一个class divs[0].classList;//这是一个数组, divs[0].classList.remove("c3"); // 对数组操作,移除一个值就简单了, //添加一个class divs[0].classList.add("c4"); //包含判断 divs[0].classList.contains("c4");//是否包含,如果包含就是返回true, //classList.toggle(cls) 存在就删除,否则添加 divs[0].classList.toggle("c4"); // ############################## //指定css操作 //可以直接通过改动div的一个style属性来改变颜色 var divs = document.getElementsByTagName("div"); divs[0].style.backgroundColor= "blue"; // JS操作CSS属性的规律: // 1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如: obj.style.margin obj.style.width obj.style.left obj.style.position // 2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如: obj.style.marginTop obj.style.borderLeftWidth obj.style.zIndex obj.style.fontFamily
对应的HTML
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style>
.c1 {
width: 200px;
height: 200px;
border-radius: 50%;
background-color: gray;
}
.c2 {
background-color: yellow;
}
style>
head>
<body>
<div class="c1 c2 c3" onclick="change(this);">divdiv>
<script>
function change(ths){
ths.classList.toggle("c2");//没有添加,有就删除,就实现了一个颜色的切换,这是绑定了一个点击事件,
}
script>
body>
html>
############### JS-DOM操作-绑定事件 ################
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style>
.c1 {
width: 200px;
height: 200px;
border-radius: 50%;
background-color: gray;
}
.c2 {
background-color: yellow;
}
style>
head>
<body>
<div class="c1 c2 c3" onclick="change(this);">divdiv>
<div class="c1 c2 c3">divdiv>
<div class="c1 c2 c3">divdiv>
<div class="c1 c2 c3">divdiv>
<input id="i1" type="text">
<input id="start" type="button" value="开始">
<input id="stop" type="button" value="停止">
<input id="i3" type="text" value="裤子">
<input id="search" type="button" value="搜索">
<select id="s1">
<option value="0">--请选择--option>
<option value="1">北京option>
<option value="2">上海option>
select>
<select id="s2">select>
<script>
//
function change(ths) {
ths.classList.toggle("c2");//没有添加,有就删除,就实现了一个颜色的切换,这是绑定了一个点击事件,
}
// 第二种方式,找到元素,然后绑定函数这种好一点
var divs = document.getElementsByTagName("div");
for (var i = 0; i < divs.length; i++) {
divs[i].onclick = function () {
this.classList.toggle("c2");//没有添加,有就删除,就实现了一个颜色的切换,这是绑定了一个点击事件,
}
}
// 练习,需求:
// 在input框中显示当前时间
// 1,获取当前时间,
var t; //定义一个全局变量,定义一个全局变量就是为了方便后面的函数内部能调用,
function foo() {
var now = new Date();
var nowStr = now.toLocaleString();
// 2,把时间字符串填入input框中,
var inputEle = document.getElementById("i1");
inputEle.value = nowStr;
}
//点击开始让这个时间动起来,
var startButton = document.getElementById("start");
startButton.onclick = function () {
// 每隔一秒执行一次
if (t === undefined) { //判断一下只有没有定时器的时候才会生成,否则不生成,避免连续点击生成多个,
t = setInterval(foo, 1000);
}
}
// 点击停止,让时间停止
var stopButton = document.getElementById("stop")
stopButton.onclick = function () {
clearInterval(t);//定义一个全局变量就是为了方便这个地方能停止
t = undefined;//因为上一步是清楚了定时器,但是t这个值还是存在的,所以要重置一下t的值为undefined
}
// 现在对输入框做一个事件,
//点击之后value值消失,光标移除之后value值回来
var input3 = document.getElementById("i3");
input3.onfocus = function () {
this.value = "";//this就是这个input框
}
input3.onblur = function () {
//如何值为空,就把值填回去,不是空的就不要再填回去了,
if (!this.value) {
this.value = "娃娃"
}
}
//select联动,
var data = {1: ["昌平区", "朝阳区", "海淀区"], 2: ["静安区", "闵行区", "浦东区"]};
// 给第一个select绑定事件,绑定的是onchange事件,当元素内容被改变时触发
//找到第一个select
var select1 = document.getElementById("s1");
//给这个select绑定事件
select1.onchange = function () {
//获取是选择的哪一个区
console.log(this.value);
//把对应市的区,填入第二个框中,
var areas = data[this.value];
//生成option标签,
var select2 = document.getElementById("s2");
select2.innerHTML="";//把第二个select框清空,
for (var i = 0; i < areas.length; i++) {
var opEle = document.createElement("option");
//添加到第二个标签中
opEle.innerText = areas[i];
select2.appendChild(opEle)
}
}
script>
body>
html>
事件:
//事件是非常重要的,要着重理解,但是后面写的时候我们是使用的jQuery,基本不使用原生的js写
/*
onclick 单击事件,点击的时候触发事件
ondblclick 双击事件
onfocus 元素获得焦点。 // 练习:输入框
onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动)
* */
############### JS ################
############### 结束线 ################