JavaScript基础总结

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 JavaScript基础总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

JavaScript(行为):

1.js概述:

  • 一种弱类型脚本语言,源代码不经过编译(在发到客户端运行之前不需要经过编译),将文本格式和字符代码发送给浏览器解释运行,控制网页行为

  • Native原生JS开发,按照ECMAScript(JS规范)标准的开发方式所有浏览器都支持,做后台也可以,但支持不了高并发

  • es2-es3(通行标准)-es4(内部,未正式发布)-es5(全浏览器支持)-es6(常用,当前主流版本:webpack打包为es5支持)-es7-es8-es9-es10-es11-es12

  • 问题:开发用es6,线上浏览器用es5,不一致问题

  • TypeScript微软的标准,是js的超集,添加了可选的静态类型和基于类的面向对象编程,除了具备es特性还纳入了不在标准范围内的特性,是浏览器不直接支持typescript,要编译js后才能被浏览器执行

2.js框架:

  • Jquery:js库,简化DOM操作,缺点Dom操作太频繁,影响前端性能;使用他兼容ie 6/7/8
  • Angular:Coogle收购前端框架,java程序员开发,将后台mvc模式搬到前端,加入了模块化开发理念,与微软合作,采用typescipt语法,对前端程序员不友好;迭代版本不合理
  • React:facebook出版,高性能JS前端框架,提出新概念(虚拟DOM),减少真实dom操作,在内存中模拟dom操作,有效提升前端渲染效率(相应速度),使用复杂,学习JSX语言
  • Vue:渐进式JS框架,逐步实现新特性,模块化开发、路由、状态管理等。是综合了Angular(模块化)、React的优点
  • Axios:前端通信框架,vue边界明确,为了处理DOM,不具备通信能力,额外使用通信框架与服务器交互;也可以使用jquery提供的Ajax通讯功能

2.2 ui框架:

  • Ant-Design:阿里出品,基于React的UI框架
  • Element、ice、iview:饿了么出品,基于Vue的UI框架
  • BootStrap:twitter推出前端开发的开源工具包
  • AmazeUI,H5跨屏前端框架

2.3 JS构建工具

  • Babel:js编译工具,用于浏览器不支持ES新特性,如编译typeScript
  • WebPack:模块打包器,用于打包,压缩,合并和按序加载
  • 以上技术是webapp需要技能

2.4 前端需要了解的后端技术nodejs(笨重)

  • nodejs需要框架和项目管理工具,
  • Express:nodejs框架
  • Koa:Express简化版
  • NPM:项目综合管理工具,类似于Maven
  • YARN:NPM的替代方案,类似Maven和Gradle关系

3.入门

3.1 引入js:严格区分大小写

  • 内部标签://注释和java一样
  • 外部引入
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jsDemo01</title>
    <!--js内联-->
    <!--js可以放这里-->
    <!--type不用显示定义,默认也是js-->
    <script type="text/javascript">
        //注释
        alert("hello!")
    </script>
    <!--外联,script必须成对出现,成对标签不要整成自闭合标签-->
    <script src="js/jsDemo01.js"></script>
</head>
<body>
<!--js可以放这里-->
</body>
</html>
<!--js不放这里-->
  • js语句不写“:”结尾,打包时会把多行合并成一行

4.数据类型

数值、文本、图形、音频、视频…

  • 变量var
  • 变量命名规则:不能以数字、#开头,可以用_$开头

number js不区分小数和整数都为number

整数、小数、科学计数法1.12e3

负数、NaN(not a number)、Infinity 无穷大

字符串 “asd”、‘asd’

布尔值 true false

逻辑运算 && || !

比较运算符!!不同点不用==比较

= 赋值

== 等于(类型不一样,值一样,判断为true)

=== 绝对等于(类型一样,值一样,判断为true)

NaN===NaN,这个与所有数值不相等,包括自己

只能通过isNaN(NaN) 进行判断是否是NaN

null 空

undefined 未定义

  • 浮点数问题,尽量避免浮点数进行运算,存在浮点数问题
console.log(1/3 ===(1-2/3));
//差值的绝对值
console.log(Math.abs(1/3-(1-2/3))<0.000001);
  • 数组:java的数值必须是相同类型的对象,js中不需这样
//保证代码可读性,使用[]
var arr = [1,2,3,"ad",undefined,null];
var array = new Array(1,2,3,"ad",undefined,null);
  • js中数组下标越界后会undefined,不报错
  • 对象用大括号,数组用中括号,对象每个属性用逗号隔开,等同于json格式,最后一个属性不加,
