js基礎(chǔ)day04
一.自定義屬性
- 可以給任何元素自定義一個(gè)屬性使用, 用來保存數(shù)據(jù), 方便使用
- 自定義屬性生命周期 和元素生命周期一樣長(zhǎng)
- 自定義屬性屬性名不能亂起, 要有規(guī)范, 見名知意
<div id="box">
<button id="btn1" >點(diǎn)我啊</button>
<button>點(diǎn)我啊2</button>
<button>點(diǎn)我啊3</button>
<button>點(diǎn)我啊4</button>
</div>
<script>
//1.獲取元素
var box = document.getElementById('box');
var list = box.getElementsByTagName('button');
//2.設(shè)置背景顏色
list[0].style.backgroundColor = 'red';
list[1].className = 'current';
//3.獲取系統(tǒng)提供給我們的屬性
console.log(list[0].id);
console.log(list[1].className);
//4.自定義屬性
//可以給任何元素自定義一個(gè)屬性使用, 用來保存一定數(shù)據(jù), 方便使用
//自定義屬性生命周期 和元素生命周期一樣長(zhǎng)
//自定義屬性屬性名不能亂起, 要有規(guī)范, 見名知意
list[2].index = 2;
list[2].name = '張三';
//獲取自定義屬性的值
console.log(list[2].index);
console.log(list[2].name);
</script>
二.tab切換
<div id="box">
<div id="head">
<button class="current">第1個(gè)按鈕</button>
<button >第2個(gè)按鈕</button>
<button >第3個(gè)按鈕</button>
<button >第4個(gè)按鈕</button>
<button >第5個(gè)按鈕</button>
</div>
<div id="bottom">
<div>第1個(gè)盒子</div>
<div>第2個(gè)盒子</div>
<div>第3個(gè)盒子</div>
<div>第4個(gè)盒子</div>
<div>第5個(gè)盒子</div>
</div>
</div>
<script>
//1.獲取所有按鈕
var head = document.getElementById('head');
var btnList = head.getElementsByTagName('button');
console.log(btnList);
//2.獲取bottom中所有div
var bottom = document.getElementById('bottom');
var divList = bottom.getElementsByTagName('div');
//3.顯示第一個(gè)div
divList[0].style.display = 'block';
//提前自定義屬性保存索引
/* btnList[0].index = 0;
btnList[1].index = 1;
btnList[2].index = 2;
btnList[3].index = 3;
btnList[4].index = 4;*/
//4.遍歷數(shù)組,按鈕添加點(diǎn)擊事件
for(var i = 0;i < btnList.length; i++){
//4.1 獲取每個(gè)按鈕
var btn = btnList[i];
//4.2 自定義屬性, 保存索引
btn.index = i;
//4.3 給按鈕添加事件, 排他思想
btn.onclick = function () {
//先清空所有按鈕
for(var j = 0; j < btnList.length;j++){
btnList[j].className = ''
}
//再對(duì)當(dāng)前被點(diǎn)擊按鈕單獨(dú)設(shè)置
// btn.className = 'current';
this.className = 'current';
//------------------
//點(diǎn)擊第i個(gè)按鈕,顯示第i個(gè)盒子,其他盒子隱藏
//排他思想:先清空所有盒子display
for(var a = 0; a < divList.length; a++ ){
divList[a].style.display = 'none';
}
//console.log(i);
//取出當(dāng)前對(duì)應(yīng)i個(gè)按鈕的盒子
//this.index 獲取的是相應(yīng)當(dāng)前事件按鈕的索引
console.log(this.index);
var div = divList[this.index];
//單獨(dú)設(shè)置對(duì)應(yīng)當(dāng)前第i個(gè)按鈕,第i個(gè)盒子
div.style.display = 'block'
}
}
</script>

