js、day2 函数 rest arguments 作用域 let 内部对象 json date ajax 面向对象编程 bom dom操作(增删改查)

1.函数

1.1定义函数以及手动规避异常

定义方式1

//自己定义一个绝对值函数
function abs(x){
   if(x>= 0){
       return x;
  }else if(x<0){
       return -x;
  }
}
  • 注意点

    • 一旦执行return,函数立刻返回结果

    • 但是没有执行return,函数也会返回结果,结果就是 undefined这点和c还有java不一样

定义方式2

var abs = function(x){
   if(x>= 0){
       return x;
  }else if(x<0){
       return -x;
  }
}
  • 方法1和方法2等价。

假设不存在参数,如何规避

//自己定义一个绝对值函数
function abs(x){
   if(typeof x!=='number'){
       throw 'not a number';
  }
   if(x>= 0){
       return x;
  }else if(x<0){
       return -x;
  }
}

1.2arguments

这是一个js免费赠送的关键字

function abs(x){
   for (let i = 0; i < arguments.length; i++) {
       console.log(arguments[i]);
  }
   
   //假如我传的是20,10,30,这个关键字,就会自动生成一个数组,将我传入的东西保存
   结果:
abs(3,4,234,234,24)
text4.html:9 3
text4.html:9 4
2text4.html:9 234
text4.html:9 24

1.3rest

es6新特性,获取·除了已经定义的参数之外的所有参数

比如上面的function abs 函数,我定义了x,name就会除了第一个数据,都录入

function add(a,b,...rest){
   console.log('a'+a);
   console.log('b'+b);
   console.log(rest);
}

add(2,43,342,53453,123123)
text4.html:22 a2
text4.html:23 b43
text4.html:24 (3) [342, 53453, 123123]
  • 注意事项

    • 只能写在最后面,必须用...

1.4id和方法函数

将按钮都总结为一个函数,onclick里面放的就是函数

//定义一个函数,第一个值传的是id,第二个值传的是方法
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
        *{
            margin: 0;
            border: 0;
        }
        #change{
            width: 400px;
            height: 450px;
            margin: 0 auto;
            text-align: center;
            padding: 5px;
            background: aqua;
            border-radius: 5px;
        }
        /*button{*/
        /*   border-radius: 5px;*/
        /*}*/
   </style>

   <script>


       // var pre = document.getElementById("pre");
       // pre.onclick=function (){
       //     //这里数组的话千万不能忘记了是0
       //     if (count===0){
       //         alert("已经是到头了")
       //         count=1;
       //     }
       //     count--;
       //     document.getElementsByTagName("img")[0].src=imgArrays[count];
       //     tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       // };

       function btnAll(id,func){
           var btn = document.getElementById(id);
           btn.onclick=func;
      }

       window.onload=function (){
       var count = 0;
       var tip = document.getElementsByTagName("p")[0];

       //这里因为是变成一个数组
       var imgArrays = ["image/1.jpeg","image/2.jpeg","image/3.jpeg","image/4.jpeg"];
       var img = document.getElementsByTagName("img")[0];
           tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       //也可以像之前一样 先var bnt1 = document.getElementById("pre");
       //   再bnt1.onclick = 方法     也可以

           btnAll("pre",function (){ if (count===0){
                       alert("已经是到头了")
                       count=1;
                  }
                   count--;
                   document.getElementsByTagName("img")[0].src=imgArrays[count];
                   tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
          });

           btnAll("next",function (){
               if (count===imgArrays.length-1){
                   alert("已经是到头了")
                   count=imgArrays.length-2;
              }
               count++;
               img.src=imgArrays[count];
               tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
          })
       // var pre = document.getElementById("pre");
       // pre.onclick=function (){
       //     //这里数组的话千万不能忘记了是0
       //     if (count===0){
       //         alert("已经是到头了")
       //         count=1;
       //     }
       //     count--;
       //     document.getElementsByTagName("img")[0].src=imgArrays[count];
       //     tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       // };

       // var next = document.getElementById("next");
       // next.onclick=function (){
       //     //和上面的区别是一种方法的两种表达方式
       //     if (count===imgArrays.length-1){
       //         alert("已经是到头了")
       //         count=imgArrays.length-2;
       //     }
       //     count++;
       //     img.src=imgArrays[count];
       //     tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       // };
      };
   </script>
</head>
<body>

<div id="change">
    <p></p>
    <img src="image/1.jpeg" alt="好看的图" title = "悬停文字">
    <button id="pre">上一张</button>
    <button id="next">下一张</button>
</div>


</body>
</html>

 

2.作用域,变量的作用域

和c语言大致相同,尽量将变量的定义放在头部,便于代码维护

2.1全局变量

  • var x = 1;

  • 定义全局变量

  • 默认全局变量,都会自动绑定下window下

  • alert(x)等价于alert(window.x)

2.2规范

由于我们的所有的全局变量都会绑定到我们的windows上,如果不同的js文件产生了相同的全局变量,就会产生冲突,-》如何减少冲突,所以就要定义唯一全局变量

//唯一全局变量
var kuangshen = {};
//定义全局变量
kuangshen.name = 'kuangshen';
kuangshen.add = function (a,b){
   return a+b;
}
  • 将自己的代码全部放入自己定义的唯一名字中,降低全局命名冲突的问题

  • 后来会学到jQuery jQuery.方法(这个还给自己用了一个简化符号,就是$)

2.3let(局部变量)

function aj(){
   for (var i = 0; i < 10; i++) {
       console.log(i);
  }
   console.log(i+1);//最后输出了11,说明出了他的作用域,还是生效,所以这里应该采用let来定义
}

2.4常量 const

在es6之间,都用全部大写字母来定义

 

3.对象里面的方法

var raoxin = {
name:'raoxin',
time:2000,
age:function(){
let now = new Date().getFullYear();//获取今年的年份
return now-this.time;
},
sex:'女'
}

3.1apply函数

在js中可以控制this的指向

function getAge(){
let now = new Date().getFullYear();//获取今年的年份
return now-this.time;
}
var raoxin = {
name:'raoxin',
time:2000,
age:getAge,//这里不需要括号,将这个方法拆开写
sex:'男'
}

//这里直接调用raoxin.age是可以使用的,但是调用不了getAge()因为,这个方法是在window下的,这个this指向的就是windows,但是windows并没有定义time

getAge.apply(raoxin,[]);//js中可以控制this的指向,使用apply这里指向的是raoxin这个对象,参数为空,这样的话getAge这个函数的this就有了指向对象

4.内部对象

标准对象 通过type of 判断是什么类型

typeof true;
'boolean'
typeof NaN;
'number'

 

4.1Date

var nowTime = new Date();
console.log(nowTime);//打印出来现在的时间

结果:Sun Apr 10 2022 16:45:58 GMT+0800 (中国标准时间)
nowTime.getFullYear();//年月日 星期几 小时 秒
nowTime.getMonth();
nowTime.getDate();
nowTime.getDay();
nowTime.getHours();
nowTime.getMilliseconds();

nowTime.getTime();//时间戳 全世界统一 从1970年1.1日开始计时 毫秒数
//简单使用时间戳,将时间戳传入其中就可以使它变为标准时间,如下程序,以为自己电脑的时间是可以修改的,不够准确

nowTime.getTime();
1649580358216
console.log(new Date(1649580358216))
VM284:1 Sun Apr 10 2022 16:45:58 GMT+0800 (中国标准时间)

nowTime.toLocaleDateString()//当地时间
'2022/4/10'

4.2JSON(重要)

JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。JSON 在 Web 开发领域有着举足轻重的地位,如果您想在 Web 开发领域大展身手的话,就必须了解 JSON。

  • 在Javascript中一切皆为对象、任何js支持的类型都可以用json来表示

  • 格式

    • 对象都用{}

    • 数组都用[]

    • 所有的键值对都用key:value

 //定义一个对象,怎么判断他是一个对象呢,可以输出一下,也可以使用typeof,她会返回一个 object
//从而判断他就是对象
let user = {
name:'raoxin',
age:18,
time:2000
}

console.log(user);
//{name: 'raoxin', age: 18, time: 2000}和下面的json格式相比可以展开,并且name之类的没有双引号

//将对象转化为json字符串
let userJson = JSON.stringify(user);
//console.log(userjson)
// VM268:1 {"name":"raoxin","age":18,"time":2000}

let obj = JSON.parse('{"name":"raoxin","age":18,"time":2000}');
//console.log(obj)
// VM421:1 {name: 'raoxin', age: 18, time: 2000}

 

json和js对象的区别

  • json

    • {"name":"raoxin","age":18,"time":2000}

  • js

    • {name: 'raoxin', age: 18, time: 2000}

4.3Ajax

  • 原生的js写法 xhr异步请求

  • jQuery封装好的方法 $(#name).ajax("")

  • axios请求

5.面向对象编程

5.1什么是面向对象

JavaScript、java、c#中都有面向对象;JavaScript有些区别

  • 类:模板

  • 对象:具体的实例

在JavaScript中需要大家转换一下思维方式

5.2原型(相当于继承)

原型:

let person = {
name:'raoxin',
time:2000,
sex:'男',
run:function (){
console.log(this.name+'run')
}
}
let xiaoming = {
name: 'xiaoming'
}
//相当于java里面的继承,这里叫做person是xiaoming的原型,简单理解为父类
xiaoming.__proto__=person;

5.3class继承(es6中引入)

//定义一个学生的类
class students{
constructor(name) {
name = this.name;
}
//一个方法,连function都不要
run(){
alert('hello');
}
}

//这样小学生就继承了学生的方法,这里没有搞懂super(name)的用处,所以改了一下变成注释的样子
//class pupil extends students{
//
// constructor(name,mygrade) {
// super();
// this.name= name;
// this.myGrade = mygrade;
// }
// myGra(){
// alert('我是一名小学生');
// }
// }
class pupil extends students{
constructor(name,mygrade) {
super(name);
this.myGrade = mygrade;
}
myGrade(){
alert('我是一名小学生');
}
}

let xiaohong = new students("xiaoming");
let xiaoming = new students("xiaohong",1);
xiaohong.run();
xiaoming.run();

5.4super理解

//定义一个学生的类
class students{
constructor(name) {
this.name =name;
console.log(name);
}
//一个方法,连function都不要
run(){
alert('hello');
}
}

//这样小学生就继承了学生的方法
class pupil extends students{

constructor(name,mygrade) {
super('xiaoming');
// this.name= name;
this.myGrade = mygrade;
}
myGra(){
alert('我是一名小学生');
}
}


let xiaoming = new pupil("xiao",1);
//这样子出现的就是xiaoming.name就是xioaming,而不是xiao因为子类将xiaoming赋值给了name
let xiaohong = new students("fdjalfjlas");
xiaohong.run();
xiaoming.run();
// console.log(xiaoming);
// console.log(xiaohong);

6.BOM操作

B就是浏览器 browse o是object m是model 浏览器对象模型

6.1浏览器内核,以及三方

  • 浏览器内核

    • chrome

    • safari

    • firefox

    • opera

    • ie-6-11

  • 三方(和内核不同,这个就是可以换内核)

    • qq浏览器

    • 360浏览器

    • 搜狗浏览器

6.2windows常用操作

window

  • window代表 浏览器窗口

//显示浏览器的宽和高
window.innerHeight
754
window.innerWidth
982
window.outerHeight
824
window.outerWidth
1536
window.innerHeight
754
window.innerWidth
428

6.3简单认识navigator对象

navigator.appName
'Netscape'
navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
navigator.userAgent
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
navigator.platform
'Win32'
//现在一般不用这个,因为这个是可以个人修改的

6.4简单认识screen对象

screen.height
864
screen.width
1536

6.5location对象 比较重要

代表当前页面的url信息

host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/?tn=44004473_21_oem_dg"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"
reload: ƒ reload()

location.assign('wangzhi')//这样百度就会跳转到你所设定的链接中

6.6document重要

代表当前页面,html dom文档树

document.title = 'raoxin';
//这样最上面的导航栏名字就会变成这个

image-20220411142607835

<dl id= "course">
<dt>213</dt>
<dd>3213</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<dl id="cour">
<dt>ewfwe</dt>
<dd>3fdsf</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<script>
function dl(x){
return document.getElementById(x);
}

// let dl = document.getElementById('course');
// 也可以byclass这类的信息
</script>

cookie

document.cookie//cookie是客户端的一些本地信息

document.cookie
'BIDUPSID=4DC84DFF01DEDF2C5B13D2779CF7F617; PSTM=1647496651; BD_UPN=12314753; BAIDUID=E055E0CB34625545A9078EC89B8D3821:FG=1; H_PS_PSSID=26350; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; delPer=0; BD_CK_SAM=1; PSINO=3; BDRCVFR[QH_jv-D1QKs]=I9fPaKsGu1_UgP8QhP8; BD_HOME=1; BA_HECTOR=010584248h0k24855e1h57jn60q; BDSVRTM=0; BAIDUID_BFESS=A3B3877DF747692F6726812F09825AA6:FG=1'
  • 劫持cookie原理

    • 假设写了一段js代码里面包含document.cookie

    • 再使用ajax请求到它的服务器上,就被劫持信息

    • 假如你登入淘宝,但是你登上去以后发现,天猫不用重新登陆,因为它获得了你的cookie,你可以在右上角清空,这样就不行了

  • 解决办法,服务器端设置httponly(代表只读)

可以获取具体的文档树节点

  • 这样就能动态的删除节点和修改节点

6.7history

代表浏览器的历史记录

history.back();//后退
history.forward();//前进

7.操作DOM

文档对象模型 核心:整个浏览器就是一个dom树形结构

动态的操作网页中的元素

  • 更新:更新dom节点

  • 遍历dom节点:得到dom节点

  • 删除:删除一个dom节点

  • 添加:添加一个新的节点

需要操作don节点,必须获得这个dom节点

7.1get三个方法

<body>
<h1>biaoqian</h1>
<!-- <h1>shabi</h1>-->
<dl id= "course">
<dt>213</dt>
<dd>3213</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<dl class="cour">
<dt>ewfwe</dt>
<dd>3fdsf</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<script>
//对应css的选择器
var h1 = document.getElementById('course');//id一个元素节点对像
var h2= document.getElementsByClassName('cour');//类名,获得一组元素节点对象
var h3 = document.getElementsByTagName('dl');//标签名字,获得一组元素对象

7.1.1查询节点的子节点

id名字(或者类名标签名).children就是获得所有的子节点
id名字(或者类名标签名).firstchild()
id名字(或者类名标签名).lastchild()
id名字(或者类名标签名).next()

 

  • 注意事项

    • 这些都是原生代码,我们之后尽量使用jquery

7.2更新节点 增删改查

innerHTML()就是该文本内容

var btn1 =  document.getElementById("btn1");
console.log(btn1);
console.log(btn1.innerHTML);
btn1.innerHTML = "这不是一个按钮";
/*
* 首先是获取这个元素
* 然后修改它的文本内容
* */
//这是输出结果 <button id="btn1">这是第一个按钮</button>
// 这是第一个按钮

image-20220412182636962

7.3事件

比如说点击按钮就是一个事件 关闭网页,晃鼠标都是事件,发生事件以后要有行为处理事件

  • 假如是点击一次可以发生的行为我们知道,但是其他行为发生我们如何知道呢,那就是查看w3c文档的事件就可以查看

按钮

<button id="btn1" onclick="alert('讨厌,点我干嘛')">这是第一个按钮</button>

image-20220412184312138

7.4切换图片

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
border: 0;
}
#change{
width: 400px;
height: 430px;
margin: 0 auto;
text-align: center;
padding: 5px;
background: aqua;
border-radius: 5px;
}
/*button{*/
/* border-radius: 5px;*/
/*}*/
</style>