var student = {
    name:"zk",
    age:2,
    sex:'男',
    love:["音乐","跑步","电脑"]
}
  • 取对象的值student.love

  • 严格检查模式;作用域不一样,var是函数作用域,而let是块作用域,也就是说,在函数内声明了var,整个函数内都是有效的,比如说在for循环内定义了一个var变量,实际上其在for循环以外也是可以访问的,

/*前提:idea设置支持es6语法
* 严格检查模式,不允许i=1;存在,预防js的随意性导致产生的一些问题
* 必须卸载script第一行
*局部变量使用let去定义
* */

"use strict"
let num1=1;    //变量
const str = "sdfs"  //常量

i=1;
console.log(i)

4.1 字符串

  • 正常字符串使用单引号、双引号包裹
  • 注意转义字符”‘”
\'
\n
\r
\u4e2d  \u**** unicode字符
\x41    Ascall字符
  • 多行字符串编写
//tab键上面,Esc下面
var str = `789
123
456
add`;
console.log(str);
  • 模板字符串
let nae = 'haha';
//用飘`
let msg = `hello,${str} ${nae}`
console.log(msg);
  • 字符串长度
let name='adbsadf';
console.log(name.length)
  • 字符串的可变性,不可变
name[0]=1
1
console.log(name)
VM1453:1 adbsadf
  • 大小写转换,方法非属性
name.toLocaleUpperCase()
//获取字符串第一个字符
console.log(name.charAt(1));
//获取字符串指定字符下标索引
console.log(name.indexOf("b"));
  • substr和substring区别
console.log(name.substr(1));	//包头截取
console.log(name.substr(1,3)); //[]包头包尾
console.log(name.substring(1));   //包头截取
console.log(name.substring(1,3)); //[)包头不包尾

4.2 数组

  • 可以包含任意数据类型,里面元素可变
let arr = ["a",'b',1,2,3,null,undefined];
  • 数组长度:arr.length,java数组无法通过length扩容,数组长度不可变
  • 若给arr.length赋值,则数组大小会发生变化;扩容了扩容元素为undefined,减容了,元素会丢失
arr.length = 10;
console.log(arr[9]);  
-->undefined

arr.indexOf(‘a’) //获取数组指定字符下标索引

字符串’1’和数字1是不同的,字符下标索引不同

  • 切片slice(start,end):同字符串的substring,包左不包右
let arr = ["a",'b',1,2,3,null,undefined];
let sliceArr = arr.slice(1,3);
console.log(sliceArr)
-->['b', 1]
  • 通过push()/pop()尾部,数组定义失败,通过此方法进行初始化数组
arr.push("hj","sdf");  压入到尾部
arr.pop();  从尾部弹出一个元素
  • 通过unshift()/shift()头部
arr.unshift("hj","sdf");  压入到头部
arr.shift();  从头部弹出一个元素
  • 排序:arr.sort();

  • 元素反转:arr.reverse()

  • 拼接数组concat(),并没有修改数值,只是会返回一个新的数组

arr.concat([7,8,9])
  • 连接符join,打印拼接数组,使用特定的字符串连接
arr.join('=')
[undefined, null, 'b', 'a', 3, 2, 1, 7, 8, 9]
jsDemo03.html:29 ==b=a=3=2=1
  • 多维数组:
let arr1=[[1,2],[3,4],[5,6]];
  • fill(‘x’)用x填充数组内的元素
arr.fill("red")
  • 数组:和集合框架的存取数据( 如何存,取,方法都可以实现)

4.3 对象,js也是面向对象语言,若干个键值对,所有键是字符串,值是任意对象

  • 取值时可以是 :对象名.属性名/对象名[‘属性名’]
var 对象名 = {
    属性名:属性值,
    属性名:属性值,
    属性名:属性值,
    属性名:属性值
}

var student = {
    name:"zk",
    age:2,
    sex:'男',
    love:["音乐","跑步","电脑"]
}
  • js对象,{…}表示一个对象,键值对描述xx:xx,多个属性间用’,’隔开,最后一个不需要

  • 对象赋值 student.name = ‘zs’;

  • 使用一个不存在的对象属性,不会报错,undefined

  • 动态删减属性,通过delete删除对象属性

delete student.name;
console.log(student)
  • 动态添加属性,直接给新的属性添加值
