前端基础--JavaScript

2023-11-07

一、JavaScript介绍

● 虽然是java作为前缀,但java和javascript的关系,就像老婆和老婆饼之间的关系,没有一毛钱关系!
● 网景公司在Netscape2.0首先推出了JavaScript
● JavaScript 的正式名称是 “ECMAScript”,此标准由 ECMA 组织发展和维护,简称“js”
● JavaScript 是一种网页编程技术,用来向 HTML 页面添加交互行为
● JavaScript 是一种基于对象和事件驱动的解释性脚本语言,直接嵌入 HTML 页面,由浏览器解释执行代码,不进行预编译。

1.js的特点

● 可以使用任何文本编辑工具编写,只需要浏览器就可以执行程序 (后面会学习不用浏览器也能运行)
● 解释执行:事先不编译,逐行执行
● 基于对象:内置大量现成对象
● 适宜:
 客户端数据计算
 客户端表单合法性验证
 浏览器事件的触发
 网页特殊显示效果制作

2.js的组成

● ECMAScript:定义核心语法,关键字,运算符,数据类型等系列标准
● DOM:文档对象模型,将一个html页面的所有节点看成是一个一个的对象。更有层次感的管理每一个节点。
● BOM:浏览器对象模型,是对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。使 BOM 独树一帜且又常常令人怀疑的地方在于,它只是 JavaScript 的一个部分,没有任何相关的准。
 弹出新的浏览器窗口
 移动、关闭浏览器窗口以及调整窗口大小
 提供 Web 浏览器详细信息的定位对象
 提供用户屏幕分辨率详细信息的屏幕对象
 对 cookie 的支持
 IE 扩展了 BOM,加入了 ActiveXObject 类,可以通过 JavaScript 实例化    ActiveX对象,进而实现ajax局部刷新技术

二、HTML与javaScript结合方式

1.行内脚本

  1. 点击按钮(触发)
  2. 弹框(具体的操作)
<h2 onclick="alert('行内js');">点击此处</h2>

2.内部脚本

  1. 使用< script >< /script >
  2. 标准是写在head和body之间(脖子位置),但其实只要写在html文件内部就可以,无论什么位置 < html >外,< p >< /p >内部,都可以。
<body>
	<script>
		alert("内部js");
	</script>
</body>

3.外部脚本

  1. 在项目根目录下创建一个目录js
  2. 在js目录中创建一个文件,后缀名是.js
  3. 在html页面中,使用
<script src="js/xx.js"></script>

注意
以上使用脚本的三种方式的优先级,谁在上,谁先执行。因为是解释性语言。

三、JavaScript的使用

1.变量

● 因为js是弱类型语言,所以,在定义变量的时候,所有的数据类型都是var
● 声明变量: var x ; var x,y;
● 数值类型:number
 不区分整型数值和浮点型数值
 所有数字都采用 64 位浮点格式存储,类似于double 格式
● 字符串:string
 首尾由单引号或双引号括起

var aa="欢迎来到\"JavaScript世界";

● 布尔类型:
 仅有两个值:true和false也代表1和0
 实际运算中true=1,false=0

①自动类型转换

数字 + 字符串:数字转换为字符串 10+’a’ -> 10a
数字 + 布尔值:true转换为1,false转换为0 true+5->6
字符串 + 布尔值:布尔值转换为字符串true或false true+’a’->truea
布尔值 + 布尔值:布尔值转换为数值1或0 true+true->2

②数据类型转换函数

● parseInt:强制转换成整数
 如果不能转换,则返回 NaN (NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字)
 例如:parseInt(“6.32”)=6
● parseFloat:强制转换成浮点数
 如果不能转换,则返回 NaN
 例如:parseFloat(“6.32”)=6.32
● typeof:查询数值当前类型,返回 string / number / boolean / object
 例如:typeof(“test”+3)==“string”

③null 与 undefined

● null 在程序中代表“无值”或者“无对象”
 可以通过给一个变量赋值 null 来清除变量的内容
● undefined
 声明了变量但从未赋值或者对象属性不存在

④算术运算

● 加(+)、 减(-)、 乘( * ) 、除( / ) 、余数( % )
 - 可以表示减号,也可以表示负号,如:x = -y
 +可以表示加法,也可以用于字符串的连接
● 递增( ++ ) 、递减( – )
 i++ 相当于 i=i+1
 i-- 相当于 i=i-1

⑤关系运算

● 严格相等: ===
 类型相同
 数值相同
● 非严格相等:! ==

var a = “10”;
var b = 10;
if (a == b)
alert(“equal”);
if (a === b)
alert(“same”);

⑥逻辑运算

● 逻辑非(!)、逻辑与(&&)、逻辑或(||)
● 逻辑运算的操作数均为 boolean 表达式

在这里插入图片描述

⑦控制语句

if(关系表达式) {
	// 语句块 1
}else {
	// 语句块 2
}


if (表达式1) {
	// 语句1;
}else if (表达式2){
	// 语句2;
}else if (表达式3){
	// 语句3;
} else{
	// 语句4;
}


switch (表达式) {
	case 值1:
		// 语句1;
		break;
	case 值2:
		// 语句2;
		break;
	default:
		// 语句4;
}


/* 注意for循环中是var i=1 不是int  注意跟java区分 */
for (var i=1 ; i<=5 ; i++){
	alert(i);
}