<script>


window.onload=function (){

//这里因为是变成一个数组
var img = document.getElementsByTagName("img")[0];
var next = document.getElementById("next");

//也可以像之前一样 先var bnt1 = document.getElementById("pre");
// 再bnt1.onclick = 方法 也可以
document.getElementById("pre").onclick=function (){
//这里数组的话千万不能忘记了是0
document.getElementsByTagName("img")[0].src="image/1.jpeg";
};

next.onclick=function (){
//和上面的区别是一种方法的两种表达方式
img.src="image/3.jpeg";

};
};
</script>
</head>
<body>

<div id="change">
<img src="image/2.jpeg" alt="好看的图" title = "悬停文字">
<button id="pre">上一张</button>
<button id="next">下一张</button>
</div>


</body>
</html>

image-20220414153246576

7.5切换图片改善

改为到头有提示,并且显示一共几张图片,这是第几张

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
border: 0;
}
#change{
width: 400px;
height: 450px;
margin: 0 auto;
text-align: center;
padding: 5px;
background: aqua;
border-radius: 5px;
}
/*button{*/
/* border-radius: 5px;*/
/*}*/
</style>

<script>


window.onload=function (){
var tip = document.getElementsByTagName("p")[0];
var count = 0;
//这里因为是变成一个数组
var imgArrays = ["image/1.jpeg","image/2.jpeg","image/3.jpeg","image/4.jpeg"];
var img = document.getElementsByTagName("img")[0];
var next = document.getElementById("next");
tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
//也可以像之前一样 先var bnt1 = document.getElementById("pre");
// 再bnt1.onclick = 方法 也可以
document.getElementById("pre").onclick=function (){
//这里数组的话千万不能忘记了是0
if (count===0){
alert("已经是到头了")
count=1;
}
count--;
document.getElementsByTagName("img")[0].src=imgArrays[count];
tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
};

next.onclick=function (){
//和上面的区别是一种方法的两种表达方式
if (count===imgArrays.length-1){
alert("已经是到头了")
count=imgArrays.length-2;
}
count++;
img.src=imgArrays[count];
tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
};
};
</script>
</head>
<body>

<div id="change">
<p></p>
<img src="image/1.jpeg" alt="好看的图" title = "悬停文字">
<button id="pre">上一张</button>
<button id="next">下一张</button>
</div>


</body>
</html>

7.6文档加载顺序

文档是自上而下加载的

</head>
<body>
<button id="btn1" >这是第一个按钮</button>
<script>
var btn1 = document.getElementById("btn1");
btn1.onclick= function (){
alert('zheshisha');
}
// 这里放在body里面说是因为加载顺序是从上而下加载的,如果还放在head里面,这个function就会失效,放在head里面就获取不到他的id
</script>

7.6.1解决办法

  • 想要文件自上而下执行,又不将上一段代码报错,那就要使用onload事件,就是在页面加载完毕后,再加载此段代码

<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload=function (){
var btn1 = document.getElementById("btn1");
btn1.onclick= function () {
alert('zheshisha');
};

// 本来这里放在body里面说是因为加载顺序是从上而下加载的,如果还放在head里面,这个function就会失效
// 但是这里放了onload,
}

</script>

</head>
<body>
<button id="btn1" >这是第一个按钮</button>


</body>

 

7.7全选全不选联系

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
/**{*/
/* margin: 0;*/
/*}*/
#form{
height: 131px;
width: 250px;
margin: 5px auto;
text-align: center;
background-color: aqua;
padding: 5px;
border:3px black solid;
border-radius: 6px;
/*border-color: black;*/
}
</style>

<script>
function ifCheck(x,y){
if (x===1){
document.getElementsByName("item")[y].checked=true;
}else if(x===0){
document.getElementsByName("item")[y].checked=false;
}else {
alert("只能填0或1");}
}

window.onload = function (){


var btn = document.getElementsByTagName("button");
btn[0].onclick =function (){
for (let i = 0; i < 4; i++) {
ifCheck(1,i);
}
};


btn[1].onclick =function (){
for (let i = 0; i < 4; i++) {
ifCheck(0,i);
}
};



}

</script>
</head>
<body>
<div >
<form action="#" method="get" id ="form">
<p>你爱好的运动是 <input type="checkbox" value="all">/<input type="checkbox" value="noone">全不选</p>
<p><input type="checkbox" value="basketball" name="item" id="jdf"/>篮球
<input type="checkbox" value="football" name="item"/>足球
<input type="checkbox" value="pingpong" name="item"/>乒乓球
<input type="checkbox" value="bangball" name="item"/>棒球</p>
<p>
<button type="button">全选</button>
<button type="button">全不选</button>
<button type="button">反选</button>
<input type="submit">
</p>
</form>

</div>

</body>
</html>

7.7.1出现了一闪一闪的问题

  • 描述

    • 点击全选按钮时出现了选中一瞬间的问题,

    • 解决:button按钮的type默认是submit会是提交,只需要将他的type改成button就可以了

7.8dom操作补充

  • 想要获取body属性

    • 原本是var body = document.getElementsByTagName("body")[0];

    • 但是因为document中保存有body,可以var body = document.body;

  • document.documentelement是html的根标签

7.9dom增删改

createAttribute()创建属性节点。
createElement() 创建元素节点。
createTextNode() 创建文本节点。
appendChild() 把新的子节点添加到指定节点。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>

<style>
ul li{
list-style: none;
line-height: 30px;
}
div{
height: 158px;
width: 113px;
border: black solid 2px;
margin: 0 auto;
border-radius: 3px;

}
</style>

<script>
window.onload = function (){
//创建元素节点
var cra_ele = document.createElement("li");
// 创建文本内容
var cra_txt = document.createTextNode("这是什么意思")

var uladdli = document.getElementsByTagName("ul");
// lastchild[2].appendChild(cra_txt);
// 这句话是在第三个li中加了这是说明意思

//在body的最后加了一个节点
//appendChild是在父节点里面的最后一个子节点后面添加
uladdli[0].appendChild(cra_ele);

var ullast = document.getElementById("ul").lastChild;
console.log(ullast);

//这两种方法都可以将文本添加到最后一个li标签中
// ullast.appendChild(cra_txt);
ullast.innerHTML = "shabi";

};

</script>

</head>
<body>

<div>
<ul id="ul">
<li>语文</li>
<li>数学</li>
<li>英语</li>
</ul>
</div>

</body>
</html>

image-20220414214444062

image-20220414214500231

  • removeChild()

    • 删除子节点

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
div{
margin: 0 auto;
border: black solid 2px;
border-radius: 5px;
height: 238px;
width: 269px;
text-align: center;
}
table,tr,td{
border: black 1px solid;
text-align: center;
}
table{
width: 268px;
}
</style>