student.add = '北京';
console.log(student)
  • 判断属性值是否在这个对象中:‘xxx’ in 对象名
console.log('name' in student);
console.log(toString() in student);
true
false
//继承父类方法
console.log('toString' in student);
true
  • 判断一个属性是否是这个对象自身拥有的’hasOwnProperty’
console.log(student.hasOwnProperty('toString'));  false
console.log(student.hasOwnProperty('name'));   true

4.4 流程控制和循环和java一样

  • 避免死循环,否则关闭浏览器

  • idea中js代码提示和java一样

  • forEach函数循环5.1

//匿名函数
arr.forEach(function (e) {
    console.log(e)
})
//不使用匿名函数
function f(e) {
    console.log(e)
}
arr.forEach(f,arr)
  • for…in循环5.1
for (const index in Object) {
    	//索引
}
for (let arrKey in arr) {
    console.log(arr[arrKey]);
}
  • for…of循环,直接遍历值
for (let number of arr) {
    console.log(number);
}

4.5 Map和Set,es6新出

  • map
let map = new Map([['zs',11],['ls',22],['ww',33],['zl',44]]);
let zs = map.get('zs');   //通过key获得value
console.log(zs);
map.set('ls',77);         //新增或修改值
map.set('lo',77);
map.delete('lo');       //删除值
  • 无需不重复集合
let set = new Set([1,2,3,5,5,4]);
set.add(8);   //新增值
set.delete(4);//删除值
console.log(Array.from(set))   //输出seth中各元素
console.log(set.has(5));  //是否包含元素
  • map/set也可以for…of循环,直接遍历值

  • BUG:数组外加值,for…i(输出)n、for…of(不输出)的遍历不同处

arr=[4,5,6,1,2,3];
//arr[name] = '123'
arr.name = '123';
console.log(arr);
(6) [4, 5, 6, 1, 2, 3, name: '123']
for (let arrKey in arr) {
    console.log(arrKey);
    console.log(arr[arrKey]);
}
0
jsDemo03.html:68 4
jsDemo03.html:67 1
jsDemo03.html:68 5
jsDemo03.html:67 2
jsDemo03.html:68 6
jsDemo03.html:67 3
jsDemo03.html:68 1
jsDemo03.html:67 4
jsDemo03.html:68 2
jsDemo03.html:67 5
jsDemo03.html:68 3
jsDemo03.html:67 name
jsDemo03.html:68 123
for (let number of arr) {
	console.log(number);
}
4
jsDemo03.html:71 5
jsDemo03.html:71 6
jsDemo03.html:71 1
jsDemo03.html:71 2
jsDemo03.html:71 3

4.6 iterator迭代器es6添加新特性;一种特殊的对象, 它具有专门为迭代过程设计的专有接口,所有的迭代器对象都有一个 next()方法

  • 对迭代过程的封装

  • 每次都调用返回一个结果对象。

  • 结果对象有两个属性:迭代模式:设计模式,迭代模式规范了迭代器规格

  • value : 下一个将要返回的值:迭代器应该具有得到下一个数据的能力

  • done : 布尔类型,当没有更多值时返回 true:迭代器应该具有判断是否还有后续数据的能力

let arr = ["a",'b',1,2,3,null,undefined];
const iterator = {
    i:0,
    next(){
        var result = {
            value:arr[this.i],
            flag :this.i<arr.length
        }
        this.i++
        return result;
    }
}
let data = iterator.next();
console.log("外部:"+data)
while (data.flag){
    console.log(data.value);
    data = iterator.next();
    console.log("内部:"+data)
}
function creatIterator(arr) {
    let i = 0;
    return{
        next() {
            let done = i < arr.length;
            let value = done ? arr[i++] : undefined;
            return {
                done : done,
                value : value
            }
        }
    }
}
let creatIterator1 = creatIterator(arr);
let val = creatIterator1.next();
while (val.done){
    console.log("值:"+val.value);
    console.log("标识:"+val.done);
    val = creatIterator1.next();
}
  • 斐波拉契数列
function getFeiboIterator() {
    let prev1 = 1,prev2 = 1,n = 1;
    return{
        next(){
            let value;
            if (n<=2){
                value = 1;
            }else {
                value = prev1 + prev2;
            }
            const  result = {
                value,
                done:false
            }
            //n右移,需要更新前两位的数据
            prev1 = prev2;
            prev2 = result.value;
            n++;
            return result;
        }
    }
}
let feiboIterator = getFeiboIterator();
let i = 0;
while (i<20){
    console.log(feiboIterator.next().value);
    i++;
}