while (条件){
	// 语句1;
	...
}

2.常用字符串API

● length:获取字符串的长度(字符串中字符的个数) 属性,没有小括号

var str = "hello";
console.log( str.length );

● toUpperCase/toLowerCase :转大小写

var name = "JavaScript";
console.log( "大写:"+name.toUpperCase() );
console.log( "小写:"+name.toLowerCase() );

● charAt(下标) : 返回某个下标上的字符

var str1 = "javascript网页教程";
var str2 = str1.charAt(12); // 下标12上的字符
console.log(str2); //教
var str3 = str1.charCodeAt(12);
console.log(str3); //25945:(汉字“教”在unicode编码中的编号)

● indexof(字符):查找字符串中字符出现的首次下标
● lastIndexof(字符):查找字符串中字符最后一次出现的下标

var str1 = "javascript网页教程";
var str2 = str1.indexOf("a");
console.log(str2); // 1 , a字符在str1中第一次出现的下标
var str3 = str1.lastIndexOf("a"); //3,a字符在str1中最后一次出现的下标console.log(str3);

● substring(开始,结束):截取字符串中一部分(结束是不包含的)

var str1 = "abcdefgh";
var str2 = str1.substring(2,4);
console.log(str2); //cd,从2开始(包含),4结束(不包含)

● replace(旧的,新的):将字符串中的旧字符替换成新字符

var str1 = "abcde";
var str2 = str1.replace("cd","XXX");
console.log(str2); // abXXXe,将str1中的cd替换成XXX

● split(分割的节点):一个字符串切割成N个小字符串,所以返回的是数组类型

var str1 = "一,二,三,四,五";
var arr = str1.split(","); // 将str1 以逗号进行分割,分割成N份,所以返回的结果一定是数组结构
console.log( "共分割成:"+arr.length+"份" );
console.log( "第三份是:" + arr[2] ); // 三

3.数组

①创建数组

var arr1 = new Array();

②初始化数组的三种方式

// 第一种
var arr1 = new Array();
arr1[0] = 110;
arr1[1] = 119;
arr1[2] = 120;
// 第二种
var arr1 = new Array(10,"a",true);
// 第三种
var arr1 = [10,"a",true];
for (var i = 0; i < arr1.length; i++) {
	console.log(arr1[i]);
}

③数组的常用方法

● tostring():将数组转换成字符串

var arr = [1,2,3,4];
console.log("类型为:" + typeof( arr ) );
var str = arr.toString(); // 将数组转换成字符串
console.log( str +",类型为:" + typeof( str ) );

● join(连接符号):将数组中的每个元素用连接符号连接成一个新的字符串。

var arr = [1,2,3,4];
var str = arr.join("-"); // 将数组中每个元素用-进行连接,并形成一个全新的字符串
console.log( str +",类型为:" + typeof( str ) );

● concat(新元素):将原来的数组连接新元素,原数组不变。

var arr = [1,2,3,4];
var arrnew = arr.concat(5,6); // 在arr数组的后面添加新的元素,形成一个新数组,但是原数组是不变的
console.log( arrnew +",类型为:" + typeof( arrnew ) );
console.log("原数组:" + arr);

● slice(开始,结束):在数组中提取一部分,形成新的数组。

var arr = ['a','b','c','d','e','f','g','h'];
var arrnew = arr.slice( 2,4 ); // 在arr数组中截取,从2开始(包含),4结束(不包含)
console.log( arrnew ); // cd

● reverse():数组的反转(倒序)

var arr = [31,12,111,444];
console.log( arr.toString() );
arr.reverse(); // 将数组中的元素倒置
console.log( arr.toString() );

● sort():数组排序
 arr.sort() 字符排序

var arr = [31,12,111,444];
arr.sort(); // 字符排序(不会按照字面量的大小)
console.log( arr );

arr.sort(func) 数值排序

var arr = [31,12,111,444];
arr.sort( fun ); // 数字排序(会按照字面量的大小)
console.log( arr );
// 定义排序函数
function fun(a,b){
	return a-b;
}

4.Math数学对象

● Math 对象用于执行数学任务
● 没有构造函数 Math()
● 无需创建,直接把 Math 作为对象使用就可以调用其所有属性和方法
Math对象方法

// 返回0-9之间任意一个随机数字
var i = Math.random() * 10;
var j = Math.floor(i);
console.log(j);

5.Number对象

Number.fixed(2); 自带四舍五入技能

var n = new Number( 12.345 );
var n1 = n.toFixed(2); // 12.35,固定两位小数,第三位小数四舍五入
console.log( n1 );
var x = new Number( 12.3 );
var n2 = x.toFixed(2); // 12.30,固定两位小数,位数不够,0来补齐
console.log( n2 );

6.正则表达式

对字符串执行模式匹配的强大工具
正则表达式大全常用正则表达式

// 方式1
var age = "18"; // 判断:1-3位纯数字
var reg = /^\d{1,3}$/; // 以/^开始,中间写正则内容,以$/结束
var b = reg.test(age); // 验证age变量的是否符合reg的匹配
if (b == true) {
	console.log("验证通过!");
} else {
	console.log("格式错误");
}