<script>
//定义函数,点击以后,获取id,
function myClick(id,func){
var btn = document.getElementById(id);
btn.onclick=func;
}

//点击提交按钮后,添加一行
window.onload= function (){
var allA = document.getElementsByTagName("a");
for (let i = 0; i < allA.length; i++) {
allA[i].onclick = function (){
this.parentElement.parentElement.remove();
// alert(allA.length);
//这里不能使用allA[i],因为这样子删了第一行,第二行就变为第一行。
/*
* 假如说本来有两行
* 第一行是allA[0]
* 第二行是allA[1]
* 如果我把这里的this换成allA
* 首先我删除第一行的时候,那么alla[1]就会变成allA[0]
* 那么我原本赋值给allA[1]的函数就会失效
* 他的超链接就会变成跳转函数,所以,会刷新自身的页面
* 我将a改为<a href="javascript:;" >delete</a>;来验证
* 发现果然先删除第一行以后这个方法就失效了
* */
/*
* 点击超链接以后会默认跳转,我们不希望出现默认行为
* 可以通过响应函数最后加一个添加return false来取消默认行为
* */
return false;
// 或者在超链接中<a href="javascript:;" >delete</a> 也可以不跳转
}
}
</script>
</head>
<body>

<div>
<table id="table">
<tr>
<td>Name</td>
<td>Email</td>
<td>Salary</td>
<td></td>
</tr>
<tr>
<td>Tom</td>
<td>fjaldf@jflsd</td>
<td>5000</td>
<td><a href="javascript:;" >delete</a></td>
</tr>
<tr>
<td>Jerry</td>
<td>dfaf@fjalfj</td>
<td>1515</td>
<td><a href="javascript:;" >delete</a></td>
</tr>
</table>

</div>

<div>
<h1>添加新员工</h1>
<form action="#" method="get">
<p>name:<input type="text" name="name"></p>
<p>email:<input type="email" name="email"></p>
<p>salary:<input type="number" name="salary"></p>
<button id="btn1">提交</button>
</form>

</div>

</body>
</html>

删中遇到的问题

  • 首先就是删除第一行以后,再点第一行就会刷新或者,没用,查看了以后发现是allA[I]的问题,在上面用this就解决了

增删方法一

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
       div{
           margin: 0 auto;
           border: black solid 2px;
           border-radius: 5px;
           height: 238px;
           width: 269px;
           text-align: center;
      }
       table,tr,td{
           border: black 1px solid;
           text-align: center;
      }
       table{
           width: 268px;
      }
   </style>

   <script>
       //定义函数,点击以后,获取id,
       function myClick(id,func){
           var btn = document.getElementById(id);
           btn.onclick=func;
      }

       //点击提交按钮后,添加一行
       window.onload= function (){
           /*这里是添加delet的功能,
          点击delete删除改行的内容,
          并且删除之前弹出提示框是
          否要删除不删除的话可以取消*/
           var allA = document.getElementsByTagName("a");
           for (let i = 0; i < allA.length; i++) {
               allA[i].onclick = function (){

                   if(confirm("你确定要删除吗!")===true){
                       this.parentElement.parentElement.remove();
                  }

                   // alert(allA.length);
                   //这里不能使用allA[i],因为这样子删了第一行,第二行就变为第一行。
                   /*
                  * 假如说本来有两行
                  * 第一行是allA[0]
                  * 第二行是allA[1]
                  * 如果我把这里的this换成allA
                  * 首先我删除第一行的时候,那么alla[1]就会变成allA[0]
                  * 那么我原本赋值给allA[1]的函数就会失效
                  * 他的超链接就会变成跳转函数,所以,会刷新自身的页面
                  * 我将a改为<a href="javascript:;" >delete</a>;来验证
                  * 发现果然先删除第一行以后这个方法就失效了
                  * */
                   /*
                  * 点击超链接以后会默认跳转,我们不希望出现默认行为
                  * 可以通过响应函数最后加一个添加return false来取消默认行为
                  * */
                   return false;

               //   或者在超链接中<a href="javascript:;" >delete</a> 也可以不跳转
              }
          }


           myClick("btn1",function (){
               //首先是获取各个文本框的内容
               var name_text = document.getElementById("inpuname").value;
               var email_text = document.getElementById("inpuemail").value;
               var salary_text = document.getElementById("inpusalary").value;

               //获取table节点
               var table = document.getElementById("table");

               //创建新的一行的元素所需内容
               var childtr = document.createElement("tr");
               var childtd1 = document.createElement("td");
               var childtd2 = document.createElement("td");
               var childtd3 = document.createElement("td");
               var childtd4 = document.createElement("td");
               var childA = document.createElement("a");

               //要设置节点的属性
               // childtr.innerHTML = "shabi";
               // table.appendChild(childtr);
               table.appendChild(childtr).appendChild(childtd1).innerHTML=name_text;
               table.appendChild(childtr).appendChild(childtd2).innerHTML=email_text;
               table.appendChild(childtr).appendChild(childtd3).innerHTML=salary_text;
               table.appendChild(childtr).appendChild(childtd4).appendChild(childA).innerHTML="delete";

               //首先获取该链接的节点,想要给a添加属性,方法1
               var atribution = document.getElementsByTagName("a");
               // 然后创建该链接的节点属性以及赋值
               // var typ = document.createAttribute("href");
               // typ.nodeValue = "javascript:;";
               atribution[atribution.length-1].setAttribute("href","javascript:;");

               //方法2.两种方法都可以
               // atribution[atribution.length-1].href = "javascript:;";

               var allA = document.getElementsByTagName("a");
               for (let i = 0; i < allA.length; i++) {
                   allA[i].onclick = function () {

                       if (confirm("你确定要删除吗!") === true) {
                           this.parentElement.parentElement.remove();
                      }}}

          })
      };
   </script>
</head>
<body>

<div>
   <table id="table">
       <tr>
           <td>Name</td>
           <td>Email</td>
           <td>Salary</td>
           <td></td>
       </tr>
       <tr>
           <td>Tom</td>
           <td>fjaldf@jflsd</td>
           <td>5000</td>
           <td><a href="javascript:;" >delete</a></td>
       </tr>
       <tr>
           <td>Jerry</td>
           <td>dfaf@fjalfj</td>
           <td>1515</td>
           <td><a href="javascript:;" >delete</a></td>
       </tr>
   </table>

</div>

<div>
   <h1>添加新员工</h1>
   <form action="#" method="get">
       <p>name:<input type="text" name="name" id="inpuname"></p>
<!--       文本框中的内容就是value-->
       <p>email:<input type="email" name="email" id="inpuemail"></p>
       <p>salary:<input type="number" name="salary" id="inpusalary"></p>
       <button id="btn1" type="button">提交</button>
   </form>
   
</div>    

</body>
</html>

image-20220415171007634

增删方法二

这个方法简单很多。。。。。。

//创建新的一行的元素所需内容
var childtr = document.createElement("tr");
childtr.innerHTML = "<td>"+name_text+"</td>"+
"<td>"+email_text+"</td>"+
"<td>"+salary_text+"</td>"+
"<td><a href='javascript:;' >delete</a></td>";

table.appendChild(childtr);

 

替换

replacechild()

 

 

 

8.this

btn[2].onclick =function (){
               alert(this);
               alert(this===btn[2]);
           //   结果是true,所以说明这个this在函数中是
//在事件的响应函数中,响应函数是给谁绑定的,this就是谁
          };btn[1].onclick =function (){
   for (let i = 0; i < 4; i++) {
       ifCheck(0,i);
  }
};

1.函数

1.1定义函数以及手动规避异常

定义方式1

//自己定义一个绝对值函数
function abs(x){
   if(x>= 0){
       return x;
  }else if(x<0){
       return -x;
  }
}
  • 注意点

    • 一旦执行return,函数立刻返回结果

    • 但是没有执行return,函数也会返回结果,结果就是 undefined这点和c还有java不一样

定义方式2

var abs = function(x){
   if(x>= 0){
       return x;
  }else if(x<0){
       return -x;
  }
}
  • 方法1和方法2等价。

假设不存在参数,如何规避

//自己定义一个绝对值函数
function abs(x){
   if(typeof x!=='number'){
       throw 'not a number';
  }
   if(x>= 0){
       return x;
  }else if(x<0){
       return -x;
  }
}

1.2arguments

这是一个js免费赠送的关键字

function abs(x){
   for (let i = 0; i < arguments.length; i++) {
       console.log(arguments[i]);
  }
   
   //假如我传的是20,10,30,这个关键字,就会自动生成一个数组,将我传入的东西保存
   结果:
abs(3,4,234,234,24)
text4.html:9 3
text4.html:9 4
2text4.html:9 234
text4.html:9 24

1.3rest

es6新特性,获取·除了已经定义的参数之外的所有参数

比如上面的function abs 函数,我定义了x,name就会除了第一个数据,都录入

function add(a,b,...rest){
   console.log('a'+a);
   console.log('b'+b);
   console.log(rest);
}

add(2,43,342,53453,123123)
text4.html:22 a2
text4.html:23 b43
text4.html:24 (3) [342, 53453, 123123]
  • 注意事项

    • 只能写在最后面,必须用...

1.4id和方法函数

将按钮都总结为一个函数,onclick里面放的就是函数

//定义一个函数,第一个值传的是id,第二个值传的是方法
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
        *{
            margin: 0;
            border: 0;
        }
        #change{
            width: 400px;
            height: 450px;
            margin: 0 auto;
            text-align: center;
            padding: 5px;
            background: aqua;
            border-radius: 5px;
        }
        /*button{*/
        /*   border-radius: 5px;*/
        /*}*/
   </style>

   <script>


       // var pre = document.getElementById("pre");
       // pre.onclick=function (){
       //     //这里数组的话千万不能忘记了是0
       //     if (count===0){
       //         alert("已经是到头了")
       //         count=1;
       //     }
       //     count--;
       //     document.getElementsByTagName("img")[0].src=imgArrays[count];
       //     tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       // };

       function btnAll(id,func){
           var btn = document.getElementById(id);
           btn.onclick=func;
      }

       window.onload=function (){
       var count = 0;
       var tip = document.getElementsByTagName("p")[0];

       //这里因为是变成一个数组
       var imgArrays = ["image/1.jpeg","image/2.jpeg","image/3.jpeg","image/4.jpeg"];
       var img = document.getElementsByTagName("img")[0];
           tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       //也可以像之前一样 先var bnt1 = document.getElementById("pre");
       //   再bnt1.onclick = 方法     也可以

           btnAll("pre",function (){ if (count===0){
                       alert("已经是到头了")
                       count=1;
                  }
                   count--;
                   document.getElementsByTagName("img")[0].src=imgArrays[count];
                   tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
          });

           btnAll("next",function (){
               if (count===imgArrays.length-1){
                   alert("已经是到头了")
                   count=imgArrays.length-2;
              }
               count++;
               img.src=imgArrays[count];
               tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
          })
       // var pre = document.getElementById("pre");
       // pre.onclick=function (){
       //     //这里数组的话千万不能忘记了是0
       //     if (count===0){
       //         alert("已经是到头了")
       //         count=1;
       //     }
       //     count--;
       //     document.getElementsByTagName("img")[0].src=imgArrays[count];
       //     tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       // };

       // var next = document.getElementById("next");
       // next.onclick=function (){
       //     //和上面的区别是一种方法的两种表达方式
       //     if (count===imgArrays.length-1){
       //         alert("已经是到头了")
       //         count=imgArrays.length-2;
       //     }
       //     count++;
       //     img.src=imgArrays[count];
       //     tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
       // };
      };
   </script>
</head>
<body>

<div id="change">
    <p></p>
    <img src="image/1.jpeg" alt="好看的图" title = "悬停文字">
    <button id="pre">上一张</button>
    <button id="next">下一张</button>
</div>


</body>
</html>

 

2.作用域,变量的作用域

和c语言大致相同,尽量将变量的定义放在头部,便于代码维护

2.1全局变量

  • var x = 1;

  • 定义全局变量

  • 默认全局变量,都会自动绑定下window下

  • alert(x)等价于alert(window.x)

2.2规范

由于我们的所有的全局变量都会绑定到我们的windows上,如果不同的js文件产生了相同的全局变量,就会产生冲突,-》如何减少冲突,所以就要定义唯一全局变量

//唯一全局变量
var kuangshen = {};
//定义全局变量
kuangshen.name = 'kuangshen';
kuangshen.add = function (a,b){
   return a+b;
}
  • 将自己的代码全部放入自己定义的唯一名字中,降低全局命名冲突的问题

  • 后来会学到jQuery jQuery.方法(这个还给自己用了一个简化符号,就是$)

2.3let(局部变量)

function aj(){
   for (var i = 0; i < 10; i++) {
       console.log(i);
  }
   console.log(i+1);//最后输出了11,说明出了他的作用域,还是生效,所以这里应该采用let来定义
}

2.4常量 const

在es6之间,都用全部大写字母来定义

 

3.对象里面的方法

var raoxin = {
name:'raoxin',
time:2000,
age:function(){
let now = new Date().getFullYear();//获取今年的年份
return now-this.time;
},
sex:'女'
}

3.1apply函数

在js中可以控制this的指向

function getAge(){
let now = new Date().getFullYear();//获取今年的年份
return now-this.time;
}
var raoxin = {
name:'raoxin',
time:2000,
age:getAge,//这里不需要括号,将这个方法拆开写
sex:'男'
}

//这里直接调用raoxin.age是可以使用的,但是调用不了getAge()因为,这个方法是在window下的,这个this指向的就是windows,但是windows并没有定义time

getAge.apply(raoxin,[]);//js中可以控制this的指向,使用apply这里指向的是raoxin这个对象,参数为空,这样的话getAge这个函数的this就有了指向对象

4.内部对象

标准对象 通过type of 判断是什么类型

typeof true;
'boolean'
typeof NaN;
'number'

 

4.1Date

var nowTime = new Date();
console.log(nowTime);//打印出来现在的时间

结果:Sun Apr 10 2022 16:45:58 GMT+0800 (中国标准时间)
nowTime.getFullYear();//年月日 星期几 小时 秒
nowTime.getMonth();
nowTime.getDate();
nowTime.getDay();
nowTime.getHours();
nowTime.getMilliseconds();

nowTime.getTime();//时间戳 全世界统一 从1970年1.1日开始计时 毫秒数
//简单使用时间戳,将时间戳传入其中就可以使它变为标准时间,如下程序,以为自己电脑的时间是可以修改的,不够准确

nowTime.getTime();
1649580358216
console.log(new Date(1649580358216))
VM284:1 Sun Apr 10 2022 16:45:58 GMT+0800 (中国标准时间)

nowTime.toLocaleDateString()//当地时间
'2022/4/10'

4.2JSON(重要)

JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。JSON 在 Web 开发领域有着举足轻重的地位,如果您想在 Web 开发领域大展身手的话,就必须了解 JSON。

  • 在Javascript中一切皆为对象、任何js支持的类型都可以用json来表示

  • 格式

    • 对象都用{}

    • 数组都用[]

    • 所有的键值对都用key:value

 //定义一个对象,怎么判断他是一个对象呢,可以输出一下,也可以使用typeof,她会返回一个 object
//从而判断他就是对象
let user = {
name:'raoxin',
age:18,
time:2000
}

console.log(user);
//{name: 'raoxin', age: 18, time: 2000}和下面的json格式相比可以展开,并且name之类的没有双引号

//将对象转化为json字符串
let userJson = JSON.stringify(user);
//console.log(userjson)
// VM268:1 {"name":"raoxin","age":18,"time":2000}

let obj = JSON.parse('{"name":"raoxin","age":18,"time":2000}');
//console.log(obj)
// VM421:1 {name: 'raoxin', age: 18, time: 2000}

 

json和js对象的区别

  • json

    • {"name":"raoxin","age":18,"time":2000}

  • js

    • {name: 'raoxin', age: 18, time: 2000}

4.3Ajax

  • 原生的js写法 xhr异步请求

  • jQuery封装好的方法 $(#name).ajax("")

  • axios请求

5.面向对象编程

5.1什么是面向对象

JavaScript、java、c#中都有面向对象;JavaScript有些区别

  • 类:模板

  • 对象:具体的实例

在JavaScript中需要大家转换一下思维方式

5.2原型(相当于继承)

原型:

let person = {
name:'raoxin',
time:2000,
sex:'男',
run:function (){
console.log(this.name+'run')
}
}
let xiaoming = {
name: 'xiaoming'
}
//相当于java里面的继承,这里叫做person是xiaoming的原型,简单理解为父类
xiaoming.__proto__=person;

5.3class继承(es6中引入)

//定义一个学生的类
class students{
constructor(name) {
name = this.name;
}
//一个方法,连function都不要
run(){
alert('hello');
}
}

//这样小学生就继承了学生的方法,这里没有搞懂super(name)的用处,所以改了一下变成注释的样子
//class pupil extends students{
//
// constructor(name,mygrade) {
// super();
// this.name= name;
// this.myGrade = mygrade;
// }
// myGra(){
// alert('我是一名小学生');
// }
// }
class pupil extends students{
constructor(name,mygrade) {
super(name);
this.myGrade = mygrade;
}
myGrade(){
alert('我是一名小学生');
}
}

let xiaohong = new students("xiaoming");
let xiaoming = new students("xiaohong",1);
xiaohong.run();
xiaoming.run();

5.4super理解

//定义一个学生的类
class students{
constructor(name) {
this.name =name;
console.log(name);
}
//一个方法,连function都不要
run(){
alert('hello');
}
}

//这样小学生就继承了学生的方法
class pupil extends students{

constructor(name,mygrade) {
super('xiaoming');
// this.name= name;
this.myGrade = mygrade;
}
myGra(){
alert('我是一名小学生');
}
}


let xiaoming = new pupil("xiao",1);
//这样子出现的就是xiaoming.name就是xioaming,而不是xiao因为子类将xiaoming赋值给了name
let xiaohong = new students("fdjalfjlas");
xiaohong.run();
xiaoming.run();
// console.log(xiaoming);
// console.log(xiaohong);

6.BOM操作

B就是浏览器 browse o是object m是model 浏览器对象模型

6.1浏览器内核,以及三方

  • 浏览器内核

    • chrome

    • safari

    • firefox

    • opera

    • ie-6-11

  • 三方(和内核不同,这个就是可以换内核)

    • qq浏览器

    • 360浏览器

    • 搜狗浏览器

6.2windows常用操作

window

  • window代表 浏览器窗口

//显示浏览器的宽和高
window.innerHeight
754
window.innerWidth
982
window.outerHeight
824
window.outerWidth
1536
window.innerHeight
754
window.innerWidth
428

6.3简单认识navigator对象

navigator.appName
'Netscape'
navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
navigator.userAgent
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
navigator.platform
'Win32'
//现在一般不用这个,因为这个是可以个人修改的

6.4简单认识screen对象

screen.height
864
screen.width
1536

6.5location对象 比较重要

代表当前页面的url信息

host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/?tn=44004473_21_oem_dg"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"
reload: ƒ reload()

location.assign('wangzhi')//这样百度就会跳转到你所设定的链接中

6.6document重要

代表当前页面,html dom文档树

document.title = 'raoxin';
//这样最上面的导航栏名字就会变成这个

image-20220411142607835

<dl id= "course">
<dt>213</dt>
<dd>3213</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<dl id="cour">
<dt>ewfwe</dt>
<dd>3fdsf</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<script>
function dl(x){
return document.getElementById(x);
}

// let dl = document.getElementById('course');
// 也可以byclass这类的信息
</script>

cookie

document.cookie//cookie是客户端的一些本地信息

document.cookie
'BIDUPSID=4DC84DFF01DEDF2C5B13D2779CF7F617; PSTM=1647496651; BD_UPN=12314753; BAIDUID=E055E0CB34625545A9078EC89B8D3821:FG=1; H_PS_PSSID=26350; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; delPer=0; BD_CK_SAM=1; PSINO=3; BDRCVFR[QH_jv-D1QKs]=I9fPaKsGu1_UgP8QhP8; BD_HOME=1; BA_HECTOR=010584248h0k24855e1h57jn60q; BDSVRTM=0; BAIDUID_BFESS=A3B3877DF747692F6726812F09825AA6:FG=1'
  • 劫持cookie原理

    • 假设写了一段js代码里面包含document.cookie

    • 再使用ajax请求到它的服务器上,就被劫持信息

    • 假如你登入淘宝,但是你登上去以后发现,天猫不用重新登陆,因为它获得了你的cookie,你可以在右上角清空,这样就不行了

  • 解决办法,服务器端设置httponly(代表只读)

可以获取具体的文档树节点

  • 这样就能动态的删除节点和修改节点

6.7history

代表浏览器的历史记录

history.back();//后退
history.forward();//前进

7.操作DOM

文档对象模型 核心:整个浏览器就是一个dom树形结构

动态的操作网页中的元素

  • 更新:更新dom节点

  • 遍历dom节点:得到dom节点

  • 删除:删除一个dom节点

  • 添加:添加一个新的节点

需要操作don节点,必须获得这个dom节点

7.1get三个方法

<body>
<h1>biaoqian</h1>
<!-- <h1>shabi</h1>-->
<dl id= "course">
<dt>213</dt>
<dd>3213</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<dl class="cour">
<dt>ewfwe</dt>
<dd>3fdsf</dd>
<dd>数学</dd>
<dd>英语</dd>
</dl>
<script>
//对应css的选择器
var h1 = document.getElementById('course');//id一个元素节点对像
var h2= document.getElementsByClassName('cour');//类名,获得一组元素节点对象
var h3 = document.getElementsByTagName('dl');//标签名字,获得一组元素对象

7.1.1查询节点的子节点

id名字(或者类名标签名).children就是获得所有的子节点
id名字(或者类名标签名).firstchild()
id名字(或者类名标签名).lastchild()
id名字(或者类名标签名).next()

 

  • 注意事项

    • 这些都是原生代码,我们之后尽量使用jquery

7.2更新节点 增删改查

innerHTML()就是该文本内容

var btn1 =  document.getElementById("btn1");
console.log(btn1);
console.log(btn1.innerHTML);
btn1.innerHTML = "这不是一个按钮";
/*
* 首先是获取这个元素
* 然后修改它的文本内容
* */
//这是输出结果 <button id="btn1">这是第一个按钮</button>
// 这是第一个按钮

image-20220412182636962

7.3事件

比如说点击按钮就是一个事件 关闭网页,晃鼠标都是事件,发生事件以后要有行为处理事件

  • 假如是点击一次可以发生的行为我们知道,但是其他行为发生我们如何知道呢,那就是查看w3c文档的事件就可以查看

按钮

<button id="btn1" onclick="alert('讨厌,点我干嘛')">这是第一个按钮</button>

image-20220412184312138

7.4切换图片

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
border: 0;
}
#change{
width: 400px;
height: 430px;
margin: 0 auto;
text-align: center;
padding: 5px;
background: aqua;
border-radius: 5px;
}
/*button{*/
/* border-radius: 5px;*/
/*}*/
</style>