4.7 Generator生成器es6添加新特性:

  • 一个生成器对象,它使得创建迭代器对象的过程变得很简单
  • 生成器是一种迭代器函数,通过function关键字后面的(*)来标识。函数中会用到新的关键字 yield
function *createIterator() {
     // 指定next()方法返回值以及返回顺序
     yield 1;
     yield 2;
     yield 3;
 }
 let iterator2 = createIterator();
 console.log(iterator2.next().value); // 1
 console.log(iterator2.next().value); // 2
 console.log(iterator2.next().value); // 3
 let num = createIterator();
 console.log(num.next().value+"//"+num.next().done)
 console.log(num.next().value+"//"+num.next().done)
 console.log(num.next().value+"//"+num.next().done)
jsDemo05.html:99 1//false
jsDemo05.html:99 3//true
jsDemo05.html:100 undefined//true
  • 生成器函数每当执行完一条yield语句函数后都会自动停止执行,直到
    再次调用迭代器的next()方法才会继续调用.使用yield关键字可以返回任何值或者表达式
function *createIt(items) {
    // 指定next()方法返回值以及返回顺序
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}
let generator = createIt(['p','o','p']);
console.log(generator.next().value)
console.log(generator.next().value)
console.log(generator.next().value)
  • 生成器函数表达式
let createIts = function *(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}
let generator = createIts(['p','o','p']);
console.log(generator.next().value)
console.log(generator.next().value)
console.log(generator.next().value)
/*生成器函数表达式*/
let createIts = function *(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}

let arr = ['p','o','p'];
let generator = createIts(arr);
let i=0;
while (i<arr.length){
    console.log(generator.next().value);
    i++;
}
  • 生成器对象的方法
const obj = {
    createIts : function *(items) {
        for (let i = 0; i < items.length; i++) {
            yield items[i];
        }
    }
}
let generator1 = obj.createIts(["java","js","pythn"]);
console.log(generator1.next().value)
console.log(generator1.next().value)
console.log(generator1.next().value)

4.8 迭代和遍历的区别

  • 迭代:迭代强调的是依次取数据的过程,并不保证取多少,也不保证把所有的数据都取完

  • 遍历:遍历强调的是要把整个数据依次全部取出

5.函数及面向对象

5.1 函数定义

  • 方法:对象(属性、方法)
  • 函数:对象外部
  • 方法赋值给变量,所以方法也是变量
  • return 后不要换行,浏览器会在return行后加return;
  • 执行ruturn代表函数结束,返回结果,如果没有执行ruturn,函数执行完也会返回结果,如:NaN(not a number),undefined(参数没传,方法体不识别)
  • 定义方式:function (items){…}是匿名参数,可以把结果赋值个createIts,通过createIts可以调用。效果等同与function createIts(items){…}
let createIts = function *(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}
  • 方法调用:参数问题:js可以传递任意一个或多个参数,也可以不传递参数,只有符合形参个数的参数起作用。

arguments 是js关键字,代表传递进来的所有参数,是一个数组

if(arguments.length<1){
    throw 'NaN!';
}else if(arguments.length>1){
    throw 'arguments error!';
}
  • 参数进来是否存在问题?
  • 假设不存在,如何规避?抛异常
//参数不存在,抛异常
function abs(num) {
    if(typeof num !== 'number'){
        throw 'not a number';
    }
    if(num>=0){
        return num;
    }else{
        return -num;
    }
}
  • 问题:arguments 包含所有的参数,当使用多余的参数进行附加操作,需要排除已有的参数

rest es6新特性 …rest可变长参数,获取以定义的参数之外的所有参数,只能写在参数最后面

function test(num,...rest) {
    console.log(num);
    console.log(rest);
}

5.1.2 变量的作用域

  • 在js中,var定义变量实际是有作用域的
  • 假设在函数体中声明,则在函数体外不可以用(想在外部用要闭包)
  • 两个函数使用了相同的变量名,只要在函数内部,就不冲突
  • 内部函数可以访问外部函数成员,反之不行
  • 内部函数和外部函数的变量重名,,则js会查找变量从自身函数开始,由内向外查找,假设外部存在同名函数变量,则内部函数会屏蔽外部函数变量。
