大一下 Javascript学习笔记(下)

108 阅读2分钟

下半学期学了很多东西,包括es6新属性,layui,bootsrap,vue3等,所以仅根据老师发的期末复习提纲,大致总结一下

BOM

这里没有过于深入的讲,需要知道的是history,navigator,location三者是同级的

DOM

事件和事件流
事件
onclick鼠标点击左键触发
onblur失去鼠标焦点触发
--------------

事件流分为两种,一种是冒泡,一种是捕获

比如冒泡:
<body>
<div  id="parent">parent
<button id="child" class="child">child</button>
</div >
</body>

<script>
document.getElementById("parent").addEventListener(
"click", function(e) {
alert("parent事件被触发," + this.id);})
alert("child事件被触发," + this.id)})
</script>

执行后会发现,只点击parent,弹出parent事件被触发,而当点击child时,不仅会弹出child,还会弹出parent,这就是冒泡

例子:鼠标放到li上对应的li背景变灰。

一般情况下,如果想要对应的li变灰,遍历,但是利用冒泡,直接通过父级元素然后取得被点击的子级元素渲染即可,性能更佳

$("ul").on("mouseover",function(e){
$(e.target).css("backgroundcolor","#ddd").siblings().
css("background-color","white");})
也可以通过事件委托来实现

事件委托:父节点接受委托给子节点分配点击事件

document.getElementById('list').addEventListener(
'click', function (e) {
$(e.target).css("backgroundcolor","#ddd").siblings().
css("background-color","white");}
)
如何取消冒泡事件

event.stopPropagation()

节点的获取和操作

获取节点
js

访问父节点:xxx.parentNode

访问子节点:

  • childNodes 属性返回所有的节点,包括文本节点、注释节点;
  • children 属性只返回元素节点;

一般使用children

jQuery
  $("#test1").parent(); // 父节点
    $("#test1").parents(); // 全部父节点
    $("#test1").parents(".mui-content");
    $("#test").children(); // 全部子节点
    $("#test").children("#test1");
    $("#test").contents(); // 返回#test里面的所有内容,包括节点和文本
    $("#test").contents("#test1");
    //兄弟节点
    $("#test1").prev();  // 上一个兄弟节点
    $("#test1").next(); // 下一个兄弟节点
    $("#test1").siblings(); // 所有兄弟节点
    $("#test1").siblings("#test2");
    $("#test").find("#test1");
节点的增:

appendChild() 方法可向节点的子节点列表的末尾添加新的子节点。

节点的删

removeChild()

ES6

对象和面向对象
第一种方式:
var swk = {
name: '孙悟空',
age: 365,
gender: '男',
say: function() {					console.log(this.name + "说话了");
}}
swk.say();
swk.weapon = '如意金箍棒';
第二种方式:批量创建对象
class Hero {
constructor(name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
this.say = function() {
console.log(this.name + "在说话");
}}
}

var bgj = new Hero('白骨精', 18, '女');
var zzj = new Hero("蜘蛛精", 16, '女');
Hero.prototype.weapon = '默认兵器';			Hero.prototype.fly = function() {
console.log(this.name + "飞起来了");
}
bgj.weapon = "白骨剑";

以函数方式创建

function Hero(name, age, gender, skill) {
				this.name = name;
				this.age = age;
				this.gender = gender;
				this.skill = skill;
				this.say = function() {
					console.log(this.name + '说话了');
				}
			}
			var swk = new Hero('孙悟空', 20000, '男', '筋斗云');
			var zbj = new Hero('猪八戒', 390, '男', '能吃')
			swk.weapon = '如意金箍棒';
			zbj.weapon = ' 九齿钉耙';
			Hero.prototype.phone = '13600000';
函数
new Function()

var myFun = new Function('a', 'b', 'return a + b'); //构造函数

箭头函数

var mf2 = (a, b) => a * b;

箭头函数的缺点

let multiply = (a, b) => b === undefined ? b => a * b : a * b;
//三元表达式
		let double = multiply(3);
		alert(double(3)); //9
		alert(multiply(2, 3)); //6

this指向(重要)

普通函数里,this指向访问当前方法的对象
let obj={
a:888,
b:function(){
console.log(this)
}
}
obj.b()

在这里,是一个普通函数,obj调用了b(),所以this指向的是obj这个对象

普通函数里的this是不受环境定义影响的,只受到调用者
function a(){
log(this)
}
a() //window

在这个里面,a()相当于window.a(),所以指向的是window