三.數(shù)組常用方法
1.concat() 連接兩個(gè)或更多的數(shù)組,并返回結(jié)果。
- concat(arrayX,arrayX,......,arrayX)
- 函數(shù)功能 合并數(shù)組, 在原來數(shù)組基礎(chǔ)上添加新數(shù)組的內(nèi)容
- 參數(shù): 必需, 該參數(shù)可以是具體的值,也可以是數(shù)組對(duì)象??梢允侨我舛鄠€(gè)。
- 返回值: 合并后的新數(shù)組
- 不修改原來數(shù)組
var arr2 = ['香蕉', '蘋果', '橘子'];
var arr3 = ['茄子', '黃瓜', '胡蘿卜'];
var item = arr.concat(arr2, '科長(zhǎng)');
console.log(item);
console.log(arr); //原來數(shù)組
2.join() 把數(shù)組的所有元素放入一個(gè)字符串。元素通過指定的分隔符進(jìn)行分隔。
- 函數(shù)功能: 將數(shù)組中的字符串取出, 拼接成一個(gè)大的字符串
- 參數(shù):separator 可選。指定要使用的分隔符。如果省略該參數(shù),則使用逗號(hào)作為分隔符。
- 返回值: 返回一個(gè)字符串
- 不修改原來數(shù)組
var item = arr.join("*");
console.log(item, typeof item);
console.log(arr);
3.pop() 刪除并返回?cái)?shù)組的最后一個(gè)元素
- 參數(shù): 沒有
- 返回值: 返回刪除的最后元素
- 會(huì)修改原數(shù)組
- pop() 方法將刪除 數(shù)組 的最后一個(gè)元素,把數(shù)組長(zhǎng)度減 1,并且返回它刪除的元素的值。如果數(shù)組已經(jīng)為空,則 pop() 不改變數(shù)組,并返回 undefined 值。
var item = arr.pop();
console.log(item);
console.log(arr);
4.push() 向數(shù)組的末尾添加一個(gè)或更多元素,并返回新的長(zhǎng)度。
- push(newelement1,newelement2,....,newelementX)
- 參數(shù): 至少有一個(gè)元素, 參數(shù)可以是多個(gè)
- 返回值: 返回添加元素后數(shù)組的長(zhǎng)度
- 會(huì)修改原數(shù)組
var arr2 = ['香蕉', '蘋果', '橘子'];
var item = arr.push(arr2);
console.log(item);
console.log(arr);
5.reverse() 顛倒數(shù)組中元素的順序。
- 參數(shù):沒有
- 返回值: 返回修改后的數(shù)組
- 會(huì)修改原數(shù)組
var item = arr.reverse();
console.log(item);
console.log(arr);
6.shift() 刪除并返回?cái)?shù)組的第一個(gè)元素
- 參數(shù):沒有
- 返回值: 返回刪除的第一個(gè)元素
- 會(huì)修改原數(shù)組
var item = arr.shift();
console.log(item);
console.log(arr);
7.unshift() 向數(shù)組的開頭添加一個(gè)或更多元素,并返回新的長(zhǎng)度
- unshift(newelement1,newelement2,....,newelementX)
- 參數(shù): 必需, 至少有一個(gè)元素, 參數(shù)可以有多個(gè)
- 返回值: 返回?cái)?shù)組長(zhǎng)度
- 會(huì)修改原數(shù)組
var arr2 = ['香蕉', '蘋果', '橘子'];
var item= arr.unshift(arr2);
console.log(item);
console.log(arr);
8.slice() 從某個(gè)已有的數(shù)組返回選定的元素
- slice(start,end)
- 函數(shù)功能:從數(shù)組中獲取某一段連續(xù)的元素, 并保存到一個(gè)新數(shù)組中返回
- 參數(shù):start 必需 從哪開始取, 包括該索引
- 參數(shù): end 可選, 取到哪個(gè)索引為止 , 不包括該索引
- 返回值: 一個(gè)新數(shù)組
- 不修改原數(shù)組
//var item = arr.slice(1, 3);
var item = arr.slice(1);
console.log(item);
console.log(arr);
9.splice() 刪除元素,并向數(shù)組添加新元素。
- splice(index,howmany,item1,.....,itemX)
- 參數(shù): index 必需。整數(shù) , 從哪個(gè)索引開始刪
- 參數(shù):howmany 必需, 刪除多少個(gè)元素
- 參數(shù): items. 可選, 原來刪除位置上,添加的元素 (替換方法)
- 返回值: 返回一個(gè)保存刪除元素的新數(shù)組
- 會(huì)修改原數(shù)組
var item = arr.splice(1, 2);
var arr2 = ['香蕉', '蘋果', '橘子'];
var item = arr.splice(1, 2, arr2);
console.log(item);
console.log(arr);
10.toString() 把數(shù)組轉(zhuǎn)換為字符串,并返回結(jié)果
- 參數(shù):沒有
- 返回值: 返回的是拼接后的字符串
- 不修改原數(shù)組
- 注意:返回值與沒有參數(shù)的 join() 方法返回的字符串相同。
var item = arr.toString();
console.log(item, typeof item);
console.log(arr);
11.sort() 對(duì)數(shù)組的元素進(jìn)行排序(了解)
- 參數(shù):必須是函數(shù)
var tempArr = [10, 2, 5, 8, 3, 9];
//升序
tempArr.sort(function (a , b) {
return a - b;
});
console.log(tempArr);
//降序
tempArr.sort(function (a , b) {
return b - a;
});
console.log(tempArr);