function t1() {
    let n = 1;
    function t2() {
        let n =2 ;
        console.log(n);
    }
    console.log(n);
    t2();
}
t1();
  • js执行引擎自动提升了y的声明,但不会提升变量y的赋值。是在js建立之初就存在的特性。规范,变量定义放在函数头部,便于代码维护;
function t2() {
    var x = 'x' + y;
    console.log(x);
    var y = 'y'
}
t2();
xundefined
//相当于声明提前
function t3() {
    var y;
    var x = 'x' + y;
    console.log(x);
}

5.1.3 全局变量

5.1.4 全局对象window,默认所有的全局变量都会自动绑定到window对象下;

let i=0;
alert(i);
window.alert(i);
  • alert()函数是window变量
var old_alert = window.alert;
/*old_alert(111);*/
window.alert = function () {

}
//window.alert失效
window.alert(123);
window.alert = old_alert;
//恢复
window.alert(456)
  • js只有一个全局作用域window,任何变量(函数可视为变量),假设没有函数作用范围内找到,就会向外查找,若在全局作用域都找不到,报错Uncaught ReferenceError: m is not define

  • 所有全局变量绑定到window上,不同JS文件使用同样的全局变量,冲突->如何解决

//唯一全局变量,不绑定到window
let content = {};
//定义全局变量
content.name  = 'zk';
content.test = function () {
    //...
    return "xxx";
}
  • 把自己代码定义到自定义的空间名字中,降低全局匿名冲突的问题。jquery绑定到jquery上,简化为$
  • let 局部作用域变量关键字,解决局部作用域冲突问题。var是函数作用域,let 是块作用域
function test2() {
    for (var j = 0; j <5; j++) {  //var
        console.log(j)
    }
    console.log(j+1);  //6
}
test2();

  • const是常量,修饰后不可更改,只读变量;es6之前,用大写字母命名的变量是常量,不要修改其值。
jsDemo06.html:107 Uncaught TypeError: Assignment to constant variable.

5.2 方法

  • 方法把函数放在对象里面,对象只有:属性和方法
let person = {
    name:'zs',  //属性
    birth:'2000',
    age:function () { //方法
    return new Date().getFullYear() - this.birth;
    }
}
console.log(person.birth); //属性调用
console.log(person.age());  //方法调用
  • this代表什么,this是无法指向的,默认指向调用它的对象
function getAge() { //方法
    return new Date().getFullYear() - this.birth;
}
let person = {
    name:'zs',  //属性
    birth:'2000',
    age:getAge
}
console.log(person.birth); //属性调用
/*this指向调用它的对象 person*/
console.log(person.age());  //方法调用
/*this指向调用它的对象 window*/
console.log(getAge());  //NaN window
  • apply()函数控制this指向,所有的函数都有,在function上一级父类定义
function getAge() { //方法
    return new Date().getFullYear() - this.birth;
}
let person = {
    name:'zs',  //属性
    birth:'2000',
    age:getAge
}
console.log(person.birth); //属性调用
/*this指向调用它的对象 person*/
console.log(person.age());  //方法调用
/*this指向调用它的对象 window*/
console.log(getAge());  //NaN window
console.log(getAge.apply(person,[]));  //apply参数两个,指向对象,和参数同java要空参String[] args

5.5 创建对象

  • js/java/C#面向对象,js有区别

  • 类:模板(原型对象)、对象:具体实例

  • 原型,相当于父类

let persons={
    name:'zs',
    age:4,
    addr:'beijing',
    run:function () {
    console.log(this.name+'run');
    }
}
let zm = {
	name:'zm'
}
//原型指向persons
zm.__proto__ = persons;

5.6 class继承(新特性)es6引入

  • 原来往对象加方法
'use Strict'
let student = {
    name:'zs'
}

student.hello=function () {
    alert('方法');
}
console.log(student.hello());
  • es6后class继承,定义一个类,属性方法;
class Student{
    constructor(name) {
        this.name = name;
    }
    run(){
        alert(this.name+':run');
    }
}
let student = new Student('zs');
console.log(student.run());
  • 继承》本质,__ proto __: Student
class St1 extends Student{
    constructor(name,age) {
        super(name);
        this.age =age;
    }
    study(){
        alert(this.name+'在学习');
    }
}
let st1 = new St1('ls',3);
console.log(st1.run());

5.7 原型链继承(难)

  • __ proto __: 在js中每个函数都有Prototype属性,指向函数的原型对象

JavaScript基础总结

6.常用对象

  • 标准对象