<script>


window.onload=function (){

//这里因为是变成一个数组
var img = document.getElementsByTagName("img")[0];
var next = document.getElementById("next");

//也可以像之前一样 先var bnt1 = document.getElementById("pre");
// 再bnt1.onclick = 方法 也可以
document.getElementById("pre").onclick=function (){
//这里数组的话千万不能忘记了是0
document.getElementsByTagName("img")[0].src="image/1.jpeg";
};

next.onclick=function (){
//和上面的区别是一种方法的两种表达方式
img.src="image/3.jpeg";

};
};
</script>
</head>
<body>

<div id="change">
<img src="image/2.jpeg" alt="好看的图" title = "悬停文字">
<button id="pre">上一张</button>
<button id="next">下一张</button>
</div>


</body>
</html>

image-20220414153246576

7.5切换图片改善

改为到头有提示,并且显示一共几张图片,这是第几张

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
border: 0;
}
#change{
width: 400px;
height: 450px;
margin: 0 auto;
text-align: center;
padding: 5px;
background: aqua;
border-radius: 5px;
}
/*button{*/
/* border-radius: 5px;*/
/*}*/
</style>

<script>


window.onload=function (){
var tip = document.getElementsByTagName("p")[0];
var count = 0;
//这里因为是变成一个数组
var imgArrays = ["image/1.jpeg","image/2.jpeg","image/3.jpeg","image/4.jpeg"];
var img = document.getElementsByTagName("img")[0];
var next = document.getElementById("next");
tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
//也可以像之前一样 先var bnt1 = document.getElementById("pre");
// 再bnt1.onclick = 方法 也可以
document.getElementById("pre").onclick=function (){
//这里数组的话千万不能忘记了是0
if (count===0){
alert("已经是到头了")
count=1;
}
count--;
document.getElementsByTagName("img")[0].src=imgArrays[count];
tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
};

next.onclick=function (){
//和上面的区别是一种方法的两种表达方式
if (count===imgArrays.length-1){
alert("已经是到头了")
count=imgArrays.length-2;
}
count++;
img.src=imgArrays[count];
tip.innerHTML="一共"+imgArrays.length+",这是第"+(count+1)+"张";
};
};
</script>
</head>
<body>