构造函数的this

但是构造函数又不一样了,构造函数一般调用时指向的是对象

function a(){
this //调用它的obj
}
let obj=new a()

特例:setTimeout

setTimeout(a,100) 在这里,a被setTimeout用,而setTimeout是window.setTimeout(),所以指向的是window

箭头函数,this取决于定义的环境

箭头函数其实没有this,所以要到外面去找this,然后把外层代码块的this给继承过来,比如:

let fn=()=>console.log(this)
fn() 
let a=function(){
console.log(this);
}
a() //window

如果是普通函数,那么就是window(严格模式下是undefined,因为不知道是谁调用的),但是这里是箭头函数,就会出去找,最后也是window

还有一个例子:

let obj={
a:function(){
log(this)
},
t:this,
b:()=>log(this)
}
log(obj.a())  //obj
log(obj.b())  //这个this,相当于t,而t的this又obj所属于的对象,也就是window

在构造函数里,箭头函数的指向与在上面的不一样:

function A(){
this //下面调用它的obj

this.a=()=>this //是外层的this,而外层的this指向的是obj
this.b=function(){
return this  //obj
}

}
let obj=new A()
log(obj.a())  //obj
log(obj.b())  //obj

老师给的例子:

var name="clever coder"
	var person={
		name:"fooler",
		hello:function(){
			var sayhello=function(){
				console.log(this.name+"say hello");
			}
			sayhello()
		}
	}
	console.log(person.hello());

在这个例子中,person.hello按理来说里面的this.name是person的name,但是在hello里还有一个函数,调用sayhello()是window.sayhello(),所以在sayhello里this.name是window里的name,也就是clever coder,所以最后结果是clever coder

ES6

let const

let 声明的变量只在 let 命令所在的代码块内有效。 let不存在变量提升

//let 是在代码块内有效,var 是在全局范围内有效:
{ let a = 0; var b = 1; }
a // ReferenceError: a is not defined 
b // 1
//let 只能声明一次 var 可以声明多次:
let a = 1; let a = 2; var b = 3; var b = 4;
a // Identifier 'a' has already been declared 
b // 4

const 声明一个只读的常量,一旦声明,常量的值就不能改变。

拓展运算符...

拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象

let people={age:15,name:"ll}
let someone={...people}

//还可以用于合并两个对象
let age={age:14}
let name={name:"amy"}
let people={...age,...name}

//注意:相同类型的数据后者会覆盖前者
ES6模块

export和import export default不需要加{},不需要相同名字 (这里没太懂)

jQuery

jQuery的入口函数$(function(){...}) $是jQuery的顶级对象,相当于JavaScript里的window

DOM对象转化为jQuery对象

对于一个DOM对象,只需要用$()把DOM对象给包装起来,就可以获得一个jQuery对象了,方式为$(DOM对象)

var cr = document.getElementsByTagName("p"); //DOM对象
var $cr = $(cr); //转成jQuery对象
选择器(要加引号)

ID选择器 $("#id")

类选择器 $(".class")

标签选择器 $("p")

交集选择器 $("div.p")

全选选择器 $("*")

子代选择器(只获取最近的子代,不会涉及孙子):$("ul>li")

后代选择器(后代所有的):$("ul li")

筛选方法(同上文的节点获取)

重点关注:parent(),children(),eq(),siblings()

$("li").eq(2)相当于$("li:eq(2)")index从0开始

:even 匹配所有索引值为偶数的元素,从0 开始计数
:odd 匹配所有索引值为奇数的元素,从0 开始计数
:eq(index) 匹配一个给定索引值的元素*

表单过滤器: :radio 匹配所有的单选框 :input 匹配所有input, textarea, select 和button 元素 $("input[name='items']:checked").val()获取表单radio选中的值 $("select[name='items'] :option[selected]").text();

jQuery设置样式

$("div").css("属性","值")

jQuery遍历元素

$.each(要遍历的对象,function(index索引,element内容){
xxx
})

jQuery事件

$("div").click(function(){
        xxx
})  //注意没有on

方法处理之on()

$("div").on({
mouseover:function(){},
click:function(){}
})

Vue

组件写法:
<div id="app">
			<lly></lly>
		</div>
		<script>
			const app=Vue.createApp({})  //创建一个vue应用
			//定义一个名字为lly的组件
			app.component("lly",{
				data(){
					return {counter:0}
				},
				template:`
				<button @click="counter++">lly{{counter}}</button>
				`
			})
			app.mount("#app")
		</script>