typeof 123
'number'
typeof '456'
'string'
typeof true
'boolean'
typeof NaN
'number'
typeof []
'object'
typeof {}
'object'
typeof undefined
'undefined'
typeof Math.abs
'function'

6.1 Data:基本使用

let date = new Date(); //Sat Apr 16 2022 10:52:08 GMT+0800 (中国标准时间)
date.getMonth(); //月 0~11
date.getDate(); //日
date.getDay();  //星期几
date.getTime();//时间戳 全世界唯一,从1970-1-1 0:0:00 到现在的毫秒数
//时间戳转时间
let date1 = new Date(date.getTime());
console.log(date);
console.log(date1);
//当前时间转换,都是方法不是属性,属性在vue中
date.toLocaleString(); // '2022/4/16 10:57:04'
date.toLocaleTimeString(); //'10:57:04'
date.toGMTString();//'Sat, 16 Apr 2022 02:57:04 GMT'

6.2 Json

6.2.1 概述

  • BSON:nosql使用,名称源于Json,数据交换格式,用于MongoDB数据库中的数据存储和网络格式。二进制表示,标识简单数据机构,关联数组(对象。文本)其他数据类型。大文本形式。

  • xml:json前一代数据交换格式,规范的标签形式。解码Dom4j/DOM/SAX 等

  • json:轻量级的数据交换格式,简易的语法,用在js中,扩展性xml、json都不错。

    • 简介清晰的层次结构使得json称为理想的数据交换语言
    • 易于阅读编写,机器解析和生成,有效提升网络传输效率。
  • js中一切皆为对象,js支持的类型都可以用json标识

6.2.2 格式

  • 对象用{}
  • 数组,list用[]
  • 键值对用key:value
  • JSON字符串和js对象的转换
let persons={
    name:'zs',
    age:4,
    addr:'beijing'
}
console.log(persons);
let jsonPersons = JSON.stringify(persons);
console.log(jsonPersons);  //{"name":"zs","age":4,"addr":"beijing"}
let parse = JSON.parse(jsonPersons);
let parse1 = JSON.parse('{"name":"zs","age":4,"addr":"beijing"}');
console.log(parse);
console.log(parse1);
  • JSON字符串’{“name”:“zs”,“age”:4,“addr”:“beijing”}’
  • js对象{name: ‘zs’, age: 4, addr: ‘beijing’}

