JavaScript基础知识&获取指定元素的当前样式&事件委派&BOM介绍

1.in 运算符

​ 作用: 判断一个对象中是否有指定的属性 (包括对象中的原型,以及对象中的原型的原型直到Object的原型为止)

​ 用法: “属性名” in 对象

hasOwnProperty() 这个方法也可以用于判断一个对象中是否有指定的属性

​ 用法: 对象.hasOwnProperty(属性名) 如果有就返回true,否则返回false(这个方法只用于判断对象本身的属性,不包括原型上的)

2.for … in遍历对象

​ 用法:

for(var 变量 in 对象){
 	变量:就是对象中的每一个属性名
    对象[变量]: 就是对应的属性值
}

3.数组的方法

slice和splice

var arr = ["孙悟空","猪八戒","沙和尚","唐僧","白骨精"];
			
			/*
			 * slice()
			 * 	- 可以用来从数组提取指定元素
			 * 	- 该方法不会改变元素数组,而是将截取到的元素封装到一个新数组中返回
			 * 	- 参数:
			 * 		1.截取开始的位置的索引,包含开始索引
			 * 		2.截取结束的位置的索引,不包含结束索引
			 * 			- 第二个参数可以省略不写,此时会截取从开始索引往后的所有元素
			 * 		- 索引可以传递一个负值,如果传递一个负值,则从后往前计算
			 * 			-1 倒数第一个
			 * 			-2 倒数第二个
			 */
			
			var result = arr.slice(1,4);
			
			result = arr.slice(3);
			
			result = arr.slice(1,-2);
			
			//console.log(result);
			
			/*
			 * splice()
			 * 	- 可以用于增删改数组中的指定元素
			 * 	- 使用splice()会影响到原数组,会将指定元素从原数组中删除
			 * 		并将被删除的元素作为返回值返回
			 * 	- 参数:
			 * 		第一个,表示开始位置的索引
			 * 		第二个,表示删除的数量
			 * 		第三个及以后。。
			 * 			可以传递一些新的元素,这些元素将会自动插入到开始位置索引前边
			 * 	
			 */
			
			arr = ["孙悟空","猪八戒","沙和尚","唐僧","白骨精"];
			var result = arr.splice(3,0,"牛魔王","铁扇公主","红孩儿");
			
			console.log(arr);
			//console.log(result);

数组去重

//创建一个数组
			var arr = [1,2,3,5];
			
			//去除数组中重复的数字
			//获取数组中的每一个元素
			for(var i=0 ; i<arr.length ; i++){
				/*获取当前元素后的所有元素*/
				for(var j=i+1 ; j<arr.length ; j++){
					//判断两个元素的值是否相等
					if(arr[i] == arr[j]){
						//如果相等则证明出现了重复的元素,则删除j对应的元素
						arr.splice(j,1);
						//当删除了当前j所在的元素以后,后边的元素会自动补位
						//此时将不会在比较这个元素吧,我需要在比较一次j所在位置的元素
						//使j自减
						j--;
					}
				}
			}
			
			console.log(arr);

/**
 * 
 * @param {Array} arr 
 */
function unique1(arr){
    //声明一个空数组
    const result = [];
    //遍历原始数组
    arr.forEach(item => {
        //检测 result 数组中是否包含这个元素
        if(result.indexOf(item) === -1) {
            //若没有该元素 则插入到result中
            result.push(item);
        }
    });
    //返回
    return result;
}

/**
 * 
 * @param {Array} arr 
 */
function unique2(arr){
    //声明空数组
    const result = [];
    //声明空对象
    const obj = {};
    //遍历数组
    arr.forEach(item => {
        if(obj[item] === undefined){
            //将 item 作为下标存储在 obj 中
            obj[item] = true;
            result.push(item);
        }
    });
    //返回结果
    return result;
}

/**
 * @param {Array} arr 
 */
function unique3(arr){
    // //将数组转化为集合 Set
    return [...new Set(arr)];
}

4.函数的方法call和apply

<script type="text/javascript">
			function fun(a,b) {
				console.log("a = "+a);
				console.log("b = "+b);
				//alert(this);
			}
			
			var obj = {
				name: "obj",
				sayName:function(){
					alert(this.name);
				}
			};

			/*
			 * call()和apply()
			 * 	- 这两个方法都是函数对象的方法,需要通过函数对象来调用
			 * 	- 当对函数调用call()和apply()都会调用函数执行
			 * 	- 在调用call()和apply()可以将一个对象指定为第一个参数
			 * 		此时这个对象将会成为函数执行时的this
			 * 	- call()方法可以将实参在对象之后依次传递
			 * 	- apply()方法需要将实参封装到一个数组中统一传递
			 * 
			 * 	- this的情况:
			 * 		1.以函数形式调用时,this永远都是window
			 * 		2.以方法的形式调用时,this是调用方法的对象
			 * 		3.以构造函数的形式调用时,this是新创建的那个对象
			 * 		4.使用call和apply调用时,this是指定的那个对象
			 */
			
			//fun.call(obj,2,3);
			fun.apply(obj,[2,3]);

			

			var obj2 = {
				name: "obj2"
			};

			/*fun.apply();
			fun.call();
			fun();*/

			//fun.call(obj);
			//fun.apply(obj);

			//fun();
			
			//obj.sayName.apply(obj2);
		</script>