四.字符串常用方法
h e l l o w o r l d
0 1 2 3 4 5 6 7 8 9 10
var str = 'hello world'; // 'he*ll*o *world'
1.length 獲取字符串長(zhǎng)度
console.log(str.length);
2.charAt() 返回在指定位置的字符
- charAt(index)
- 參數(shù):index 某個(gè)字符位置
- 返回值: 找到的字符
console.log(str.charAt(6));
3.charCodeAt() 返回在指定的位置的字符的 Unicode 編碼。
- 參數(shù):index 某個(gè)字符位置
- 返回值: 找到的字符的Unicode 編碼。
console.log(str.charCodeAt(10));
4.concat() 連接字符串。
- concat(stringX,stringX,...,stringX)
- 參數(shù): 必需.需要合并的字符串, 至少有一個(gè)
- 返回合并后字符串
- 不修改原來字符串
var item = str.concat('科長(zhǎng)');
console.log(item);
console.log(str);
5.indexOf() 檢索字符串。
- indexOf(searchvalue,fromindex)
- 參數(shù): searchvalue 必需. 檢索的字符
- 參數(shù): fromindex 可選. 從哪里開始檢索, 從哪個(gè)索引開始檢索, 如果省略,會(huì)從頭開始搜索
- 返回值: 返回檢索字符的索引值
- 注意: 默認(rèn)從前往后檢索字符, 找到一個(gè)匹配的字符就停止繼續(xù)往下檢索, 如果沒有找到匹配字符就返回-1
- 不修改原來字符串
// var item = str.indexOf('o', 5);
var item = str.indexOf('a'); //檢索不存在字符
console.log(item);
console.log(str);*/
6.lastIndexOf() 從后向前搜索字符串。
- 參數(shù): searchvalue 必需. 檢索的字符
- 參數(shù): fromindex 可選. 從哪里開始檢索, 從哪個(gè)索引開始檢索, 如果省略,會(huì)從尾部開始搜索
- 返回值: 返回檢索字符的索引值
- 注意: 默認(rèn)從后往前檢索字符, 找到一個(gè)匹配的字符就停止繼續(xù)往下檢索, 如果沒有找到匹配字符就返回-1
- 不修改原來字符串
// var item = str.lastIndexOf('o');
var item = str.lastIndexOf('a');
console.log(item);
console.log(str);
7.slice() 提取字符串的片斷,并在新的字符串中返回被提取的部分。
- slice(start,end)
- 參數(shù):end 必需. 截取的哪個(gè)索引為止, 不包含該字符
- 返回值:一個(gè)新的字符串。包括字符串 stringObject 從 start 開始(包括 start)到 end 結(jié)束(不包括 end)為止的所有字符
- 不修改原來字符串
- start 值為-2, 代表從最后一個(gè)開始截取字符
var item = str.slice(4, 7);
console.log(item);
console.log(str);
8.substr() 從起始索引號(hào)提取字符串中指定數(shù)目的字符。
- substr(start,length)
- 參數(shù):start 必需. 從哪個(gè)索引開始提取字符, 包含該索引字符
- 參數(shù):length 可選.獲取多少個(gè)字符
- 返回值: 一個(gè)新的字符串,包含從 stringObject 的 start(包括 start 所指的字符) 處開始的 length 個(gè)字符
- 注意:如果沒有指定 length,那么返回的字符串包含從 start 到 stringObject 的結(jié)尾的字符。
- 不修改原來字符串
var item = str.substr(2, 4);
console.log(item);
console.log(str);
9.substring() 提取字符串中兩個(gè)指定的索引號(hào)之間的字符。
- substring(start,stop)
- 參數(shù):start , 必需, 一個(gè)非負(fù)的整數(shù), 從哪個(gè)索引開始提取字符, 包含該索引字符
- 參數(shù):stop , 可選 ,一個(gè)非負(fù)的整數(shù), 提取到哪個(gè)索引為止, 不包含該索引字符
- 返回值: 提取字符串
- 不修改原來字符串
var item = str.substring(2, 4);
console.log(item);
console.log(str);
10.split() 把字符串分割為字符串?dāng)?shù)組。
- split(separator,howmany)
- 參數(shù): separator 必需. 分隔符
- 參數(shù): howmany 可選. 指定返回的數(shù)組的最大長(zhǎng)度
- 返回值: 保存分隔后字符的數(shù)組
- 如果是空字符串 ("") 用作 separator,那么字符串中的每個(gè)字符都會(huì)被分割,保存到數(shù)組中
// var item = str.split('');
var item = str.split(' ');
console.log(item);
console.log(str);
11.toLowerCase() 把字符串轉(zhuǎn)換為小寫
- 返回值: 返回轉(zhuǎn)換后的一個(gè)新的字符串
- 不會(huì)修改原來字符串
var str10 = 'NIKE';
var item = str10.toLowerCase();
console.log(item);
console.log(str10);
12.toUpperCase() 把字符串轉(zhuǎn)換為大寫
- 返回值: 返回轉(zhuǎn)換后的一個(gè)新的字符串
- 不會(huì)修改原來字符串
var str11 = 'nike';
var item = str11.toUpperCase();
console.log(item);
console.log(str11);