// 方式2
var name = "abc123"; // 大小写字母和数字的组合(特殊字符不能出现), 5~8位
var reg = new RegExp("^[a-zA-Z0-9]{5,8}$"); // 以^开始,中间写正则内容,以$结束
if (reg.test(name)) {
	console.log("验证通过!");
} else {
	console.log("格式错误");
}

7.日期对象

var time = new Date();
console.log( time ); // Tue Jul 14 2020 11:09:46 GMT+0800 (中国标准时间)
var year = time.getFullYear(); // 年份
var month = time.getMonth() + 1; //月份从0开始,11结束,所以国内习惯要+1
var day = time.getDate(); // 几号
var hour = time.getHours(); // 几点
var mm = time.getMinutes(); // 分钟
var s = time.getSeconds(); //秒
var ms = time.getMilliseconds(); // 毫秒, 1000毫秒 = 1秒
var timestr = year+"年"+month+"月"+day+"号 "+hour+"点"+mm+"分"+s+"秒"+ms+"毫秒";
console.log( timestr );

8.函数

● 使用关键字 function 定义函数

function 函数名( 形参列表 ){
	// 函数体
	return 返回值;
}

● 函数声明后不会立即执行,会在我们需要的时候调用到。
● 注意:
 形参:一定不要带数据类型
 分号是用来分隔可执行JavaScript语句。 由于函数声明不是一个可执行语句,所以不以分号结束。

①无返回值

function sum(a, b) {
	var he = a + b;
	console.log("两数之和:" + he);
}

sum(3,4);

②有返回值

function sum(a, b) {
	var he = a + b;
	return "两数之和:" + he;
}

var s = sum(3,4);
console.log( s );

③参数对象

在函数内部,调用参数列表的属性

function func(a,b,c){
	console.log( arguments.length ); // 获得参数的个数
	console.log( arguments[1] ); // 获得下标为1的参数
}

④构造函数

函数同样可以通过内置的 JavaScript 函数构造器(Function())定义

var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
console.log(x);

⑤匿名函数

var fn = function(a, b) {// 没有名字的函数,应该用一个变量来接收
	return a * 10 + b;
};

console.log( fn(3, 4) );

⑥全局函数

● isNaN:检查其参数是否是非数字值

console.log( isNaN( 123 ) ); // 数字,false
console.log( isNaN( "hello" ) ); // 非数字,true
console.log( isNaN( 4-1 ) ); // 数字,false
console.log( isNaN( 123 ) ); // 数字,false
console.log( isNaN( -10 ) ); // 数字,false
console.log( isNaN( "123" ) ); // 数字,false
console.log( isNaN( "1a23" ) ); // 非数字,true

● eval:用来转换字符串中的运算

var str = "1+3";
console.log( str ); // 1+3 , +会认定为一种字符符号而已,没有加法的作用
console.log( eval( str ) ); // 让字符串中的运算符号生效

● encodeURI 与 decodeURI

var name = "百度";
console.log( "转码前:" + name );
name = encodeURI(name);
console.log( "转码后:" + name );
name = decodeURI(name);
console.log( "解码后:" + name );

⑦闭包

  1. 闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一
    个函数。
  2. 闭包的作用:访问函数内部变量、保持函数在环境中一直存在,不会被垃圾回收机制处理;

简单地说:就是在函数的局部范围内声明一个封闭的环境,此环境不会被垃圾回收探测到。保证了数据的安全唯一性

a = 10; // 全局变量,声明的时候可以不使用var
function test1(){
	b = 20; // 不使用var声明的变量,就是全局变量
	var c = 30; // 用var声明,并且在函数的内部。这样的变量叫做局部变量,有效范围只能在其声明的函数内部
	console.log(c);
}
function test2(){
	console.log(c); //c is not defined (c变量没有定义)
}
test1();
test2();

统计方法执行了多少次

var count = 0; // 总次数
function test1(){
	count++; // 自增+1
}
test1();
test1();
test1();
console.log( count );

谁都可以访问count,所以count变量并不安全,因为是全局变量。
如何才能安全呢?将count声明为局部变量

function test1(){
	var count = 0; //局部变量
	return count++; //外部无法访问count,只能通过return才能将count变量返回,并输出
}
test1();
test1();
test1();
console.log( test1() ); // 每次调用方法,首先就是将变量还原为0

结果一直是0,因为每次调用test1(),方法体的第一句代码就是还原,无论曾经的值是多少。

function test1(){
	var count = 0; //局部变量
	function jia(){
		return count++;
	}
	jia();
	return count;
}
test1();
test1();
test1();
console.log( test1() ); // 每次调用方法,首先就是将变量还原为0

如果每次只调用test1()里面的jia()就好了。ok,闭包帮你解决此问题!

function test1(){
	var count = 0; //局部变量
	function jia(){
		return count+=1;
	}
	return jia;
}
var fn = test1(); // fn => function jia(){return count+=1; }
fn();
fn();
console.log( fn() ); 

闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不 受外界干扰。
直观的说就是形成一个不销毁的栈环境。
 闭包的优点: 方便调用上下文中声明的局部变量 逻辑紧密,可以在一个函数中再创建个函数,避免了传参的问题
 闭包的缺点: 因为使用闭包,可以使函数在执行完后不被销毁,保留在内存中,如果大量使用闭包就会造 成内存泄露,内存消耗很大