5.获取指定元素的当前样式(兼容所有浏览器)

/*
			 * 定义一个函数,用来获取指定元素的当前的样式
			 * 参数:
			 * 		obj 要获取样式的元素
			 * 		name 要获取的样式名
			 */
			
			function getStyle(obj , name){
				
				if(window.getComputedStyle){
					//正常浏览器的方式,具有getComputedStyle()方法
					return getComputedStyle(obj , null)[name];
				}else{
					//IE8的方式,没有getComputedStyle()方法
					return obj.currentStyle[name];
				}
				
				//return window.getComputedStyle?getComputedStyle(obj , null)[name]:obj.currentStyle[name];
				
			}

6.事件委派(事件委托)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			window.onload = function(){
				/*
				 * 我们希望,只绑定一次事件,即可应用到多个的元素上,即使元素是后添加的
				 * 我们可以尝试将其绑定给元素的共同的祖先元素
				 * 
				 * 事件的委派(事件的委托)
				 * 	- 指将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素
				 * 		从而通过祖先元素的响应函数来处理事件。
				 *  - 事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能
				 */
				var ul = document.querySelector("ul");
				ul.onclick = function(e){
					e = e || event;
					if(e.target.nodeName == 'A'){
						alert(e.target.innerHTML);
					}
				}
				
				var btn = document.querySelector("button");
				btn.onclick = function(){
					var li = document.createElement("li");
					li.innerHTML = "<a href='javascript:;'>新添加的链接</a>";
					ul.appendChild(li);
				}
			}
		</script>
	</head>
	<body>
		<button type="button">添加一个新的链接</button>
		<ul>
			<li><a href="javascript:;">链接一</a></li>
			<li><a href="javascript:;">链接二</a></li>
			<li><a href="javascript:;">链接三</a></li>
		</ul>
	</body>
</html>

7.BOM(Navigator&如何判断浏览器的名称)

/*
			 * BOM
			 * 	- 浏览器对象模型
			 * 	- BOM可以使我们通过JS来操作浏览器
			 * 	- 在BOM中为我们提供了一组对象,用来完成对浏览器的操作
			 * 	- BOM对象
			 * 		Window
			 * 			- 代表的是整个浏览器的窗口,同时window也是网页中的全局对象
			 * 		Navigator
			 * 			- 代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器
			 * 		Location
			 * 			- 代表当前浏览器的地址栏信息,通过Location可以获取地址栏信息,或者操作浏览器跳转页面
			 * 		History
			 * 			- 代表浏览器的历史记录,可以通过该对象来操作浏览器的历史记录
			 * 				由于隐私原因,该对象不能获取到具体的历史记录,只能操作浏览器向前或向后翻页
			 * 				而且该操作只在当次访问时有效
			 * 		Screen
			 * 			- 代表用户的屏幕的信息,通过该对象可以获取到用户的显示器的相关的信息
			 * 
			 * 
			 * 		这些BOM对象在浏览器中都是作为window对象的属性保存的,
			 * 			可以通过window对象来使用,也可以直接使用
			 * 
			 * 		
			 */
			
			//console.log(navigator);
			//console.log(location);
			//console.log(history);
			
			/*
			 * Navigator
			 * 	- 代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器
			 * 	- 由于历史原因,Navigator对象中的大部分属性都已经不能帮助我们识别浏览器了
			 * 	- 一般我们只会使用userAgent来判断浏览器的信息,
			 * 		userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,
			 * 		不同的浏览器会有不同的userAgent
			 * 
			 * 火狐的userAgent
			 * 	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
			 * 
			 * Chrome的userAgent
			 *  Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
			 * 
			 * IE8
			 * 	Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
			 * 
			 * IE9
			 * 	Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
			 * 
			 * IE10
			 * 	Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
			 * 
			 * IE11
			 * 	Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko
			 * 	- 在IE11中已经将微软和IE相关的标识都已经去除了,所以我们基本已经不能通过UserAgent来识别一个浏览器是否是IE了
			 */
			
			//alert(navigator.appName);
			
			var ua = navigator.userAgent;
			
			console.log(ua);
			
			if(/firefox/i.test(ua)){
				alert("你是火狐!!!");
			}else if(/chrome/i.test(ua)){
				alert("你是Chrome");
			}else if(/msie/i.test(ua)){
				alert("你是IE浏览器~~~");
			}else if("ActiveXObject" in window){
				alert("你是IE11,枪毙了你~~~");
			}
			
			/*
			 * 如果通过UserAgent不能判断,还可以通过一些浏览器中特有的对象,来判断浏览器的信息
			 * 比如:ActiveXObject
			 */
			/*if("ActiveXObject" in window){
				alert("你是IE,我已经抓住你了~~~");
			}else{
				alert("你不是IE~~~");
			}*/
			
			/*alert("ActiveXObject" in window);*/
			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值