<div id="change">
<p></p>
<img src="image/1.jpeg" alt="好看的图" title = "悬停文字">
<button id="pre">上一张</button>
<button id="next">下一张</button>
</div>


</body>
</html>

7.6文档加载顺序

文档是自上而下加载的

</head>
<body>
<button id="btn1" >这是第一个按钮</button>
<script>
var btn1 = document.getElementById("btn1");
btn1.onclick= function (){
alert('zheshisha');
}
// 这里放在body里面说是因为加载顺序是从上而下加载的,如果还放在head里面,这个function就会失效,放在head里面就获取不到他的id
</script>

7.6.1解决办法

  • 想要文件自上而下执行,又不将上一段代码报错,那就要使用onload事件,就是在页面加载完毕后,再加载此段代码

<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload=function (){
var btn1 = document.getElementById("btn1");
btn1.onclick= function () {
alert('zheshisha');
};

// 本来这里放在body里面说是因为加载顺序是从上而下加载的,如果还放在head里面,这个function就会失效
// 但是这里放了onload,
}

</script>

</head>
<body>
<button id="btn1" >这是第一个按钮</button>


</body>

 

7.7全选全不选联系

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
/**{*/
/* margin: 0;*/
/*}*/
#form{
height: 131px;
width: 250px;
margin: 5px auto;
text-align: center;
background-color: aqua;
padding: 5px;
border:3px black solid;
border-radius: 6px;
/*border-color: black;*/
}
</style>