9.弹框输出

● 普通弹框 alert(“helloworld”);
● 控制台日志输出 console.log(“浏览器按F12进入控制台”);
● 页面输出 document.write("< h2 >我爱你中国< /h2 >"); 将< h2 >元素输出到< body >中
● 确认框 confirm(“确定删除吗?”);

var b = confirm("确定删除吗?");
if(b){
	document.write( "<h1>删除成功!</h1>" );
}else{
	document.write( "<h1>你取消了操作</h1>" );
}

● 输入框 prompt(“请输入姓名:”);

var name = prompt("请输入你的名字:");
document.write( "<h1>名字:" + name + "!</h1>" );

四、DOM 操作

● 在一个html页面中,会使用很多标签来规划制作页面。
● 每个标签都有它存在的意义,如果我们想要动态的修改某个标签的值。那我们就需要在页面中查找到这个标签元素
● “顺藤摸瓜”,主树干有分支,每个分支还有许多小分支,只要把这个分支的结构整理清楚,任何一片叶子都不是难事了
● 文档对象模型,就是将页面中所有的标签元素都看成是一个对象(一片叶子),主树干定义为根节点(根元素),所有的标签都是从根元素延伸出去的,摸清结构,找到某个标签就不再困难了
 在节点树中,顶端节点就是根节点(root)
 每个节点都有父节点(除了根节点)
 任何一个节点都可以拥有任意数量的子节点
 同胞是拥有相同父节点的节点

<html>
	<head>
		<meta charset="utf-8">
		<title>DOM 教程</title>
	</head>
	<body>
		<h1>第一节:HTML DOM</h1>
		<p>Hello world!</p>
	</body>
</html>

从上面的 HTML 中:
● < html > 节点没有父节点;它是根节点
● < head > 和 < body > 的父节点是 < html > 节点
● 文本节点 “Hello world!” 的父节点是 < p > 节点
并且:
● < html > 节点拥有两个子节点:< head > 和 < body >
● < head > 节点拥有两个子节点:< meta > 与 < title > 节点
● < title > 节点也拥有一个子节点:文本节点 “DOM 教程”< h1 > 和 < p > 节点是同胞节点,同时也是< body > 的子节点
并且:
● < head > 元素是 < html > 元素的首个子节点
● < body > 元素是 < html > 元素的最后一个子节点
● < h1 > 元素是 < body > 元素的首个子节点
● < p > 元素是 < body > 元素的最后一个子节点
js为我们提供了很多种方法来实现在页面找查找某个元素节点

1.DOM访问

● getElementById:通过id属性获得元素节点对象
 案例:当帐号为空时,阻止表单提交

<body>
    <form action="xxx" onsubmit="return login()">
        <p>账号:<input id="username"></p>
        <p>密码:<input id="password"></p>
        <p><button>登录</button></p>
    </form>
    <script>
        function login(){
            var name = document.getElementById("username").value;
            if(name == ""){
                alert("账号不能为空");
                return false;// 阻止表单的提交
            }else{
                return true;// 放行,让表单提交
            }
        }
    </script>
</body>

● getElementsByName:通过name属性获得元素节点对象集
 案例:购物车全选效果

<body>
	<h2>我的购物车</h2>
	<table border="1" cellspacing="0">
		<tr>
			// this表示当前状态
			<td><input type="checkbox" onchange="quan(this)" /> 全选</td>
			<td>名称</td>
			<td>单价</td>
		</tr>
		<tr>
			<td><input type="checkbox" name="one" />1</td>
			<td>功能性饮料-尖叫</td>
			<td>4.0</td>
		</tr>
		<tr>
			<td><input type="checkbox" name="one" />2</td>
			<td>火腿肠</td>
			<td>2.0</td>
		</tr>
		<tr>
			<td><input type="checkbox" name="one" />3</td>
			<td>包子</td>
			<td>1.5</td>
		</tr>
	</table>
	<p>
	<button>提交订单</button>
	</p>
	<script>
		function quan(all) {
			var arr = document.getElementsByName("one");
			for (var i = 0; i < arr.length; i++) {
			arr[i].checked = all.checked; // 将全选框的状态,赋值给每一个复选框
		}
	}
	</script>
</body>

● getElementsByTagName:通过标签名称获得元素节点对象集
 案例:表格隔行变色

<body>
	<table border="1" cellspacing="0">
		<tr>
			<td><input type="checkbox" onchange="quan(this)" /> 全选</td>
			<td>名称</td>
			<td>单价</td>
		</tr>
		<tr>
			<td><input type="checkbox" name="one" />1</td>
			<td>功能性饮料-尖叫</td>
			<td>4.0</td>
		</tr>
		<tr>
			<td><input type="checkbox" name="one" />2</td>
			<td>火腿肠</td>
			<td>2.0</td>
		</tr>
		<tr>
			<td><input type="checkbox" name="one" />3</td>
			<td>包子</td>
			<td>1.5</td>
	</table>
	<script>
	var rows = document.getElementsByTagName("tr"); //通过标签名获得元素对象集合
	for (var i = 0; i < rows.length; i++) {
		if(i % 2 == 1){ // 奇数
			rows[i].style.backgroundColor = "pink";
		}
	}
	</script>
</body>

2.DOM修改