6.2.3 前端请求

  • 原生js写法,XHR异步请求
  • Jquery封装好的方法$(“#xx”).ajax(‘’)
  • axios请求

7.操作Dom元素:

  • 文档对象模型,整个浏览器网友就是一个Dom树形结构。
  • 操作一个Dom节点,先要获取这个Dom节点

7.1 动态插入Dom节点

  • 获得某个节点,若这个dom节点是空的可以通过innerHTML增加一个元素(覆盖式的增加)若这个dom节点已经存在元素了,就不能这么做。
  • 追加操作:追加到后面
<p id="p0">p0</p>
<div id="father">
    <h1>标题</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>


 let
        father = document.getElementById('father'),
        p0 = document.getElementById('p0');
        father.appendChild(p0)
  • 创建一个新的标签插入

    let p4 = document.createElement('p');
        p4.id = 'p1';
        p4.innerText = '测试';
        father.append(p4);
    
  • 设置属性的通用写法,标签和类选择器获取的是HTMLCollection 集合,不是head/body元素

let headEles = document.getElementById('he'),  //getElementsByTagName()获取的没法,head中无法加入
myScript = document.createElement('script');

body = document.getElementById('bd');//getElementsByTagName()无法获取body元素

//设置标签属性通用写法
myScript.setAttribute('type','text/javascript');
myScript.src = 'js/jsDemo01.js';
/*father.appendChild(myScript);*/
headEles.appendChild(myScript);
 body.style.backgroundColor = '#68a0d9';
 
body = document.getElementsByClassName('bd');//返回集合元素,集合第一个是页面元素
body[0].style.backgroundColor = '#68a0d9';
myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
myStyle.innerText = 'body{background-color:#68a0d9}'
headEles.appendChild(myStyle);
  • 元素插入到某元素之前
let
    father = document.getElementById('father'),
    p0 = document.getElementById('p0'),
    p1 = document.getElementById('p1');
   /* father.appendChild(p0)*/
   //要包含的元素,新元素,坐标元素
    father.insertBefore(p0,p1);
  • 元素插入到某元素之后
//坐标元素,新元素
p1.append(p0);

7.2 动态更新Dom节点

<div id="father">
    <h1>标题</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>
father.innerText = '哈哈';
father.innerHTML='<p id="p1">p3</p><p class="p2">p4</p>'
  • 操作文本

    • innerText修改文本的值
    • innerHTML可以解析HTML文本标签
  • 操作CSS

    • father.style.fontSize = '50px'  //属性使用字符串包裹
      '50px'
      father.style.color = 'red' 
      'red'
      father.style.paddingLeft = '1em' //-转驼峰命名问题padding-Left ~ paddingLeft
      

7.3 动态删除Dom节点

  • 步骤:先获取父节点,然后在删除子节点,不能自我删除
<div id="father">
    <h1>标题</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>

let father = document.getElementById('father');
let children = father.children;
//children[1].remove();
father.removeChild(p1);
//通过自己找到父类在删除自己
let self = document.getElementById('p1');
let father1 = self.parentElement;
father1.removeChild(self);
//删除自己
 let self = document.getElementById('p1');
 let father1 = self.parentElement;
 let children1 = father1.children;
 father1.removeChild(self);
 father1.removeChild(children1[0]);
  • 注意:删除多个节点的时候,children是在时刻变化的,删除节点时要注意。

7.4 遍历Dom节点:得到Dom节点

<div id="father">
    <h1>标题</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>

let father = document.getElementById('father');
let children = father.children; //获取父节点下的所有子节点father.children[index]某个节点
//操作元素
console.log(children[1]);	//方式1
father.firstElementChild    //方式2
<h1>​标题​</h1>​
father.lastElementChild
<p class=​"p2">​p2​</p>​

8.操作Bom元素、B/S浏览器B对象O模型M

  • js最初作用在浏览器中运行
  • ie8中css3的一些特性不支持
  • linux默认支持FireFox

8.1 window:代表浏览器窗口,全局作用域

window.innerHeight
422
window.outerHeight
824
window.outerWidth
1536
window.innerWidth
1536
//浏览器窗口对象

8.2 navigator:浏览器对象,封装了浏览器信息(不建议使用)

navigator.appName
'Netscape'
navigator.platform
'Win32'
navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
navigator.userAgent
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
  • 大多数时候不会使用navigator对象,Navigator类,因为会被认为修改,不建议使用这些属性来判断和编写代码

8.3 screen:全屏幕属性

screen.height//尺寸
864px
screen.width
1536

8.4 location:当前定位url信息

  • 代表当前页面的url信息
//重定向url
location.assign('https://fanyi.baidu.com/')
host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/"
protocol: "https:"
//刷新
location.reload()

8.5 Document:当前页面信息,文档,thml用dom文档树显示

//修改网页面板titile
document.title
'百度一下,你就知道'
document.title='haha'
'haha'
  • 获取具体的文档树节点,删减节点修改网页,控制行为
<body>
<dl id="sa">
    <dt>类目</dt>
    <dd>1</dd>
    <dd>2</dd>
</dl>
<script>
    let elementByIds = document.getElementById('sa');
    console.log(elementByIds)
</script>
</body>
  • 获取cookie
document.cookie
'sts=1; zh_module_btn=1; wc=71109; lc=71109; lc2=71109; wc_n=%25u9102%25u5C14%25u591A%25u65AF; Hm_lvt_190fe29a5ff5a6f0c6d3fb4f2e7d5390=1649820988; Hm_lpvt_190fe29a5ff5a6f0c6d3fb4f2e7d5390=1650088544; bdUid=CB896256453A000BB76997D40008'
  • 劫持cookie原理,恶意人员通过三方脚本获取浏览器的cookie上传到他服务器
  • 服务器端可以设置cookie:httpOnly只读保证安全性

8.6 History:浏览器前进后退,历史记录(不建议使用)

history.forward()//前进
history.back() //后退
  • 用ajax替代

8.7 操作表单:验证

  • 表单目的:提交信息
  • 获取和设置表单的值
<form action="jsDemo09.html" method="post">
    <label for="username">用户名:</label>
    <input type="text" name="username" id="username">
    <label for="pwd">密码:</label>
    <input type="password" name="pwd" id="pwd">
    <label >性别:</label>
    <input type="radio" name="boy" id="boy" value="boy">男
    <input type="radio" name="girl" id="girl" value="girl">女
    <input type="submit"><input type="reset">
</form>
let username = document.getElementById('username'),
    boy = document.getElementById('boy'),
    girl = document.getElementById('girl')
//得到输入框的值
username.value
//修改输入框的值
username.value='456'
//判断单选框是否选中
girl.checked;  //true/false,对于单选框、多选框girl.value只能获取属性值
girl.checked=true;  //选中单选框某项
  • 提交表单。MD5加密密码
<head>
    <meta charset="UTF-8">
    <title>jsDemo11</title>
    <script src="js/md5.js"></script>
    <!--区域节点不同-->
    <!--<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>-->
</head>
<body>
<!--
onsubmit="return checkfunct()"  配合<input type="submit">  type="submit"使用
表单绑定提交事件,onsubmit绑定一个提交检测函数true,false
将这个结果返回表单,使用onsubmit接受
-->
<form action="jsDemo09.html" method="post" onsubmit="return checkfunct()">
    <label for="username">用户名:</label>
    <input type="text" name="username" id="username" required>
    <label for="pwd">密码:</label>
    <!--为保证密码的安全性和可视性显示一个密码框没有name而不提交,提交的是hidden后的md5加密密码-->
    <input type="password" id="pwd">
    <input type="hidden" name="pwd" id="pwdhidden">
    <label >性别:</label>
    <input type="radio" name="boy" id="boy" value="boy">男
    <input type="radio" name="girl" id="girl" value="girl">女
    <!--<input type="submit">-->
    <button type="submit">提交</button>
    <!--绑定事件onclick被点击xx()-->
    <!--<input type="button" onclick="" value="提交">-->
    <input type="reset">
</form>
<script>
    function checkfunct(){
        let username = document.getElementById('username'),
            pwd = document.getElementById('pwd'),
            pwdhidden = document.getElementById('pwdhidden');
            pwdhidden.value = blueimp_md5(pwd.value);
        //可以校验判断表单内容,true是通过提交,false阻止提交
        return true;
    }

</script>

8.8 操作文件

9.JQuery

  • JQuery是js的函数库
<head>
    <meta charset="UTF-8">
    <title>jsDemo12</title>
     <!--cdn引入-->
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>
<a href="#" id="aid">点击</a>
<script>
    /*公式 $(selector).action*/
    /*选择器就是css选择器*/
    $('#aid').click(function () {
        alert('hello!')
    })
</script>

/公式 $(selector).action()/ 选择器:事件

  • 选择器:站点https://jquery.cuishifeng.cn/index.html

9.1 事件

  • 鼠标事件

    • $('#p1').mousedown(function () {
              alert('鼠标点击!')
      })
      
      $('#p1').mousemove(function () {
          alert('鼠标移动!')
      })
      
    <style>
        #content{
            width: 500px;
            height: 500px;
            border: 2px saddlebrown solid;
        }
    </style>
    <!--cdn引入-->
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