<script>
function ifCheck(x,y){
if (x===1){
document.getElementsByName("item")[y].checked=true;
}else if(x===0){
document.getElementsByName("item")[y].checked=false;
}else {
alert("只能填0或1");}
}

window.onload = function (){


var btn = document.getElementsByTagName("button");
btn[0].onclick =function (){
for (let i = 0; i < 4; i++) {
ifCheck(1,i);
}
};


btn[1].onclick =function (){
for (let i = 0; i < 4; i++) {
ifCheck(0,i);
}
};



}

</script>
</head>
<body>
<div >
<form action="#" method="get" id ="form">
<p>你爱好的运动是 <input type="checkbox" value="all">/<input type="checkbox" value="noone">全不选</p>
<p><input type="checkbox" value="basketball" name="item" id="jdf"/>篮球
<input type="checkbox" value="football" name="item"/>足球
<input type="checkbox" value="pingpong" name="item"/>乒乓球
<input type="checkbox" value="bangball" name="item"/>棒球</p>
<p>
<button type="button">全选</button>
<button type="button">全不选</button>
<button type="button">反选</button>
<input type="submit">
</p>
</form>

</div>

</body>
</html>

7.7.1出现了一闪一闪的问题

  • 描述

    • 点击全选按钮时出现了选中一瞬间的问题,

    • 解决:button按钮的type默认是submit会是提交,只需要将他的type改成button就可以了

7.8dom操作补充

  • 想要获取body属性

    • 原本是var body = document.getElementsByTagName("body")[0];

    • 但是因为document中保存有body,可以var body = document.body;

  • document.documentelement是html的根标签

7.9dom增删改

createAttribute()创建属性节点。
createElement() 创建元素节点。
createTextNode() 创建文本节点。
appendChild() 把新的子节点添加到指定节点。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>

<style>
ul li{
list-style: none;
line-height: 30px;
}
div{
height: 158px;
width: 113px;
border: black solid 2px;
margin: 0 auto;
border-radius: 3px;

}
</style>

<script>
window.onload = function (){
//创建元素节点
var cra_ele = document.createElement("li");
// 创建文本内容
var cra_txt = document.createTextNode("这是什么意思")

var uladdli = document.getElementsByTagName("ul");
// lastchild[2].appendChild(cra_txt);
// 这句话是在第三个li中加了这是说明意思

//在body的最后加了一个节点
//appendChild是在父节点里面的最后一个子节点后面添加
uladdli[0].appendChild(cra_ele);

var ullast = document.getElementById("ul").lastChild;
console.log(ullast);

//这两种方法都可以将文本添加到最后一个li标签中
// ullast.appendChild(cra_txt);
ullast.innerHTML = "shabi";

};

</script>

</head>
<body>

<div>
<ul id="ul">
<li>语文</li>
<li>数学</li>
<li>英语</li>
</ul>
</div>

</body>
</html>

image-20220414214444062

image-20220414214500231

  • removeChild()

    • 删除子节点

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
div{
margin: 0 auto;
border: black solid 2px;
border-radius: 5px;
height: 238px;
width: 269px;
text-align: center;
}
table,tr,td{
border: black 1px solid;
text-align: center;
}
table{
width: 268px;
}
</style>