修改 HTML DOM 意味着许多不同的方面:
 改变 HTML 内容
 改变 CSS 样式
 改变 HTML 属性
 创建新的 HTML 元素
 删除已有的 HTML 元素
 改变事件(处理程序)

1.改变一个 < h2 > 元素的 HTML 内容 :

<body>
	<button οnclick="test()"点击此处</button>
	<script>
		function test(){
			document.getElementById("hello").innerHTML = "啥也没有";
		}
	</script>
	<h2 id="hello">你好!</h2>
</body>

2.改变一个< h2 >的 HTML 样式

<body>
	<button onclick="chou()">点这里</button>
	<script>
		function chou(){
			document.getElementById("hello").style.color = "red";
			document.getElementById("hello").style.fontFamily = "黑体";
		}
	</script>
	<h2 id="hello">你好!</h2>
</body>

①添加节点

● 点击按钮,在页面中创建一张图片

②删除节点

● 点击按钮,把上面刚创建的图片从页面上删除

③替换节点

● 点击按钮,把上面刚创建的图片替换成另一张

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <button onclick="add()">添加</button>
    <button onclick="del()">删除</button>
    <button onclick="rep()">替换</button>
    <div></div>
    <script>
        function add(){
            var img =document.createElement("img");// <img>
            img.setAttribute("src","js/img/cat.gif");// <img src="js/img/cat.gif">
            img.setAttribute("title","小猫咪");// <img src="js/img/cat.gif" title="小猫咪">
            img.setAttribute("id","cat");// <img src="js/img/cat.gif" title="小猫咪" id="cat">

            var divs = document.getElementsByTagName("div");
            divs[0].appendChild(img);
        }

        function del(){
            var img = document.getElementById("cat");
            img.parentNode.removeChild(img);// 必须通过父节点,才能删除子节点

        }

        function rep(){
            var imgold = document.getElementById("cat");
            //第一种  // 通过修改元素的属性,做的替换
            //imgold.setAttribute("src","js/img/2.jpg");
            //第二种
            var imgnew = document.createElement("img");
            imgnew.setAttribute("src","js/img/3.jpg");
            imgold.parentNode.replaceChild(imgnew,imgold);
        }
    </script>
</body>
</html>

3.事件

js捕获某个动作而做出的反馈
HTML 事件的例子:
● 当用户点击鼠标时
● 当网页已加载时
● 当图片已加载时
● 当鼠标移动到元素上时
● 当输入字段被改变时
● 当 HTML 表单被提交时
● 当用户触发按键时

①窗口事件 (Window Events)

仅在 body 和 frameset 元素中有效。
 onload 当文档被载入时执行脚本

<body onload="test()">
	<script>
		function test() {
			document.write("哈哈哈哈");
		}
	</script>
</body>

②表单元素事件 (Form Element Events)

仅在表单元素中有效。
 onblur 当元素失去焦点时执行脚本
 onfocus 当元素获得焦点时执行脚本

<body>
	<script>
		function a() {
			console.log("获得焦点");
		}
		function b() {
			console.log("失去焦点");
		}
	</script>
	<form action="">
		<p>帐号:<input onfocus="a()" onblur="b()" /></p>
		<p>密码:<input /></p>
	</form>
</body>

③鼠标事件 (Mouse Events)

● onclick 当鼠标被单击时执行脚本
● ondblclick 当鼠标被双击时执行脚本
● onmouseout 当鼠标指针移出某元素时执行脚本
● onmouseover 当鼠标指针悬停于某元素之上时执行脚本

<body>
	<img src="img/logo.png" onmouseover="shang(this)" onmouseout="xia(this)"
	onclick="dan()">
	<img src="img/logo.png" onmouseover="shang(this)" onmouseout="xia(this)"
	ondblclick="shuang()">
	<img src="img/logo.png" onmouseover="shang(this)" onmouseout="xia(this)" >
	<script>
		function dan(){
			alert("点了一下");
		}
		function shuang(){
			alert("连续快速点两下");
		}
		function shang(img){
			img.style.border = "5px solid red";
		}
		function xia(img){
			img.style.border = "5px solid white";
		}
	</script>
</body>

④键盘事件

● onkeydown 按下去
● onkeyup 弹上来

<script>
	window.onkeydown = function(){
	// event:事件源(按键)
	// console.log( "按键编码:"+event.keyCode );
		if(event.keyCode == "13"){ // 回车键
			alert("登录成功!");
		}
	}
	window.onkeyup = function(){
		console.log(event.keyCode); // 按住按键不松手是不会触发的。当松手时,按键回弹则触发
	}
</script>

⑤事件冒泡

● 创建两个div,一个大一些,一个小一些

<style>
	#father {
		width: 200px;
		height: 200px;
		background: black;
		padding: 10px;
	}
	#child {
		width: 100px;
		height: 100px;
		background: greenyellow;
	}
</style>
<body>
	<div id="father"></div>
	<div id="child"></div>
	<script>
	document.getElementById("father").addEventListener("click", function() {
		alert("父级元素的事件被触发:" + this.id);
	});
	document.getElementById("child").addEventListener("click", function(e) {
		e.stopPropagation() //取消事件的冒泡机制
		alert("子级元素的事件被触发:" + this.id);
	});
	</script>
</body>

