学习完 js 7天之后学 web API 7
提示一下:js 里面字符串使用单引号 html标签中使用双引号 记住
前言:我们呢一起写完了7天的零基础js入门篇,记住以后实际开发中,API跟基础的7天的知识密不可分。静静我呢最近,给大家分享我最近喜欢的几句话。
第一句就是:无关生死,任何事情都是小事,
第二句就比较励志:一定要坚持你所做的事情,哪怕命运无数次给你击倒,至少我们反抗过命运。学习和任何都重在积累。
分享个我的学习方法:我学的方法就是一遍遍的学,一遍遍的看然后理解他们都是什么都混熟就好了,问过,网易,高德的小伙伴你们当时怎么学的代码,他们说就是写没有别的办法。
对了第三句:小富靠勤,中富靠智,大富靠命
正课 1、
webAPI到底是什么?
webAPI到底是什么?
1、课程主要内容
html负责骨架,用于存放页面中需要展示的内容(数据,内容,图片文字等)
css 负责效果,用于美化与布局
js:语言,用于控制 流程 (控制步骤,操作的顺序)
可以用于控制 html的内容与css 的内容,在页面打开后还可以进行操作
webAPI:是一个非常广泛的词,
但是我们现在学习的特指是使用js来操作html 与css的所有方法的总和
2、html 与 DOM结构
我们站在 js 的角度,html 与 css 就是一个字符串,所以我们要操作 html 和css 非常繁琐
例如:更换img 标签中的图片 很繁琐<img src="....jpg">
如果将 html 看成是 字符串,那么操作会很麻烦,我们可以采用 对象的角度来考虑问题
对象的特点: 是一个数据的集合
1>结构清晰,
2>可以避免重复操作
3>键值对
我们的每一个标签,如果看成字符串,要操作属性,就是字符串的,查找,删除,插入等操作 繁琐
如果将每一个标签看成是对象,每一个标签的属性就是对象的属性
那么如果我们想要操作标签的某一个属性,就是可以转换操作对象的属性
如果 img 标签编程一个对象 ,那么 操作属性就可以变成形如
obj.src = 'abcd.jpg';
因此诞生了一个新的观点:DOM的观点
DOM ,文档(document) 对象(object) 模型(model),就是将整个HTML页面看成一个文档对象
页面中所有的标签都看成对象,页面中所有的文本,内容等都是对象
好处:所有的页面都是标签都是 html的子标签
所有的标签之间要么是 兄弟关系,要么是父子关系,所有的标签都是直接或间接的HTML 标签的后代
由于所有的 html 结构都由为一个一个主干 html 延伸出来
首先由head 和body 两个枝丫
然后所有的枝丫就是在他们两个基础上延伸出来,好比一棵树,因此常常将DOM 结构叫做DOM树
3、如何获得页面中的元素
前提:
页面中所有的 东西都是对象,唯独标签被称为元素(element)
所有其他的东西统称为 节点node ,包括标签
解答:因为在html中统称为对象 太宽泛,所有 我们进一步的称呼,标签为元素,html 的结构是树状的,所有我们吧meta 节点 head 和 body 节点 因为我们操作 元素
**重要:**
在页面中要获得元素就得想办法定位元素, id,类名,标签名三种方式
利用:id 获取元素
答:document.getElementById('id') 在页面中将id 为对应值的元素返回
类名获取元素
答:document.getElementByClassName('类名');
将页面中所有使用了,该类样式的 元素取出来,并以伪数组的形式返回
标签名获取元素
利用 标签名 获得元素
document.getElementsByTagName('标签名的字符串')
获得页面中所有的对应标签名的元素 以 伪 数组的形式返回
获取元素的案例 :Demo
<body>
<p id="p1">111</p>
<p id="p2">222</p>
<p id="p3">333</p>
<script type="text/javascript">
// 利用
//可以使用id 来获得元素
// 语法:document.getElementById('id') 解释:通过id来获得元素
// 直接操作这个对象 相当于操作上面的标签
var p1 = document.getElementById('p1');//使用骆驼命名法
console.log(p1); //打印出来是以标签的形式 <p id="p1">111</p>
console.dir(p1); //打印出 对象的形式
var p2 = document.getElementById('p2');
var p3 = document.getElementById('p3');
console.log(p2);
console.log(p3);
</script>
注意: js 语言需要写在 script 标签里面,要是不写在里面就是一段文本
为什么script 标签写在下面呢? 因为浏览器加载 从上往下加载,
利用标签名获取元素 :获得所有的p 标签然后打印出来
<body>
<p>11</p>
<div>22</div>
<p>333</p>
<div>444</div>
<p>555</p>
<script type="text/javascript">
var p = document.getElementsByTagName('p');
console.log(p); //是一个伪数组,无法使用数组方法
for(var i=0; i<p.length;i++){
console.log(p[i]); //三个p标签被打印出来
}
</script>
</body>
第二种形态 :document.getElementByTagName() 来获取
<body>
<p>111</p>
<div id="p1">
<p>222</p>
<p>333</p>
</div>
<div id="p2">
<p>444</p>
<p>555</p>
</div>
<script type="text/javascript">
//获取在某一个元素下的标签的时候 我们需要不使用document 来获取,我们需要使用这个元素
// 使用document 来 获取 id 就是唯一的意思 标签名可以通过docment来获得 也可以通过标签名
var div1 = document.getElementById('p1');
var p1 = div1.getElementsByTagName('p');
for(var i=0; i<p1.length;i++){
console.log(p1[i]);
}
</script>
</body>
使用类名来获取:
<p class="a">111</p>
<div class="b">222</div>
<p class="c">333</p>
<script type="text/javascript">
这里使用的是getElementsByClassName() 获取的 类名
var a = document.getElementsByClassName('a');
for(var i=0; i<a.length;i++){
console.log(a[i]);
}
</script>
实际开发中混合使用:
<body>
<div>
<p class="a">111</p>
<p class="c">333</p>
</div>
<script type="text/javascript">
//这个后面的零是因为是一个伪数组从零开始
var div = document.getElementsByTagName('div')[0];
var p = div.getElementsByClassName('c');
for(var i=0;i<p.length;i++){
console.log(p[i]);
}
</script>
问题:
->节点与元素的关系,节点比元素大
<div></div> 这对标签没有子内容
<div> </div> 这对标签有个空格子内容
在 html 中有很多的 对象 例如 标签, 文本 注释 等等,所有的这些东西统称为节点
在所有的节点种类 中 有一类是标签,我们经常会使用它,将其称为元素,d
问题
元素 跟 节点 一定要想明白
注意:凡是在标签中使用了id属性,那么属性名会成为当前页面全局范围内的一个变量
<body>
<p id="p1">111</p>
<script type="text/javascript">
console.log(p1); //这个p1的标签就是全局变量 会输出 <p id="p1">111</p>
</script>
备注:谨记永远也不要像上面这么写 因为 js 有很多bug
其中有一个特性是 js 没有块级作用域,只有词法作用域,导致在某些函数中无法使用,全局变量等特性
备注: 注意:如果今天你开发的是移动端或者,不考虑低版本浏览器的兼容问题,那么直接使用即可 getElementsByClassName(); IE8不支持哈 问题:学会看文档(MDN)
可以直接利用选择器来获得元素(高级) 常用
document.querySelector('选择器的字符串');
// 在页面中将符合选择器的所有元素中的第0个返回
document.querySelectorAll('选择器的字符串');
// 在页面中将符合选择器的所有元素以维数组的形式返回
选择器(selector)
-》基本选择器:#id,.className,tagName,*
-》复合选择器:子代选择( > ),后代选择器( ' ' )
<body>
<p>111</p>
<div id="dv1">
<p>222</p>
<p>333</p>
</div>
<div id="dv2">
<p>444</p>
<p>555</p>
</div>
<script type="text/javascript">
// 这里使用的是子代选择器,记住后代选择器里面包含了子代选择器
var p = document.querySelectorAll('#dv1 > p');
for(var i=0 ; i<p.length;i++){
console.log(p[i]);
}
</script>
DEMO 案例 两种方法 获取 元素
第一种传统方法
<body>
<ul id="menu">
<li>
<a href="#">练习</a>
<ul>
<li><a href="#">test</a></li>
<li><a href="#">test2</a></li>
</ul>
</li>
<li>
<a href="#">练习2</a>
<ul>
<li><a href="#">test3</a></li>
<li><a href="#">test4</a></li>
</ul>
</li>
</ul>
<script type="text/javascript">
/*
使用传统的方法 获得主菜单的a 标签
可以使用children 来获得元素的子元素
思路:
1、拿到菜单的 容器 menu
2、利用children 来拿到容器中的所有li
3、循环遍历li 找到每一个li中的第0个的子元素children[0];
*/
var menu = document.getElementById('menu');
var li_list = menu.children;
for(var i=0; i<li_list.length; i++){
var li = li_list[i];
var a = li.children[0];
console.log(a);
}
</script>
实际开发中获取元素
<body>
<ul id="menu">
<li>
<a href="#">练习</a>
<ul>
<li><a href="#">test</a></li>
<li><a href="#">test2</a></li>
</ul>
</li>
<li>
<a href="#">练习2</a>
<ul>
<li><a href="#">test3</a></li>
<li><a href="#">test4</a></li>
</ul>
</li>
</ul>
<script type="text/javascript">
//使用选择器
var a_list = document.querySelectorAll('#menu > li > a');
// console.log(a_list);
for(var i=0; i<a_list.length;i++){
console.log(a_list[i]);
}
</script>
复习:
1、html 与DOM 树
解答:html 内容是 html,css js,html用来控制页面里面有什么东西
解答:DOM 树 操作HTML 面向对象的观点来 封装 起来 操作对象 使用.的方法
2、如何去获得页面中的元素
解答:方法来查找
document.getElementById('id')这个方法用id来获取元素 每次只能获取一次
document.getElementByTagName('tagName') 它拿到页面上所有的标签是以伪数组的形式
document.getElementByClassName('tagName')
document.querySelectorAll('选择器');
document.querySelector('选择器')
如何操作属性与样式 重点
操作属性
解答:上面我们讲过把标签当做对象来看,对象的属性操作 只有两种方法,1、读取属性的值,2、给属性赋值
重要对象的操作方式 只有两种:
1、读取属性的值
2、设置属性赋值
在DOM 观点中,页面中的每一个标签都是对象,
我们要读取元素的属性时,直接就是读取对象的属性
我们要设置元素的属性时,直接就是 给对象的属性赋值
<body>
<img src="" alt="">
<!-- 用对象的方式来看待它,src 就是 属性 内容就是值 -->
<script type="text/javascript">
//要设置图片的地址
// 1、获得图片这个元素(对象)
// 2、直接利用属性的赋值语法:对象.属性名 = 值
var imgobj = document.getElementsByTagName('img')[0];
// 使用get 方法 这里面拿的是页面上img构成的一个伪数组,即使元素只有一个也是一个伪数组,所以我们要用方括号0的方式
// 在DOM 观点中所有的标签都是对象,所以你想操作什么属性,就是用.xxx来操作即可
imgobj.src =''
console.log(imgobj);
</script>
</body>
关于路径的描述
我们网站是放在网站上的服务器上,放在文件夹上
所以我们讲讲文件夹层级
文件夹目录路径:
./ 当前目录,点斜杠是当前目录
../ 上层目录,点点斜杠是上层目录
/ 光一个斜杠,表示是根目录,在服务器上表示的是服务器目录
设置 属性操作和 样式操作 class是关键字
1、img 标签自由的属性 width 与height
2、设置img 的行内样式,即img 标签的style 属性中的 width 与 height
3、使用类样式,外部样式,嵌入样式
<img src="" alt="">
<script type="text/javascript">
var img = document.querySelector('img');
img.width = '500'; //使用 html 的属性的时候设置宽高默认的就是像素
img.height = '500'
</script>
class是关键字 要使用 className 谨记重要
<style type="text/css">
body{
background-color: pink;
}
.c{
width: 200px;
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<p>11</p>
<script type="text/javascript">
var p = document.querySelector('p');
// class 在现在的js 中是一个关键字,
p.className = 'c'
</script>
</body>
操作属性使用的是className 而不是class 因为 class 是关键字
几个特殊的属性 inner
innerHTMl
inner表示的是内部的,与之对应的有一个 outer (外)的意思
innerHTML 内部的 html 记住HTML大写
这个属性的作用是 读取 或 设置 标签中的内容(子标签等)
innerText
读取p标签中的文本内容 BytagName() 后面要加[] 数组的索引
<body>
<p>我是一个webAPI</p>
<script type="text/javascript">
/*
第一种方法
var p = document.querySelector('p');
console.log(p.innerHTML);
第二种方法 :这里记住谨记 谨记 要加上 0 零 因为是一个伪数组 不加的化就是 undefined
*/
var p = document.getElementsByTagName('p')[0];
console.log(p.innerHTML);
</script>
</body>
innerHTML 详细DEMO 与解释
<body>
<p>我是webp标签</p>
<p>我是第二个web 标签<b>加粗了</b><i>这里是一个斜体哟</i></p>
<script type="text/javascript">
/*
var p = document.getElementsByTagName('p')[1];
console.log(p.innerHTML); //读取的是内容
*/
// 设置p的内容
var p1 = document.getElementsByTagName('p')[0];
p1.innerHTML = '这是设置后的内容p1';
var p2 = document.getElementsByTagName('p')[1];
p2.innerHTML = '点击<a href="http://www.baidu.com" target="_black">p标签跳转到百度</a>'
/*
innerHTML 可以读取一个标签内的内容,标签内是一个文本以一个字符串形式返回,既有文本又有标签,以字符串形式返回所有东西,如果我们赋值文本,就会替换,赋值时候包含标签,浏览器解析标签以DOM形式展示出来
*/
</script>
在页面中动态生成列表ul >li
<body>
<!--在body中写了一个创建一个id-->
<div id="dv"></div>
<script type="text/javascript">
// 声明一个数组
var arr = ['HTML基础','CSS基础','javaSCript基础','webAPI基础'];
// 核心的内容就是如何拼字符串
// 创建一个 ul
var html = '<ul>';
// 循环数组取出数组中的每一项拼接 li 数据
for(var i=0; i<arr.length; i++){
//使用 li 进行拼接
html+='<li>'+arr[i] +'</li>';
}
html+='</ul>';
// 使用两种方法来获取 id
var dv = document.querySelector('#dv');
var dv1 = document.getElementById('dv');
dv.innerHTML = html;
dv1.innerHTML = html;
</script>
</body>
写法1、
<body>
<div id="box"></div>
</body>
<script type="text/javascript">
var arr = ['HTML基础','CSS基础','javaSCript基础','webAPI基础'];
var html = "<ul>"
for(var i=0; i<arr.length;i++){
html +="<li>" + arr[i] +"</li>";
}
html +="</ul>"
var box = document.getElementById('box');
box.innerHTML = html;
</script>
写法2、
var arr = ['HTML基础','CSS基础','javaSCript基础','webAPI基础',"111"];
var htmlarr = ["<ul>"];
for(var i=0; i<arr.length; i++){
htmlarr.push("<li>"+ arr[i]+"</li>")
}
htmlarr.push("</ul>");
var box = document.getElementsByTagName('div')[0];
box.innerHTML = htmlarr.join("");
写法3、
var arr = ['HTML基础','CSS基础','javaSCript基础','webAPI基础',"111",'222'];
document.getElementById('box').innerHTML = "<ul><li>" + arr.join("</li><li>") + "</li></ul>"
innerText 的区别
表示标签内部的文本
其与innerHTML 的区别是
1、读取的时候忽略标签
2、设置的时候 标签形式的字符串不会被转换成DOM结构,而是转义 (列如> >)
处理行内样式 操作
1、行内样式:直接写在标签中的样式
2、嵌入样式:写在页面中的style 标签中的样式,一般使用的是选择起来定位元素
3、外部样式:独立的利用一个css 文件写到外面,然后利用linck 标签引入css
专一原则,就近原则
<body>
<div id="box" style="width:200px;height: 200px; background-color: pink"></div>
</body>
<script type="text/javascript">
var box = document.querySelector('#box');
var style = box.style;
box.style.backgroundColor = 'red';
box.style.width = '500px';
console.log(style);
</script>
奇 偶 行 隔行变色 案例:DEMO
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
</body>
<script type="text/javascript">
//奇偶 行变色
// 奇数行 红色,偶数行 蓝色
// 1 > 获得所有的li
// 2 > 遍历 li 根据i 来设置背景色
var li = document.getElementsByTagName('li');
for(var i=0; i<li.length;i++){
if(i % 2===0){
// 用户眼中的奇数行
li[i].style.backgroundColor = 'pink';
}else{
// 用户眼中的偶数行
li[i].style.backgroundColor = 'red';
}
// 使用三目运算符 优化代码
li_list[i].style.backgroundColor = i % 2 === 0 ? 'pink' :'red';
// 优化 三目运算 如果 i % 2 为true 就是 red 红色 ? 左面的
li_list[i].style.backgroundColor = i % 2 ?'red' : 'pink';
}
</script>