前端-js-长期维护

###############    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      ################

 

###############   结束线      ################

你可能感兴趣的:(前端-js-长期维护)