<script>
//定义函数,点击以后,获取id,
function myClick(id,func){
var btn = document.getElementById(id);
btn.onclick=func;
}

//点击提交按钮后,添加一行
window.onload= function (){
var allA = document.getElementsByTagName("a");
for (let i = 0; i < allA.length; i++) {
allA[i].onclick = function (){
this.parentElement.parentElement.remove();
// alert(allA.length);
//这里不能使用allA[i],因为这样子删了第一行,第二行就变为第一行。
/*
* 假如说本来有两行
* 第一行是allA[0]
* 第二行是allA[1]
* 如果我把这里的this换成allA
* 首先我删除第一行的时候,那么alla[1]就会变成allA[0]
* 那么我原本赋值给allA[1]的函数就会失效
* 他的超链接就会变成跳转函数,所以,会刷新自身的页面
* 我将a改为<a href="javascript:;" >delete</a>;来验证
* 发现果然先删除第一行以后这个方法就失效了
* */
/*
* 点击超链接以后会默认跳转,我们不希望出现默认行为
* 可以通过响应函数最后加一个添加return false来取消默认行为
* */
return false;
// 或者在超链接中<a href="javascript:;" >delete</a> 也可以不跳转
}
}
</script>
</head>
<body>

<div>
<table id="table">
<tr>
<td>Name</td>
<td>Email</td>
<td>Salary</td>
<td></td>
</tr>
<tr>
<td>Tom</td>
<td>fjaldf@jflsd</td>
<td>5000</td>
<td><a href="javascript:;" >delete</a></td>
</tr>
<tr>
<td>Jerry</td>
<td>dfaf@fjalfj</td>
<td>1515</td>
<td><a href="javascript:;" >delete</a></td>
</tr>
</table>

</div>

<div>
<h1>添加新员工</h1>
<form action="#" method="get">
<p>name:<input type="text" name="name"></p>
<p>email:<input type="email" name="email"></p>
<p>salary:<input type="number" name="salary"></p>
<button id="btn1">提交</button>
</form>

</div>

</body>
</html>

删中遇到的问题

  • 首先就是删除第一行以后,再点第一行就会刷新或者,没用,查看了以后发现是allA[I]的问题,在上面用this就解决了

增删方法一

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
       div{
           margin: 0 auto;
           border: black solid 2px;
           border-radius: 5px;
           height: 238px;
           width: 269px;
           text-align: center;
      }
       table,tr,td{
           border: black 1px solid;
           text-align: center;
      }
       table{
           width: 268px;
      }
   </style>

   <script>
       //定义函数,点击以后,获取id,
       function myClick(id,func){
           var btn = document.getElementById(id);
           btn.onclick=func;
      }

       //点击提交按钮后,添加一行
       window.onload= function (){
           /*这里是添加delet的功能,
          点击delete删除改行的内容,
          并且删除之前弹出提示框是
          否要删除不删除的话可以取消*/
           var allA = document.getElementsByTagName("a");
           for (let i = 0; i < allA.length; i++) {
               allA[i].onclick = function (){

                   if(confirm("你确定要删除吗!")===true){
                       this.parentElement.parentElement.remove();
                  }

                   // alert(allA.length);
                   //这里不能使用allA[i],因为这样子删了第一行,第二行就变为第一行。
                   /*
                  * 假如说本来有两行
                  * 第一行是allA[0]
                  * 第二行是allA[1]
                  * 如果我把这里的this换成allA
                  * 首先我删除第一行的时候,那么alla[1]就会变成allA[0]
                  * 那么我原本赋值给allA[1]的函数就会失效
                  * 他的超链接就会变成跳转函数,所以,会刷新自身的页面
                  * 我将a改为<a href="javascript:;" >delete</a>;来验证
                  * 发现果然先删除第一行以后这个方法就失效了
                  * */
                   /*
                  * 点击超链接以后会默认跳转,我们不希望出现默认行为
                  * 可以通过响应函数最后加一个添加return false来取消默认行为
                  * */
                   return false;

               //   或者在超链接中<a href="javascript:;" >delete</a> 也可以不跳转
              }
          }


           myClick("btn1",function (){
               //首先是获取各个文本框的内容
               var name_text = document.getElementById("inpuname").value;
               var email_text = document.getElementById("inpuemail").value;
               var salary_text = document.getElementById("inpusalary").value;

               //获取table节点
               var table = document.getElementById("table");

               //创建新的一行的元素所需内容
               var childtr = document.createElement("tr");
               var childtd1 = document.createElement("td");
               var childtd2 = document.createElement("td");
               var childtd3 = document.createElement("td");
               var childtd4 = document.createElement("td");
               var childA = document.createElement("a");

               //要设置节点的属性
               // childtr.innerHTML = "shabi";
               // table.appendChild(childtr);
               table.appendChild(childtr).appendChild(childtd1).innerHTML=name_text;
               table.appendChild(childtr).appendChild(childtd2).innerHTML=email_text;
               table.appendChild(childtr).appendChild(childtd3).innerHTML=salary_text;
               table.appendChild(childtr).appendChild(childtd4).appendChild(childA).innerHTML="delete";

               //首先获取该链接的节点,想要给a添加属性,方法1
               var atribution = document.getElementsByTagName("a");
               // 然后创建该链接的节点属性以及赋值
               // var typ = document.createAttribute("href");
               // typ.nodeValue = "javascript:;";
               atribution[atribution.length-1].setAttribute("href","javascript:;");

               //方法2.两种方法都可以
               // atribution[atribution.length-1].href = "javascript:;";

               var allA = document.getElementsByTagName("a");
               for (let i = 0; i < allA.length; i++) {
                   allA[i].onclick = function () {

                       if (confirm("你确定要删除吗!") === true) {
                           this.parentElement.parentElement.remove();
                      }}}

          })
      };
   </script>
</head>
<body>

<div>
   <table id="table">
       <tr>
           <td>Name</td>
           <td>Email</td>
           <td>Salary</td>
           <td></td>
       </tr>
       <tr>
           <td>Tom</td>
           <td>fjaldf@jflsd</td>
           <td>5000</td>
           <td><a href="javascript:;" >delete</a></td>
       </tr>
       <tr>
           <td>Jerry</td>
           <td>dfaf@fjalfj</td>
           <td>1515</td>
           <td><a href="javascript:;" >delete</a></td>
       </tr>
   </table>

</div>

<div>
   <h1>添加新员工</h1>
   <form action="#" method="get">
       <p>name:<input type="text" name="name" id="inpuname"></p>
<!--       文本框中的内容就是value-->
       <p>email:<input type="email" name="email" id="inpuemail"></p>
       <p>salary:<input type="number" name="salary" id="inpusalary"></p>
       <button id="btn1" type="button">提交</button>
   </form>
   
</div>    

</body>
</html>

image-20220415171007634

增删方法二

这个方法简单很多。。。。。。

//创建新的一行的元素所需内容
var childtr = document.createElement("tr");
childtr.innerHTML = "<td>"+name_text+"</td>"+
"<td>"+email_text+"</td>"+
"<td>"+salary_text+"</td>"+
"<td><a href='javascript:;' >delete</a></td>";

table.appendChild(childtr);

 

替换

replacechild()

 

 

 

8.this

btn[2].onclick =function (){
               alert(this);
               alert(this===btn[2]);
           //   结果是true,所以说明这个this在函数中是
//在事件的响应函数中,响应函数是给谁绑定的,this就是谁
          };btn[1].onclick =function (){
   for (let i = 0; i < 4; i++) {
       ifCheck(0,i);
  }
};
posted @   newlive122  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示