先子,后父。事件的触发顺序自内向外,这就是事件冒泡;

⑥事件捕获

● 创建两个div,一个大一些,一个小一些

<style>
	#father {
		width: 200px;
		height: 200px;
		background: black;
		padding: 10px;
	}
	#child {
		width: 100px;
		height: 100px;
		background: greenyellow;
	}
</style>
<body>
	<div id="father"></div>
	<div id="child"></div>
	<script>
	document.getElementById("father").addEventListener("click",function(){
	alert("父级:" + this.id);},true);
	document.getElementById("child").addEventListener("click",function(){
	alert("子级:" + this.id);},true);
	</script>
</body>

先父,后子。事件触发顺序变更为自外向内,这就是事件捕获;

4.面向对象OOP

①使用Object创建通用对象

var user = new Object();
user.name = "吕布";
user.age = 21;
user.say = function(){
	console.log("大家好,我叫:"+this.name+",我今年"+this.age+"岁了!");
}
user.say();

var dog = new Object();
dog.nickname = "屎尿多";
dog.wang = function(){
	console.log("我饿了,我要拆家了!");
}
dog.wang();

②使用构造函数

function userinfo(name , age){
	this.name = name;
	this.age = age;
	this.say = function(){
		console.log("大家好,我叫:"+this.name+",我今年"+this.age+"岁了!");
	}
}
var user = new userinfo("詹姆斯",35);
user.say();

● 使用直接量

var user = {
	username : "孙悟空",
	age : 527,
	say : function(){
		console.log("大家好,我叫:"+this.username+",我今年"+this.age+"岁了!");
	}
};
user.say();

5.JSON

● 大家在互联网上来回传递数据,如果没有一个统一的格式,解析起来的难度很大(每个人的编码喜好不一样)
● JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
● 易于人阅读和编写,同时也易于机器解析和生成
 {
  属性1:值1,
  属性2:值2,
  。。。。
 }

<script>
	var json1 = { username: "吕布", age: 31 };
	console.log("姓名:" + json1.username + ",年龄:" + json1.age + "岁");
	// json数组
	var josnarr = [{ name: "貂蝉", age: 18 }, { name: "小乔", age: 17 }];
	console.log("貂蝉" + josnarr[0].age + "岁了");
	console.log("小乔" + josnarr[1].age + "岁了");
	// 复杂的json对象
	var long = {
		name: "赵云",
		sex: "男",
		hobby: ["玉兰白龙驹", "龙胆亮银枪", "青釭剑"]
	};
	console.log(long.name + "的主攻武器:" + long.hobby[1]);
</script>

五、BOM操作

就是javascript对浏览器的一些常规操作的方法

1.window对象

在这里插入图片描述

<button onclick="kai()">百度搜索</button>
<script>
	function kai(){
		window.open("http://www.baidu.com" , "百度" ,
		"width=500,height=300px,left=400px");
		// window.open("http://www.baidu.com" , "百度" , "fullscreen=yes"); // IE才生效
	}
</script>

①screen屏幕对象

我想知道我的电脑屏幕多大?实际上,得到的就是分辨率

<body>
	<button onclick="test()">屏幕大小</button>
</body>
<script>
	function test() {
		alert(window.screen.width + "|" + window.screen.height);
	}
</script>

②location定位

包含有关当前 URL 的信息,通常用来做页面跳转

<button onclick="test()">测试</button>
<script>
	function test(){
		console.log( "当前页面的URL路径地址:"+ location.href );
		location.reload(); // 重新加载当前页面(刷新)
		location.href = "http://www.baidu.com"; // 跳转页面
	}
</script>

③history浏览器历史

history对象会记录浏览器的痕迹
● a.html

<a href="b.html">去b页面</a>

● b.html

<button onclick="hui()">返回</button>
<script>
	function hui(){
		//history.go(-1); //上一级页面
		history.back(); // 与go(-1)是等价的
	}
</script>

④navigator 导航

window.navigator 对象包含有关访问者浏览器的信息;

<script>
	var str = "";
	str += "<p>浏览器的代号:"+ navigator.appCodeName +"</p>";
	str += "<p>浏览器的名称:"+ navigator.appName+"</p>";
	str += "<p>浏览器的版本:"+ navigator.appVersion+"</p>";
	str += "<p>硬件平台:"+ navigator.platform+"</p>";
	str += "<p>用户代理:"+ navigator.userAgent +"</p>";
	str += "<p>启用Cookies:"+navigator.cookieEnabled+"</p>";
	document.write(str);
</script>

⑤存储对象

用起来和我们在java中map很相似,都是键值对的方式存数据

本地存储 localStorage

在关闭窗口或标签页之后将会删除这些数据
● 保存数据

localStorage.setItem("name","curry");

● 提取数据

localStorage.getItem("name");

● 删除数据

localStorage.removeItem("name");

多样化操作

// 三种方式保存数据
localStorage["a"] = 1;
localStorage.b = 2;
localStorage.setItem("c",3);

// 查看数据类型
console.log( typeof localStorage["a"] )
console.log( typeof localStorage["b"] )
console.log( typeof localStorage["c"] )

// 第一种方式读取
var a = localStorage.a;
console.log(a);

// 第二种方式读取
var b = localStorage["b"];
console.log(b);