五.判斷上傳文件類型
- onchange 用戶改變域內(nèi)容,觸發(fā)該事件
- 點(diǎn)擊input獲取文件, 只有獲取的文件不是同一文件, 就會(huì)觸發(fā)這個(gè)onchange, 判斷的就是文件路徑
- 如果路徑一樣就不響應(yīng), 如果不一樣才會(huì)響應(yīng)事件
<input id="inputFile" type="file">
<script>
//1.獲取標(biāo)簽
var inputFile = document.getElementById('inputFile');
//2.添加事件
inputFile.onchange = function () {
//2.1 獲取路徑
var path = inputFile.value;
console.log(path, typeof path);
//C:\fakepath\GameofThrones.jpg
//2.2 獲取索引
var index = path.lastIndexOf('.');
//2.3 截取后綴
var str = path.slice(index + 1).toLowerCase();
//2.4 判斷類型是不是圖片, jpg png gif jpeg
if(str === 'jpg' || str ==='png'|| str ==='gif' || str ==='jpeg'){
alert('上傳的是圖片文件')
}else{
alert('上傳的不是圖片,請(qǐng)?jiān)俅紊蟼?);
return;
}
}
</script>
六.定時(shí)器
- 定時(shí)器: 以時(shí)間的事件來執(zhí)行代碼
- 定時(shí)器分為兩種: 一次定時(shí)器(延時(shí)定時(shí)器), 間隔定時(shí)器(循環(huán)定時(shí)器)
- 開啟定時(shí)器方法屬于window對(duì)象的對(duì)象方法
1.延時(shí)定時(shí)器
setTimeout(code,millisec) 在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。
-
參數(shù):
- code 必需, 定時(shí)器一段時(shí)間后,調(diào)用的函數(shù)
- millisec 必需, 延時(shí)時(shí)間, 單位:毫秒
- 返回值: 返回一個(gè)標(biāo)識(shí)id
clearTimeout() 清除由setTimeout() 創(chuàng)建的定時(shí)器
參數(shù):接收setTimeout()返回的標(biāo)識(shí)id, 根據(jù)標(biāo)識(shí)id清除對(duì)應(yīng)定時(shí)器
function fn() {
alert('執(zhí)行了定時(shí)器')
}
//開啟定時(shí)器
var timer = setTimeout(fn, 2000);
console.log(timer);
//注意:使用完定時(shí)器后,一定要清除定時(shí)器
//清除延時(shí)定時(shí)器
clearTimeout(timer);
2.循環(huán)定時(shí)器
- setInterval(code, millisec) 按照指定的周期(以毫秒計(jì))來調(diào)用函數(shù)或計(jì)算表達(dá)式。
- 以一定時(shí)間間隔反復(fù)執(zhí)行一段代碼
- 參數(shù):code: 定時(shí)器一段時(shí)間后執(zhí)行調(diào)用的函數(shù)
- millisec: 間隔時(shí)間, 單位:毫秒
- 返回值: 返回一個(gè)標(biāo)識(shí)id
var num = 0;
//定時(shí)器使用最終格式
var timer2 = setInterval(function () {
num++;
console.log(num);
}, 1000);
//clearInterval() 取消由 setInterval() 設(shè)置的 timeout。
//1.獲取按鈕
var btn = document.getElementById('btn');
//2.給按鈕添加點(diǎn)擊事件
btn.onclick = function () {
//清空循環(huán)定時(shí)器
clearInterval(timer2);
}
七.勻速動(dòng)畫
- 問題: 連續(xù)點(diǎn)擊觸發(fā)事件, 發(fā)現(xiàn)box 速度越來越快
- 原因: 每次點(diǎn)擊,觸發(fā)事件執(zhí)行代碼, 都會(huì)開啟一個(gè)新的定時(shí)器, 所有定時(shí)器都在對(duì)偏移量累加
- 解決: 每次點(diǎn)擊, 清空上一次的定時(shí)器
//1.獲取按鈕
var btn = document.getElementById('btn');
//2.獲取box
var box = document.getElementById('box');
//定義一個(gè)偏移量,記錄偏移距離
var offsetX = 0;
//定義一個(gè)全局變量,保存定時(shí)器標(biāo)識(shí)
var timer = null;
//目標(biāo)距離
var targer = 800;
//3.按鈕添加時(shí)間
btn.onclick = function () {
//3.1 清空上次定時(shí)器
clearInterval(timer);
//開啟定時(shí)器
timer = setInterval(function () {
//累加偏移量
offsetX += 10;
//判斷是否到達(dá)目標(biāo)距離
if(offsetX >= targer){
//偏移量等于目標(biāo)距離
offsetX = targer;
//清空定時(shí)器
//clearInterval(timer);
}
//設(shè)置box的left
box.style.left = offsetX + 'px';
}, 30);
}
- 減速公式 = 累加量 + (目標(biāo)值- 累加量) / 系數(shù)
offsetX = offsetX + (targerX - offsetX) /10;
box.style.left = offsetX + 'px';
八.長(zhǎng)圖展示
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
#box{
width: 640px;
height: 400px;
border: 1px solid #000;
margin: 100px auto;
position: relative;
overflow: hidden;
}
#box span{
width: 100%;
height: 50%;
position: absolute;
}
#box span:nth-of-type(1){
top:0;
/*background-color: red;*/
}
#box span:nth-of-type(2){
top:50%;
/*background-color: blue;*/
}
#box img{
position: absolute;
}
</style>
</head>
<body>
<div id="box">
<img id="pic" src="images/girl.jpg" alt="">
<span></span>
<span></span>
</div>
<script>
//1.獲取圖片
var pic = document.getElementById('pic')
//2.獲取span
var list = document.getElementById('box').getElementsByTagName('span')
//偏移量
var offsetY = 0;
//定時(shí)器
var timer = null;
//3.添加事件
//上邊span, 鼠標(biāo)再上邊, 圖片往下走
list[0].onmouseover = function () {
//清空上次定時(shí)器
clearInterval(timer);
//開啟定時(shí)器
timer = setInterval(function () {
//累加偏移量
offsetY += 5;
//判斷是否走到了圖片最上邊
if(offsetY >=0 ){
//重新設(shè)置偏移量
offsetY = 0
//清空計(jì)時(shí)器
clearInterval(timer);
}
// 根據(jù)偏移量, 重新設(shè)置top
pic.style.top = offsetY + 'px'
},10);
}
//下邊span, 鼠標(biāo)再下邊, 圖片往上走
list[1].onmouseover = function () {
//清空上次定時(shí)器
clearInterval(timer);
//開啟定時(shí)器
timer = setInterval(function () {
//累減偏移量
offsetY -= 5;
//判斷是否走到了圖片最下邊
if(offsetY <=-505 ){
//重新設(shè)置偏移量
offsetY = -505
//清空定時(shí)器
clearInterval(timer);
}
// 根據(jù)偏移量, 重新設(shè)置top
pic.style.top = offsetY + 'px'
},10);
}
</script>