</head>
<body>
<a href="#" id="aid">点击</a>
<p id="p1">aaa</p>
<div id="content"></div>
<script>
    //当网页元素加载完毕后,相应事件
    $(document).ready(function () {
        /*alert('hello!dddd')*/
    })
    //简写
    $(function () {
        $('#content').mousemove(function (e) {
            $('#p1').text('x:'+e.pageX+'=='+'y:'+e.pageY);
        })
    })
</script>

9.2 操作Dom

  • 节点文本操作
<ul id="content">
    <li id="li1">li1</li>
    <li class="li2">li2</li>
    <!--<p class="p1">ps3</p>-->
</ul>
<script>
    $('#content li[id=li1]').text();  //获得值
    //文本操作
    $('#content li[id=li1]').text('123') //设置值
    $("#content li[id='li1']").text('789')
    $('#content li[id=li1]').html();
    /*$('#content li[id=li1]').html('<p class="p1">ps3</p>');*/
   $('#content li[class=li2]').after('<p class="p1">ps3</p>');
</script>
  • css操作:键值对,键值对数组
$('#content li[id=li1]').css({"color":"red","background":"blue"});
$('#content li[class=li2]').css("color","blue")
  • 元素的显示和隐藏;本质是display: none;
$('#content p[class=p1]').hide();
$('#content p[class=p1]').show();
  • 扩展测试
$(window).height()
496
$(window).width()
1536
$(document).height()
515
$(document).width()
1536
  • ajax
$(selector).ajax({ url: "test.html", context: document.body, success: function(){
    $(this).addClass("done");
}});
  • 前端提升:研究网页游戏,看jquery源码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123973.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!