// 第三种方式读取
var c = localStorage.getItem("c");
console.log(c);
会话存储 sessionStorage

会话,就是保持浏览器别关闭。
关闭浏览就等于结束了一次会话。
开启浏览器就意味着创建了一次会话。
● 保存数据

sessionStorage.setItem("name", "klay");

● 提取数据

var lastname = sessionStorage.getItem("name");

● 删除指定键的数据

sessionStorage.removeItem("name");

● 删除所有数据

sessionStorage.clear();

记录点击了几下按钮

<button onclick="dian()">点我</button>
<h3 id="result"></h3>
<script>
	function dian(){
		if( sessionStorage.getItem("clickCount") ){
			sessionStorage.setItem("clickCount",
			Number(sessionStorage.getItem("clickCount")) + 1);
		}else{
			sessionStorage.setItem("clickCount", 1);
		}
		document.getElementById("result").innerHTML = "已经点击了"+ sessionStorage.getItem("clickCount") +"次!"
	}
</script>

2.计时操作

①周期性定时器 setInterval

setInterval(1,2):周期性触发代码exp (常用)
1:执行语句
2:时间周期,单位为毫秒
● 闪烁的字体 (1秒1变色)

<body>
	<h1 id="title">拉勾网:极速入职</h1>
	<script>
		var colors = ["red","blue","yellow","pink","orange","black"];
		var i = 0;
		function bian(){
			document.getElementById("title").style.color = colors[i++];
			if(i == colors.length){
				i = 0; // 颜色重新开始
			}
		}
		setInterval(bian,100); // 每隔0.1秒,执行一次bian函数
	</script>
</body>

● 在闪烁字体的基础上扩展,闪烁的电子时钟

<body>
	<h1 id="title"></h1>
	<script>
		var colors = ["red","blue","yellow","pink","orange","black"];
		var i = 0;
		function bian(){
			document.getElementById("title").style.color = colors[i++];
			if(i == colors.length){
				i = 0; // 颜色重新开始
			}
		}
		function time(){
			var d = new Date();
			var str = d.getFullYear()+"年"+(d.getMonth()+1)+"月"+d.getDate()+"号"+d.getHours()+"点"+d.getMinutes()+"分"+d.getSeconds()+"秒";
			document.getElementById("title").innerHTML = str;
		}
		setInterval(bian,100); // 每隔1秒,执行一次变色函数bian
		setInterval(time,1000); // 每隔1秒,执行一次时间函数time
	</script>
</body>

②停止定时器 clearInterval

● 模拟年会抽奖

<body>
	<img id="tu" src="../js/img/1.jpg" width="50%" />
	<br />
	<button onclick="begin()">开始</button>
	<button onclick="stop()">停止</button>
	<script>
		var arr = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"];
		function begin() {
			timer = setInterval(bian, 100); // 没有使用var,所以timer是全局变量
		}
		function stop() {
			clearInterval(timer); // 停止定时器
		}
		function bian() {
			var i = Math.floor(Math.random() * arr.length); // 0-4
			document.getElementById("tu").src = "../js/img/" + arr[i];
		}
	</script>
</body>

③一次性定时器 setTimeout

相当于延迟的效果,只执行一次

<script>
	function bian(){
		document.body.style.backgroundColor = "red";
	}
	//3秒之后调用
	setTimeout(bian,3000);
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端基础--JavaScript 的相关文章

  • Angular UI 模式的范围问题

    我无法理解 使用角度 UI 模式的范围 虽然这里不是很明显 但我已经正确设置了模块和所有内容 据我所知 但这些代码示例尤其是我发现错误的地方 index html 其中重要部分 div class btn group div
  • 在特定页面上执行 javascript 的正确“Rails”方式

    我试图在特定页面上运行 javascript 而我唯一的解决方案似乎是反模式 我有controller js内部生成的assets javascripts 我在用着gem jquery turbolinks 我的代码类似于以下内容 docu
  • 在 Internet Explorer 中使用什么来监视 jscript 内存使用情况

    我们正在调试 GWT 应用程序 在 Firefox 中运行正常 在 IE6 0 中开始运行正常 但一段时间后 它就会崩溃并开始爬行 经过一些测试后 我们怀疑存在一些内存问题 使用了太多内存 内存泄漏等 除了使用taskmanager和pro
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 有没有办法使用 ko.observableArray 作为地图?

    有没有办法使用ko observableArray http knockoutjs com documentation observableArrays html像地图 字典一样 例如 var arr ko observableArray
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo

