JavaScript
概述
- 简称JS,由网景公司和Sun公司联合推出的一门编写前端脚本动作的编程语言;本质上与Java没有关系,是一门独立的编程语言
- JS是一门前端的编程语言,主要用于给网页添加动作,如表单的验证、动态的请求服务器等
- JS通常是书写在HTML页面中的指定位置,当使用浏览器运行HTML时浏览器会解析HTML中的JS代码并执行;属于解释型编译语言,JS的执行依赖于浏览器提供的JS解释器
- 开发JS
- 第一种编写位置:在html页面的head部分书写
<head>
<script type="text/javascript">
书写JS代码的位置,单引号双引号都行,执行顺序从上到下
//向浏览器的控制台输出内容
console.log("HelloWorld");//调试JS常用的输出语句
//浏览器弹窗
//window.alert("来嘛~");
//向浏览器页面输出内容
document.write("成年人的世界可以用两个字概括:算了<br/>");
document.write("不太想活,又不敢去死");
document.write("<a href='wallhaven-q29z2l.jpg'>图片</a>")
</script>
</head>
- 第二种编写位置:在一个 .js结尾的脚本文件中编写,然后在需要使用的HTML
//外部文件:jq.js
<head>
<!-- 引入外部的JS文件,且标签必须成对出现 -->
<script type="text/javascript" src="jq.js"></script>
</head>
JS基础语法
- 变量
- 声明:JS是一门弱类型的编程语言,变量没有具体的类型,所有的变量的声明都可以使用var;JS会将所有var声明的变量提到最前面,称为声明前置
- JS对语句末的分号不是特别敏感,会自动检测与下一条语句匹配
- 赋值:赋值不提前,还在原来位置
<script type="text/javascript">
{
//局部变量声明,用let声明;var声明但变量都是全局变量
let a = 10;
}
//书写JS代码
//声明
var a;
var a=100,b,c,d;
//赋值
b = 20;
//一个变量声明但没有赋值,输出为undefined
console.log(a,b,c,d);
//声明并赋值
var s=d=f=200;
console.log(s,d,f);
//JS解构变量赋值方式,按照数组的语法进行位置的匹配赋值
var [aa,bb,dd] = ["hang","yuan","kun"];
console.log(aa,bb,dd);
</script>
- 数据类型:JS的变量不区分类型,但是变量存的值有数据类型
- 数值类型:整形,小数
- 字符串类型:JS中可以用单引号或双引号代表字符串
- 布尔类型:JS中有真值和假值的区分
真值 | 假值 |
true | false |
非空的变量 | 0 |
非空的内容 | null(手动赋值为null或者一个对象没有值)、 undefined(一个变量声明但为赋值) |
- 特殊数据类型:
- undefined
- Infinity(把零作为除数时,无穷大)
- NaN(not a number不是一个数,非法的算数运算)
- 一个函数:isNaN(变量 / 值),是不是 不是一个数
console.log(1/0);//Infinity
console.log(isNaN('hang'));//true
- 运算符
- 算数运算符:+ - * / % ++ –
- 赋值运算符:= += -= *= /= %=
- 关系运算符:> >= < <= == === != !==
- 逻辑运算符:&& || !
- 三元运算符(三目运算符):布尔表达式?值1:值2
<script type="text/javascript">
var str1 = '123';
var m = 123;
//两个等号比较的是变量里实际的值
console.log(str1==m);
//三个等号比较变量的值以及数据类型
console.log(str1===m);
//不等号 多一个等号会兼顾数据类型
console.log(str1!=m); //false
console.log(str1!==str2); //false
</script>
- 分支语句
- 循环语句
//分支语句:
if(){
//实现
}else if(){
//实现
}else{
//实现
}
//循环语句:for循环、while循环、do ... while循环
var sum = 0;
for(var i = 0; i <= 100; i++){
sum += i;
}
- 数据类型转换
//隐式转换:指JS在执行过程中觉得有必要,则自动完成转换
//当遇到 - * / 时都会把字符串类型转换成数字类型
//任何一个值与字符串做 + 运算,得到的还是一个字符串
//手动转换:
//Number():只能转换纯数值的字符串,包含字符的会返回NaN(not a number)
//parseInt():可以转换包含字符的字符串,规则是取第一个数值作为返回的结果,如果字符串的第一个字符不是数组,则返回NaN
//函数isNaN():用于判断给定的值或变量,是不是一个数,数值返回false,字符串返回false
//表达式:由运算符连接的变量,最终会产生一个结果
函数
- 函数是由多个语句组成的,完成特定功能的代码块。可以提高代码的复用性
- 函数的定义:
- JS中的函数没有强制的返回值类型约束
- 参数的定义不用书写类型,直接书写变量名
function 函数名(参数列表){
//函数体
//函数的返回值,没有类型约束,返回什么类型的值都可以
return 返回值; //可以结束函数的执行
}
- 函数的调用
- 函数名(参数列表)
- 参数传递的个数与参数列表可以不匹配
- JS中每一个函数内都有一个隐含的对象arguments数组,里面封装保存了传递的所有参数
//函数的基本使用
<script type="text/javascript">
//声明一个无参,无返回值的函数
function fun1(){
console.log('无参函数');
}
//定义一个有参有返回值的函数
function sum(a,b){
console.log('计算两个数的和');
return a+b;
}
//调用函数
fun1();
var s = sum(1,2);
console.log('和是:',s);
</script>
function funSum(a,b){
//JS函数中有一个隐含的封装了参数值的对象:arguments,是一个数组
//可以从arguments中获取调用函数传递的所有参数
console.log('funSum:',arguments);
for(var i = 0; i < arguments.length; i++){
console.log('funSum:',arguments[i]);
}
return a+b;
}
//调用函数
//var sum = funSum(); 相当于两个undefind相加
var sum = funSum(1,8,200);
console.log(sum);
- JS函数的特殊用法
- 匿名函数
var fun2 = function(a,b){
console.log('匿名函数',a,b);
}
//调用
fun2('呵呵',9);
- 定义只能使用一次的函数
//定义完函数原地调用,没有函数名,只能调用一次
( function(){
console.log('调用一次性函数')
} )();
- 将函数作为参数传递
//将函数作为变量进行传递
function fun3(){
console.log('函数作为变量')
}
//一共调用了两次fun3()
var fun4 = fun3;
console.log(fun4);
fun4();
//定义一个函数
function fun5(m){
m();
}
fun5(fun4); //把fun4当作参数传递
- 函数作为函数的返回值
//函数可以作为返回值
function fun6(){
console.log('fun6被调用')
return function (){
console.log('fun6的返回值')
}
}
fun6()();
- 全局作用域:全局作用域内定义的变量,在全局范围内任何位置都可以使用
- 局部作用域:定义在函数内部的变量,作用范围仅限当前函数内部,但是如果函数内的一个变量没有用var声明,会自动晋升为全局变量
- 当全局变量和局部变量命名冲突,局部优先
- 函数在定义的过程中一定避免与变量名命名冲突
<script type="text/javascript">
//此时m的范围是全局的
var m = 10;
function fun1(){
//n的使用范围仅限当前代码块中
var n = 20;
//没有用var声明,则自动提升为全局
x = 100;
console.log('fun1:',m,n,x);
}
function fun2(){
console.log('fun2:',m,x)
}
fun1();
fun2();
console.log('**************');
function fun3(){
var a = b = c = 20; //此时var的作用仅对a有效
}
fun3();
console.log(b);
</script>
数组
- 声明
- JS中数组的类型没有限制
- 定义数组
//第一种创建数组方式,声明一个空的数组,与var arr2=[];是等效的
var arr1 = new Array();
arr1[0] = 'hehe';
arr1[1] = 100;
console.log(arr1);
//第二种创建数组方式
var arr2 = [];
console.log(arr2);
var arr3 = [1,2,'erha'];
console.log(arr3[2]);
- 遍历数组:for…in针对于稀疏数组时只输出有值的元素
//声明一个数组
var arr1 = [1,3,2,5,6];
arr1[10] = 100;//现在数组下标为10的位置有了值,但是标4-9的位置是没有值的
//遍历数组
console.log('=========for循环遍历=======');
for(var i=0;i<arr1.length;i++){//遍历所有的元素,包括undefined
console.log(arr1[i]);
}
//for...in
//idx代表数组的下标,可变;且在遍历稀疏数组时只输出有值的元素
for(idx in arr1){//只遍历有效的元素
console.log(idx,arr1[idx]);
}
- 针对数组的一些函数
var arr1 = [1,23,4,5,9];
//向数组末尾添加元素
arr1.push(100);
//向数组头部添加元素
arr1.unshift(200);
//删除数组最后一个元素
arr1.pop();
//删除数组第一个元素
arr1.shift();
//将数组的元素使用指定字符进行拼接,返回一个字符串
var str = arr1.join(':')
//从指定下标位置,删除n个元素
arr1.splice(0,1);
var arr2 = [10,20,30];
var arr3 = [40,50,60];
//concat函数,会返回两个数组合并后的大数组
var arrs = arr2.concat(arr3);
var arr4 = [1,23,2,5,19];
//数组排序,默认按照从第一个位置从小到大排序,需要自定义规则
arr4.sort(function(a,b){
return a-b; //升序排列
//return b-a; 降序排列
});
对象
- 对象的创建和对象中属性定义的操作
- 通过new Object()创建
<script type="text/javascript">
//创建一个对象
var obj1 = new Object();
//给对象中设置属性
obj1.name = 'hang';
obj1.age = 18;
//设置对应属性的get/set方法
obj1.setName = function(name){
//this指当前对象
this.name = name;
}
obj1.getName = function(){
return this.name;
}
//调用对象中的方法
obj1.setName('yuan');
//访问属性
console.log(obj1.name,obj1.age);//输出结果yuan 18
console.log(obj1.getName());//输出结果yuan
</script>
- 通过JSON字符串格式定义JS对象
- JSON字符串本质就是个字符串,但JSON字符串的格式是固定的一种国际标准:{“name”:“value” , “name2”:“value2” , …},是键值对的方式,对应的值可以为数组
<script type="text/javascript">
//创建一个对象
var obj = {
//"name":"hang",
name:"yuan",//在定义JS对象中的属性key时,可以省略双引号
"age":18,
setName:function(name){
this.name = name;
},
getName:function(){
return this.name;
},
setAge:function(age){
this.age = age;
},
getAge:function(){
return age;
}
};
//访问属性
console.log(obj);
console.log('直接过去属性值',obj.name);
console.log('通过方法获取属性值',obj.getName());
</script>
- 日期对象
<script type="text/javascript">
//创建日期对象
//var date = new Date();//当前系统时间
var date = new Date('2022-10-22');
//日期对象常用方法
document.write(date+'<br>');
document.write('年:'+date.getFullYear()+'<br>');
document.write('月:'+date.getMonth()+1+'<br>'); //月必须加1
document.write('日:'+date.getDate()+'<br>');
document.write('时:'+date.getHours()+'<br>');
document.write('分:'+date.getMinutes()+'<br>');
document.write('秒:'+date.getSeconds()+'<br>');
document.write('星期:'+date.getDay()+'<br>');
</script>
- 常用的其他函数
//字符串相关
//str.length 返回字符串str长度
//str.indexOf(字符) 返回指定的字符串在str中出现的第一次的下标,没有返回-1
//str.lastIndexOf(字符) 返回指定的字符串在str中最后一次出现的下标,没有返回-1
//运算相关
//Math.random() 返回0到1之间的一个随机数
//Math.pow(m,n) 返回m的n次幂
//Math.round(); 返回四舍五入
- 复杂数组小练习
<script type="text/javascript">
//书写JS代码
function fun1(option){
console.log(option);
//option传入一个对象,在函数的内部使用option对象的属性值
console.log(option.name);
console.log(option.age);
}
var o = {
name:'hang',
age:18
}
fun1({
name:'yuan',
age:18
});
//复杂数组
var arr = [
{
id:1,
name:'北京'
},
{
id:2,
name:'天津'
},
{
id:3,
name:'上海'
}
];
document.write('<select>');
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
console.log(arr[i].id);
console.log(arr[i].name);
document.write('<option value="">'+arr[i].name+'</option>')
}
document.write('</select>');
</script>
事件开发
- 指JS通过捕捉用户在网页上的一系列操作(如单击鼠标等),进行相关的处理
- 事件开发的三要素:
- 事件源:指HTML标签元素
- 事件属性:用于捕捉事件的特殊的属性。如:捕捉单击事件的属性 onclick
- 事件监听器:针对捕捉到的事件,进行的后续处理,一般是通过函数实现
- 完成事件开发的流程
- 书写HTML标签
- 在HTML标签上定义事件属性
- 开发事件监听函数
- 调用事件监听函数
<!-- οnclick="" 捕捉单击事件的属性 -->
<head>
<script type="text/javascript">
//编写事件监听函数
function funClick(){
alert('你点我啊');
}
</script>
</head>
<body>
<h2>事件开发</h2>
<input type="button" value="单击鼠标事件" onclick="funClick()">
</body>
- 调用事件回调函数,在事件属性值上传参,获取标签的属性值
- 事件属性调用函数的时候,传的this是当前的标签对象
<script type="text/javascript">
//编写时间监听函数
function fn1(){
//alert('你点啥');
//console.log('呵呵呵');
document.write('<select>');
document.write('<option>北京</option>');
document.write('<option>上海</option>');
document.write('</select>');
}
function fn2(arg){
//输出 <input type="button" value="触发事件的时候传参" οnclick="fn2(this)"/>
console.log(arg);
//输出 value属性值:触发事件的时候传参
console.log('value属性值:'+arg.value);
//输出 value属性值:button
console.log('value属性值:'+arg.type);
}
</script>
<body>
<input type="button" value="普通按钮" onclick="fn1()"/>
<!-- 事件属性调用函数的时候,传的this是当前的标签对象 -->
<input type="button" value="触发事件的时候传参" onclick="fn2(this)"/>
</body>
- 操作标签
- var obj = document.getElementById(标签的ID属性值);
- 获取标签的属性值:obj.属性名
- 设置新的属性值:obj.属性名 = 要修改的内容
<script type="text/javascript">
function funLight(){
//根据标签的id属性获取标签对象
var imgObj = document.getElementById('bulb');
console.log(imgObj);
console.log(imgObj.title);
if(imgObj.title=="off"){
//给src属性赋新值
imgObj.src = "img/bulb_on.png";
imgObj.title="on";
}else{
//给src属性赋新值
imgObj.src = "img/bulb_off.png";
imgObj.title="off";
}
}
</script>
<body>
<img src="img/bulb_off.png" title="off" id="bulb"/><br>
<input type="button" value="开关" onclick="funLight()">
</body>
- 常用的事件属性
属性名 | 触发时机 |
onclick | 单击鼠标触发 |
ondblclick | 双击鼠标触发 |
onblur | 失去焦点触发 |
onfocus | 获得焦点触发 |
onmouseover | 鼠标覆盖触发 |
onmouseout | 鼠标移出触发 |
onmousemove | 鼠标移动触发 |
onkeyup | 抬起按键触发 |
onkeydown | 按下按键触发 |
onload | 加载完页面触发,用于body标签 |
onchange | 改变下拉列表选项触发 |
onsubmit | 提交表单的事件 |
- 操作标签
<script type="text/javascript">
function funLight(){
//根据标签的id属性获取标签对象
var imgObj = document.getElementById('bulb');
console.log(imgObj);
console.log(imgObj.title);
if(imgObj.title=="off"){
imgObj.src = "img/bulb_on.png";
imgObj.title="on";
}else{
imgObj.src = "img/bulb_off.png";
imgObj.title="off";
}
}
</script>
<body>
<img src="img/bulb_off.png" title="off" id="bulb"/><br>
<input type="button" value="开关" onclick="funLight()">
</body>
- 阻止表单提交
<!-- onsubmit -->
<script type="text/javascript">
//表单验证的监听函数
function funSubmit(){
//书写表单验证的代码
return false; //此时会阻止表单提交
}
</script>
<form action="http://www.baidu.com" method="post" onsubmit="return funSubmit()">
Username:<input type="text" id="username" /><br>
Password:<input type="password" id="password" /><br>
<input type="submit" value="提交">
</form>
- 阻止超链接的默认事件
<!-- 第一种 -->
<a href="#" >超链接</a>
<!-- 第二种 -->
<a href="javascript:void(0)" >超链接</a>
- 事件冒泡:当父元素和子元素定义了相同的事件时,触发子元素的事件同时会扩散触发父元素的相同事件
function funSup(){
alert('触发了父div');
}
function funSub(){
alert('触发了子div');
}
<div id="supDiv" onclick="funSup()">
<div id="subDiv" onclick="funSub()">
</div>
</div>
- 阻止事件冒泡
function funSub(){
alert('触发了子div');
//阻止事件冒泡
//第一种方式,针对非IE浏览器兼容性好
event.stopPropagation();
//第二种方式,针对IE浏览器兼容性好
event.cancelBubble = true;
}
DOM编程
- Document Object Model,文档对象模型
- 所有的HTML文档中的元素都封装成了一个document对象,我们可以操作和获取这些对象
- DOM树特点
- 我们把每一个HTML元素称为DOM树上的一个节点(node),每一个节点可以有多个子节点,只能有一个直接父节点
- 每一个HTML元素都在这个DOM树上
- DOM编程主要作用
- 使用DOM编程可以修改HTML文档的样式属性
- 使用DOM编程可以动态的添加和删除HTML元素
- 使用DOM编程可以完成表单的验证
- 获取标签对象
- 根据标签ID属性值获取标签对象:document.getElementById(ID 属性值);返回一个对象
- 根据标签的name属性值获取标签对象:document.getElementsByName(name 属性值) ;返回一组对象
- 根据标签的class属性值获取标签对象:document.getElementsByClassName(class 属性值) ;返回一组对象
- 根据标签名获取标签对象:document.getElementsByTagName(标签名) ;返回一组对象
<script type="text/javascript">
function getObj(){
//根据id获取
var username = document.getElementById('username');
console.log('根据id获取:',username);
//根据name获取
var sexs = document.getElementsByName('sex');
console.log('根据name获取:',sexs);
//根据class获取
var form_inps = document.getElementsByClassName('form_inp');
console.log('根据class获取:',form_inps);
//根据标签获取
var inputs = document.getElementsByTagName('input');
console.log('根据标签名获取:',inputs);
}
</script>
<form action="" method="POST" >
Username:<input type="text" id="username" name="username" class="form_inp"/><br>
Password:<input type="password" id="password" name="password" class="form_inp"/><br>
Sex:
<input type="radio" id="male" name="sex"/>男
<input type="radio" id="female" name="sex"/>女
<br>
Hobby:
<input type="checkbox" id="eat" value="eat" name="hobby"/>吃饭
<input type="checkbox" id="sleep" value="sleep" name="hobby"/>睡觉
<input type="checkbox" id="hetBee" value="hetBee" name="hobby"/>打豆豆
<br>
<input type="submit" value="提交" /><br>
</form>
<input type="button" value="测试" onclick="getObj()">
- 操作标签的属性
- 获取属性值:obj.属性名 或调用方法 obj.getAttribute(属性名);
- 设置属性值:obj.属性名=新值 或调用方法 obj.setAttribute(属性名,属性值);
function tagAttr(){
//根据id获得标签对象
var obj = document.getElementById('username');
//console.log(obj.value);
//获取class属性值
//console.log(obj.getAttribute('class'));
//设置标签属性值
//obj.value='Hello';
obj.setAttribute('value','world');
}
- 操作标签体内容
- 获取标签体内容:
- obj.innerText:只获取纯文本内容
- obj.innerHTML:获取标签体所有内容,包含子标签
- 设置标签体内容:
- obj.innerText = ‘新内容’,新内容会覆盖旧内容
- obj.InnerHTML = ‘新内容’,如果新内容包含html标签,则会解析标签功能
//操作标签体内容
//获取
function getTagInfo(){
var dv = document.getElementById('dv');
//console.log(dv.innerText); 只能操作纯文本内容
console.log(dv.innerHTML);
var dvd = document.getElementById('dvd');
//console.log(dvd.innerText);
console.log(dvd.innerHTML); //可以获取到标签体内的子标签
}
//设置
function setTagInfo(){
var dv = document.getElementById('dv');
//dv.innerText='鲲之大,一锅炖不下'; 只能操作纯文本内容
dv.innerHTML='<h3>鲲之大,一锅炖不下</h3>'; //可以解析html标签功能
var dvd = document.getElementById('dvd');
//dvd.innerText='鲲之大,一锅炖不下';
dvd.innerHTML='<h3>鲲之大,一锅炖不下</h3>';
}
- 操作单选按钮和多选框
- 选中:obj.checked = true;
- 取消选中:obj.checked = false;
- 返回当前状态:obj.checked 返回当前状态,false:未选,反之
<script type="text/javascript">
function funTest1(){
var man = document.getElementById('man');
//选中
man.checked = true;
}
function funTest2(){
var man = document.getElementById('man');
//取消
man.checked = false;
}
function funSelAll(){
//根据name获得所有的checkbox
var hobby = document.getElementsByName('hobby');
for(var i=0;i<hobby.length;i++){
hobby[i].checked = true;
}
}
function fun1(){
//获取所有单选按钮
var sexs = document.getElementsByName("sex");
console.log(sexs);
//选中第一个单选按钮
//sexs[0].checked = true;
//取消选中状态
sexs[0].checked = false;
console.log('单选按钮当前状态:',sexs[0].checked);
var likes = document.getElementsByName("likes");
for(idx in likes){
likes[idx].checked = true;
}
}
</script>
- 操作下拉列表
//下拉列表操作
function fun2(sel){
//获取当前option选项的value属性值
//console.log(sel.value);
//获取当前option选项的下标
//console.log(sel.selectedIndex);
//获取所有的option选项
console.log(sel.options);
}
- 获取当前对象的关系对象,即关系节点的对象,所有属性支持链式调用,注意中间的空文本test节点标签
- 获取父节点对象:obj.parentNode 返回值是一个对象
- 获取所有孩子节点对象:obj.childNodes 返回一个数组
- 获取上一个哥哥对象:obj.previousSibling 返回一个对象
- 获取下一个弟弟对象:obj.nextSibling 返回一个对象
<script type="text/javascript">
function funGetObj(){
var sp = document.getElementById('dv2_inner_span1');
//获取父节点对象
console.log(sp.parentNode);
//获取父节点的父节点,支持链式调用
console.log(sp.parentNode.parentNode);
//获取所有的子节点对象
//var chileNodes = sp.childNodes;
var dv2 = document.getElementById('dv2');
//获取上一个哥哥节点
console.log(dv2.previousSibling.previousSibling);
//获取下一个弟弟节点
console.log(dv2.nextSibling.nextSibling);
}
</script>
- 通过DOM编程动态操作HTML页面的元素创建和删除
- 添加节点
- var obj = document.createElement(标签名); //创建标签对象
- parentObj.appendChild(obj); //放到指定的父节点下
function funAddNode(){
console.log('add node');
//创建一个span节点
var span = document.createElement('span');
//给节点加内容
span.innerHTML = '新来的';
//获取未来指定的父节点
var dv3 = document.getElementById('dv3');
//给dv3添加子节点
dv3.appendChild(span);
}
- 删除节点
- parentObj.removeChild(obj); //删除指定的子节点
function funDelNode(){
var dv3 = document.getElementById('dv3');
//获取dv3的子节点sp1
var sp1 = document.getElementById('sp1');
//删除子节点
dv3.removeChild(sp1);
}
BOM编程
- Browser Object Model,浏览器对象模型
- 可以控制浏览器的相关动作
- window对象:控制浏览器的窗口相关动作
- 弹窗提示:window.alert(内容)
- 确认提示窗口:window.confirm(提示信息) 返回值为true或false
- 弹窗接受用户信息:window.prompt(提示信息,文本框默认值) 返回用户输入的信息
function fun1(){
//弹窗
//window.alert('Hello');
//确认提示窗口
//var boo = window.confirm("是否确认");
//console.log(boo);
//参数一:提示信息
//参数二:文本框默认值,可以不要第二个参数
//返回值:用户输入的信息
var txt = window.prompt('请输入年龄','年龄是');
console.log(txt);
}
- 只执行一次的定时器:var id = window.setTimeout(回调函数,定时延迟/毫秒);
- 清除定时器:window.clearTimeout(id);
- 周期性定时器:var id = window.setInterval(回调函数,定时延迟/毫秒);
- 清除i定时器:window.clearInterval(id);
//一次执行定时器
//返回值,返回当前定时器的一个标识
//参数一:回调函数
//参数二:回调函数的延迟时间,单位毫秒
/* var timeId1 = window.setTimeout(function(){
alert('一次性定时器');
},3000); */
//周期执行定时器
//返回值,返回当前定时器的一个标识
//参数一:回调函数
//参数二:回调函数的延迟时间,单位毫秒
var timeId2 = window.setInterval(function(){
alert('周期性定时器')
},2000);
//清除定时器
function clearTime(){
//清除指定定时器
window.clearTimeout(timeId1);
window.clearInterval(timeId2);
}
- location对象:控制浏览器地址栏
- location.href=‘路径’ 跳转页面,也可以向action发送请求
function funBaidu(){
//跳转到百度
location.href='http://www.baidu.com';
}
<input type="button" value="百度一下" onclick="funBaidu()" />
- 编程方式提交表单:formObj.submit();
//提交表单的函数
function funSubmit(){
//手动提交表单
var fom = document.getElementById('fom');
fom.submit();
}
<form action="http://www.baidu.com" method="post" id="fom">
Username:<input type="text" /><br>
Password:<input type="password" ><br>
<input type="button" value="提交" onclick="funSubmit()">
</form>
- 点击更换验证码,浏览器会把加载过的资源缓存一个验证码图片,会记录下,所以需要加后缀让浏览器不去使用缓存,让浏览器重新发送请求
function changeCaptcha(){
//根据id获取验证码图片对象
var captchaImg = document.getElementById('captchaImg');
captchaImg.src = '${path }/p1/captcha?'+Math.random(); //让浏览器每次都重新加载验证码图片
//两种方法效果一样
//captchaImg.src = '${path }/p1/captcha?'+new Date();
}
<img src="${path }/p1/captcha" id="captchaImg">
<a href="javascript:void(0)" onclick="changeCaptcha()">看不清,换一张
//可以传this,在方法中就不需要获取图片对象了,可以简化