随机推荐

  • pycharm pydevconsole.py: error: unrecognized arguments: --mode=server

    使用argparse报错 pycharm pydevconsole py error unrecognized arguments mode server 原代码 args parser parse args 语法格式都没错 最终解决方法
  • Merkle Patricia Tree 详解

    转载自 https ethfans org toya articles 588 1 前言 1 1 概述 Merkle Patricia Tree 又称为Merkle Patricia Trie 是一种经过改良的 融合了默克尔树和前缀树两种树
  • 部门来了个软件测试,听说是00后,上来一顿操作给我看呆了...

    前段时间公司新来了个同事 听说大学是学的广告专业 因为喜欢IT行业就找了个培训班 后来在一家小公司干了三年 现在跳槽来我们公司 来了之后把现有项目的性能优化了一遍 服务器缩减一半 性能反而提升4倍 给公司省了不少成本 后来才知道 他在以前的
  • 【A卷2022Q4】分界线(华为od2023机试真题JAVA+JS)

    更多试卷真题 点击 华为OD2023真题试卷列表 刷题必点 分界线 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 电视剧 分界线 里面有一个片段 男主为了向警察透露案件细节 且不暴露自己 于是将报刊上的字剪切下来 剪拼成匿名
  • 【Python】编程练习:十进制整数转二进制

    文章目录 题目描述 输入格式 输出格式 测试样例 样例输入 样例输出 参考代码 题目描述 十进制整数转二进制的方法是 除以2 取出余数 商继续除以2 直到得到0为止 将取出的余数逆序即可得到对应的二进制数的各位 例如 22 转二进制的计算过
  • c++递归函数

    递归函数是将规模较大的问题化为多个规模较小的同类问题 递归函数的特征是定义中包含函数本身和必须有终止条件 递归调用分为两个阶段 递推和回归 递推 将大问题转化为多个小问题 将问题逐步由未知化为已知 回归 从已知出发 是递推的逆过程 逐个求值
  • (面经三,技术面)——时间:2022-11-11 地点:线上

    面试经历 三 时间 2022 11 11 地点 线上 1 什么是抽象类 有抽象方法的类 用来表征对问题领域进行分析 设计中得出的抽象概念 2 抽象类和接口的区别 继承关系 类只能单继承 接口可以实现多个接口 构造函数 抽象类可以有构造函数
  • 王者荣耀学习工具JAVA Robot按键精灵找色点击功能

    一个简单的JAVA按键精灵 import java awt AWTException import java awt Color import java awt MouseInfo import java awt Point import
  • Pandas(一)—— Pandas基础

    Python模块 Pandas Pandas 一 Pandas基础 一 预备知识 1 1 Python基础 1 2 NumPy基础 1 3 练习 1 3 1 利用列表推导式写矩阵乘法 1 3 2 更新矩阵 1 3 3 连续整数的最大长度 二
  • 编程分钟转化小时怎么编_大中小型三菱PLC分类及编程软件学习内容附图文,初学者必看!...

    不少初学PLC的人都会问一个问题 如果学习三菱PLC编程入门应先学习什么 以下是关于PLC类型和运行原理 GX Developer软件的使用说明 如果这篇文章对你有所帮助 记得 收藏 一 PLC的类型 1 小型PLC 一体式结构 I O点数
  • 从Docker到Kubernetes——K8s多租户管理与资源控制

    文章目录 namespace设计解读 什么是namespace 多namespace使用案例 Kubernetes用户认证机制 应用健康检查 namespace设计解读 namespace是k8s进行多租户资源隔离主要手段 那么它在系统中的
  • 关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令

    一 背景 已安装对应版本的mingw64 并且已经按照网上教程配置了环境变量 但是仍然无法执行gcc命令 二 遇到的问题 gcc 不是内部或外部命令 也不是可运行的程序 三 如何解决 至于如何打开环境变量 我就不赘述了 想必大家配置环境变量
  • GO语言变量声明的方式

    1 指定变量类型 声明后如果不做赋值 那么使用默认值 1 2 没有进行赋值 但是指明了是什么类型 go会自动加上空值 var a string 2 不指定变量类型 需要进行赋值操作 1 2 可以不指定变量类型 通过变量值 go会自行判断该变
  • Element-ui使用@keyup.enter.native的原因

    keyup enter加 native有什么作用 W3C 标准中有如下规定 即 当一个 form 元素中只有一个输入框时 在该输入框中按下回车应提交该表单 如果希望阻止这一默认行为 可以在 标签上添加 submit native preve
  • linux proc进程,linux 下 /proc/进程号/ 重要进程文件的内容解析

    proc maps 查看进程的虚拟地址空间是如何使用的 该文件有6列 分别为 地址 库在进程里地址范围 权限 虚拟内存的权限 r 读 w 写 x s 共享 p 私有 偏移量 库在进程里地址范围 设备 映像文件的主设备号和次设备号 节点 映像
  • 少儿编程scratch与机器人

    少儿编程scratch与机器人 对于很多的家长们来说 孩子的学习一直都是家长们十分关心和重视的一件事情 很多的家长在培养孩子的学习的时候 会给孩子选择一些能够提升孩子能力的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 他们对于
  • css的标准写法,前端css书写规范

    代码书写规范这种东西虽然不是必须的但是确实很有必要的好的书写规范不单单能增加可阅读性和提高代码性能而且有利于后续人员维护代码 良好的书写规范也是区分新手与专业人员的一个标准 一css书写顺序 1 位置属性position top right
  • VUE项目引入微信jssdk

    我们的一个vue webpack的 SPA项目需要在微信中使用 因此需要导入微信的jssdk库 通过搜索发现npm有微信jssdk的依赖包 weixin js sdk 于是 导入依赖包 npm i S weixin js sdk 前端页面U
  • Log 利用装饰模式 打印增强

    包引用
  • 前端基础--JavaScript

    一 JavaScript介绍 虽然是java作为前缀 但java和javascript的关系 就像老婆和老婆饼之间的关系 没有一毛钱关系 网景公司在Netscape2 0首先推出了JavaScript JavaScript 的正式名称是 E