前端 javascript 練習(xí)題

前端

javascript

練習(xí)題

函數(shù)

1.編寫任意個(gè)數(shù)字的求和、差蜂莉、積蜡娶、商的函數(shù)

思路分析:首先求任意個(gè)數(shù),因此需要一個(gè)能夠獲取函數(shù)傳遞參數(shù)個(gè)數(shù)及值的形參:arguments映穗,方法不一窖张,思路僅供參考

function f1(){
    var sum=arguments[0],   //將第一個(gè)數(shù)符初值分別給這幾個(gè)變量
            cha=arguments[0],
            ji=arguments[0],
            shang=arguments[0];
    for(var i=1;i<arguments.length;i++){   //用arguments獲取用戶傳入的參數(shù)
    sum=sum+arguments[i];
        cha=cha-arguments[i];
        ji=ji*arguments[i];
        shang=shang/arguments[i];
    }
    console.log("he"+sum+"cha"+cha+"ji"+ji+"shang"+shang);
}
f1(1,2,3,4);
2.編寫一個(gè)函數(shù),計(jì)算任意兩個(gè)數(shù)字之間所能組成的奇數(shù)個(gè)數(shù)蚁滋,數(shù)字必須是個(gè)位數(shù)比如: 計(jì)算0-3之間能組成的奇數(shù)個(gè)是01宿接、21、03辕录、13睦霎、23、31

思路分析:兩個(gè)數(shù)字任意組合走诞,先判斷是否是奇數(shù)副女,然后再排除個(gè)位和十位相同的數(shù)即可
方法:

function f3(x,y){
     var count=0;
     for(var i=x;i<=y;i++){  //x和y之間的數(shù)任意組合
         for(var j=x;j<=y;j++){ 
           var str=Number(i+""+j);  //將x和y拼接組成2位的數(shù)再轉(zhuǎn)化為2位的數(shù)字
             if(str%2!=0&&i!=j){
                 console.log(i+""+j);
                 count++;
             }
         }
     }
     console.log(count);
 }
 f3(0,3);
求斐波那契數(shù)列

1、1蚣旱、2碑幅、3戴陡、5、8沟涨、13恤批、21、34裹赴、55……F(0)=0喜庞,F(xiàn)(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

方法:

function f6(n){ //求斐波那契數(shù)列
    var a1=1;
    var a2=1;
    for(var i=3;i<=n;i++){
        var an=a1+a2;  //每一項(xiàng)等于前兩項(xiàng)的和
        a1=a2;   //每次循環(huán)改變a1和a2使其指向下一次的前兩項(xiàng)
        a2=an;
    }
    return an;
}
console.log(f6(5));

2篮昧、//遞歸求斐波那契數(shù)列

function getFib(x){
   if(x==1||x=2){
       return 1;
    }
    return getFib(x-1)+getFib(x-2);
}
console.log(getFib(12));
數(shù)組

1.數(shù)組的選擇排序,冒泡排序
冒泡排序: 思路在代碼中進(jìn)行了注釋赋荆,可以根據(jù)注釋參照思路

var arr3=[1,5,2,6,3,3];

function f4(arr){   //冒泡排序(以從小到大為例)
    for(var i=0;i<arr.length-1;i++){ //控制比較的輪數(shù)
        for(var j=0;j<arr.length-1-i;j++){ //內(nèi)層每輪比較的次數(shù)
            if(arr[j]>arr[j+1]){  
                var temp=arr[j];  //交換這兩個(gè)值的位置
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    return arr;
}
console.log(f4(arr3));

選擇排序:

function f4(arr){ //選擇排序
    //用這個(gè)數(shù)分別和別的數(shù)相比較笋妥,改變的是索引的位置懊昨,每輪結(jié)束后才交換為位置
    for(var i=0;i<arr.length-1;i++){  //控制外層比較的輪數(shù)
        var minIndex=i;  //先假定一個(gè)最小值,定義變量minIndex指向該值的索引
        for(var j=i+1;j<arr.length;j++){
            if(arr[minIndex]>arr[j]){
                minIndex=j;  //改變最小索引的指向
            }
        }
        var temp=arr[i];   //每輪比較結(jié)束春宣,將最初假定的最小值和實(shí)際最小值交換
        arr[i]=arr[minIndex];
        arr[minIndex]=temp;
    }
    return arr;  //將排序后的數(shù)組返回
}
console.log(f4(arr3));

2.判斷數(shù)組中是否存在某個(gè)元素酵颁,返回布爾類型
思路分析:判斷是否存在某個(gè)值,也可以使用indexOf等數(shù)組的方法
方法:列舉一種普通的

var arr1=[1,4,3,6];

function f2(arr,x){
      for(var i=0;i<arr.length;i++){
          if(arr[i]==x){
              return true;
          }
      }
      return false;
  }

console.log(f2(arr1,4));

3.編寫函數(shù)將數(shù)組元素去重
方法1:推薦使用 (數(shù)組和對象結(jié)合的方式去重)

var arr1=[1,3,6,6,6,4];

function f3(arr){  //利用數(shù)組和對象結(jié)合的方式去重
    var newArr=[];
    var obj={};
    for(var i=0;i<arr.length;i++){
        //把數(shù)組中的元素當(dāng)成對象的屬性
        if(obj[arr[i]]==undefined){  //如果第一次出現(xiàn)會(huì)得到undefined
            newArr.push(arr[i]);  //將第一次出現(xiàn)的值加入到新數(shù)組中
            obj[arr[i]]=1;  //給obj對象的屬性賦值月帝,使其重復(fù)的值得到的結(jié)果不為undefined
        }
    }
    return newArr;
}
console.log(f3(arr1));

方法2:(索引值比較躏惋,需要注意的是,截取以后數(shù)組長度也發(fā)生了變化嚷辅,因此數(shù)組長度需要 -1)

function noRepeat(arr){
    for(var i=0;i<arr.length;i++){ //控制外層循環(huán)
        for(var j=i+1;j<arr.length;j++){ //控制內(nèi)層
            if(arr[i]==arr[j]){
                arr.splice(j,1); //從數(shù)組中刪除元素簿姨,此時(shí)數(shù)組發(fā)生改變
                j--;  //此時(shí)原數(shù)組的索引都向前減了1,因此j--z再去比較一次
            }
        }
    }
    return arr;
}
console.log(noRepeat(arr1));

4.輸入一個(gè)數(shù)簸搞,并按原來的規(guī)律將它插入數(shù)組中
思路分析:可以先進(jìn)行判斷是從大到小扁位,還是從小到大,然后將數(shù)據(jù)進(jìn)入插入

var arr2=[1,3,4,5]趁俊;

function f4(arr,x){
    if(arr[0]>arr[arr.length-1]){
        arr.push(x);  //將傳入的參數(shù)加入到數(shù)組中
        arr.sort(function(a,b){ //調(diào)用sort對數(shù)組中的元素排序
            return b-a;  //從大到小
        })
    }else {
        arr.push(x);
        arr.sort(function (a,b){
            return a-b;  //從小到大
        })
    }
    return arr;
}
console.log(f4(arr1,0));

5.定義一個(gè)含有30個(gè)整型元素的數(shù)組域仇,按順序分別賦予從2開始的偶數(shù);然后按順序每五個(gè)數(shù)求出一個(gè)平均值寺擂,放在另一個(gè)數(shù)組中并輸出
方法:

function f1(){
    var arr1=[];  //用來存放最開始的這些數(shù)字
    var arr2=[];  //用來存放平均值
    var sum=0;
        for(var i=0;i<30;i++){
            arr1[i]=(i+1)*2;
            sum+=arr1[i];
            if((i+1)%5==0){
                arr2.push(sum/5);
                sum=0;  //每求一次平均值暇务,sum要進(jìn)行清零
            }
        }
    console.log(arr2);
}
    f1();

6.隨機(jī)點(diǎn)名程序
思路分析:使用math.random()產(chǎn)生0~1之間的隨機(jī)數(shù),然后根據(jù)索引得到具體值
方法:將人名放入數(shù)組中怔软,生成數(shù)組的隨機(jī)索引值垦细,從而得到對應(yīng)的人名

btn.onclick=function (){
        var arr=["張三","李四","王二","張明","李天","王大","崔勇"];
        var num1 =Math.floor(Math.random()*arr.length);
        var na=arr[num1];
        console.log(na);
}
String

1.密碼強(qiáng)度 假設(shè)只有大、小寫字母及數(shù)字
思路分析:可以使用正則表達(dá)式(相對簡單)挡逼,也可以根據(jù)ASCII碼

方法:

var str1 = "123agfdAB";
function f5(str) {
    var flag1 = false, //因?yàn)橐袛喽鄠€(gè)分支是否都含有括改,所以定義多個(gè)flag去判斷
            flag2 = false,
            flag3 = false;
    for (var i = 0; i < str.length; i++) {
        var code = str.charCodeAt(i);
        if (48 <= code && code <= 57) {   //數(shù)字的ASCII碼
            flag1 = true;
        }
        if (65 <= code && code <= 90) {  //大寫字母的ASCII碼
            flag2 = true;
        }
        if (97 <= code && code <= 122) {  //小寫字母的ASCII碼
            flag3 = true;
        }
    }
    if (flag1 && flag2 && flag3) {  //根據(jù)flag的值去判斷包含幾個(gè)分支
        console.log("強(qiáng)");
    } else if (flag1 && flag2 || flag1 && flag3 || flag2 && flag3) {
        console.log("中");
    } else {
        console.log("低");
    }
}
f5(str1);

2.數(shù)字字母混合驗(yàn)證碼

方法1: 利用字符串中的值隨機(jī)組合生成

var  str="123456789ABCDEFGHIG";
 function yan(str){
     var str1="";
         for(var i=0;i<4;i++){
             var s =Math.floor(Math.random()*str.length);
             var str1=str1+str[s];
         }
     console.log(str1);
 }
 yan(str);

方法2:利用ASCII碼

function yan(){
    var str="";
    while(str.length<4){  //當(dāng)str的長度不滿足重復(fù)執(zhí)行-------生成4位的字符串
        var sCode =Math.floor(Math.random()*(90-48+1)+48);//得到的是數(shù)字到大寫字母的ASCII 值
        //判斷ASCII碼的值在數(shù)字和字母之間
        if(48<=sCode&&sCode<=57||65<=sCode&&sCode<=90){
            var str=str+String.fromCharCode(sCode);  //將隨機(jī)值進(jìn)行拼接
        }
    }
    console.log(str);
}
yan();

3.已知字符串“a,a,b,c,c,d”,統(tǒng)計(jì)每個(gè)字符出現(xiàn)的次數(shù)挚瘟,結(jié)果顯示 a 2叹谁、b 1饲梭、c 2、d1焰檩,去掉重復(fù)的字符憔涉,使結(jié)果顯示 abcd
方法: 利用數(shù)組和對象結(jié)合的方式,把數(shù)組元素作為對象的屬性

var str = "a,a,b,c,c,d";
function f1(str) {
    var arr = str.split(",");  //split返回的是分割后的數(shù)組
    var obj = {};  //用來存放數(shù)組中的元素
    for (var i = 0; i < arr.length; i++) {
        if (obj[arr[i]] == undefined) {
            obj[arr[i]] = 1;  //用1這個(gè)值去表示第一次出現(xiàn)
        } else {
            obj[arr[i]] = obj[arr[i]] + 1;  //出現(xiàn)的次數(shù)
        }
    }
    var s = "";  //讓obj的屬性進(jìn)行拼接
    for (var i in obj) {
        s += i;
        document.write(i + obj[i] + "&nbsp;");
    }
    document.write(s);   //輸出屬性拼接后的值
}
f1(str);

留言過濾 :將字符串中指定的字符或字符串替換

var str=“1455-95098888”;

方法1: 替換單個(gè)字符析苫,可以利用字符串的索引對應(yīng)的值進(jìn)行比較 (charAt同)

function f6(str){
    for(var i=0;i<str.length;i++){
        if(str[i]=="5"){
            str=str.replace("5","*");  //返回替換后的字符串兜叨,所以需要定義變量去接收返回的新的字符串
        }
    }
    return str;
}
console.log(f6(str));

方法2: 替換一串,可以用indexOf 衩侥,沒有這個(gè)字符串国旷,返回的結(jié)果為-1

function f7(str){
    for(var i=0;i<str.length;i++){
        if(str.indexOf("55")!=-1){
            str=str.replace("55","*");  //返回替換后的字符串,所以需要定義變量去接收返回的新的字符串
        }
    }
    return str;
}
console.log(f7(str));

方法3: 替換一串茫死,可以用substr跪但,截取字符串進(jìn)行比較,相同再替換

function f8(str){
    for(var i=0;i<str.length;i++){
        if(str.substr(i,3)=="888"){
            str=str.replace("888","*");  //返回替換后的字符串峦萎,所以需要定義變量去接收返回的新的字符串
        }
    }
    return str;
}
console.log(f8(str));
Math 對象

1.編寫一個(gè)函數(shù)屡久,獲得一個(gè)十六進(jìn)制的隨機(jī)顏色的字符串(例如:#20CD4F)
方法:

function f2(){
    var str="0123456789abcdef";
    var color="#";
    for(var i=0;i<6;i++){
        var num=Math.floor(Math.random()*str.length);
        color=color+str[num];
    }
    console.log(color);
}
f2();
date對象

數(shù)碼時(shí)鐘
思路分析:將時(shí)分秒的圖片,按照一定規(guī)則命名爱榔,方便后續(xù)根據(jù)時(shí)間設(shè)置圖片路徑

方法:

<div id="pic">
    <img src="img/0.png" alt="" />
    <img src="img/0.png" alt="" />
    <span>時(shí)</span>
    <img src="img/0.png" alt="" />
    <img src="img/0.png" alt="" />
    <span>分</span>
    <img src="img/0.png" alt="" />
    <img src="img/0.png" alt="" />
    <span>秒</span>
</div>

<script>
    function f1(){
        var str="";
        //通過標(biāo)簽獲取所有的圖片存放在變量imgid中
        var imgid=document.getElementsByTagName("img");
        var oDate = new Date(); //創(chuàng)建時(shí)間對象
        var h=oDate.getHours();  //分別去獲取當(dāng)前的時(shí)分秒
        var fen=oDate.getMinutes();
        var miao= oDate.getSeconds();
        var h1=h>=10?h:"0"+h;  //保證都是由2位組成
        var fen1=fen>=10?fen:"0"+fen;
        var miao1=miao>=10?miao:"0"+miao;
        str=str+h1+fen1+miao1;  //組合成一個(gè)新的字符串
        for(var i=0;i<str.length;i++){  //遍歷字符串
            //類比src="img/0.png";
            imgid[i].src='img/'+str[i]+'.png'; //設(shè)置每個(gè)圖片的src路徑
        }
    }
    setInterval(f1,1000);  //定時(shí)器  后一個(gè)參數(shù)以毫秒為單位
函數(shù)的封裝

封裝方法:將函數(shù)作為對象的參數(shù)

eg1:.判斷某年份是否為閏年被环,將日期格式化輸出 “2015|08|24”,獲得某個(gè)月份的天數(shù)详幽,判斷兩個(gè)日期相差的天數(shù)筛欢,獲得N天以后的日期

var dateUtil = {
   isLeapYear:function(year){
      if(year%4==0&&year%100!=0 || year%400==0){
         return true;
      }
      return false;
   },
   formatDate:function(date,str){
      var year = date.getFullYear();
      var month = date.getMonth()+1;
      var day = date.getDate();
      if(month < 10){
         month = "0"+month;
      }
      if(day < 10){
         day = "0" + day;
      }
      var ss = year+str+month+str+day
      return ss;
   },
   getDays:function(date){
      var year = date.getFullYear();
      var month = date.getMonth()+1;
      switch(month){
         case 2:
            if(dateUtil.isLeapYear(year)){
               return 29;
            }
            return 28;
            break;
         case 4:
         case 6:
         case 9:
         case 11:
            return 30;
            break;
         default:
            return 31;
      }
   },
   getDiffDays:function(date1,date2){
      //兩個(gè)日期相減會(huì)得到一個(gè)相差的毫秒數(shù)
      //相差的天時(shí)分秒
      var ss = Math.abs((date2-date1)/1000);
      var day = Math.floor(ss/24/3600);
      var hour = Math.floor(ss/3600%24);
      var minute = Math.floor(ss/60%60);
      var second = Math.floor(ss%60);
      return day+"天"+hour+"時(shí)"+minute+"分"+second+"秒";
   },
   getNDays:function(n){
      var oDate = new Date();
      oDate.setDate(oDate.getDate()+n);
      return oDate;
   }
};
DOM和BOM

創(chuàng)建表格,添加刪除操作
介紹:這是用基本的方式唇聘,更便捷的方法是版姑,使用es6提供的模板字符串,代碼和效率能提高很多
簡單的樣式:

a <input type="text"/>
b <input type="text"/>
c <input type="text"/>
<input type="button" value="添加"/>
<table></table>

js實(shí)現(xiàn)代碼:

var oinput=document.getElementsByTagName("input");
var otable=document.getElementsByTagName("table")[0];
oinput[oinput.length-1].onclick=function(){
    var otr=document.createElement("tr");
    //創(chuàng)建單元格雳灾,并且將文本的值加到單元格里
    for(var i=0;i<oinput.length-1;i++){
        var otd=document.createElement("td");
        otd.innerHTML=oinput[i].value;
        otr.appendChild(otd);
    }
    //添加刪除按鈕漠酿,并加入到單元格中
    var otd = document.createElement("td");
        var oSpan = document.createElement("span");
        oSpan.innerHTML = "刪除";
        otd.appendChild(oSpan);
        otr.appendChild(otd);
        oSpan.onclick = function(){
            //oTable.removeChild(oTr);
            otable.removeChild(this.parentNode.parentNode);
        }
    otable.appendChild(otr);
}

進(jìn)度條
html排版樣式:

<div class="progressBar">
    <p style=""></p>
</div>
<div class="progressBar">
    <p></p>
</div>
<div class="progressBar">
    <p></p>
</div>

js執(zhí)行代碼:

var opp=document.getElementsByTagName("p");
function progress(obj,num){
    var count=0;
    var timer=setInterval(function(){
        count++;
        obj.style.width=count+"%";
        if(count==num){
            clearInterval(timer);
        }
    },20)
}
progress(opp[0],50);
progress(opp[1],60);
progress(opp[2],80);

簡易年歷
eg1:將數(shù)組中的值輸出

改變樣式可以直接改樣式,也可以修改類名

var okuang=document.getElementById("kuang");
var oli=document.getElementsByTagName("li");
var arr=[11,22,33,44,55];
var index=0;   //定義一個(gè)變量用來保存索引值
for(var i=0;i<oli.length;i++){  //遍歷給每個(gè)li添加事件
    oli[i].onclick=function(){
        for(var j=0;j<oli.length;j++){  //排他功能
            oli[j].style.backgroundColor="#666";
            oli[j].style.color="#fff";
        }
        okuang.innerHTML=arr[index];  //此時(shí)不能用arr[i]谎亩,因?yàn)樵邳c(diǎn)擊之前for已經(jīng)執(zhí)行完了炒嘲,此時(shí)i為oli的元素個(gè)數(shù)值
        this.style.backgroundColor="red";
        this.style.color="#000";
        index++;
    }
}

解析:
for循環(huán)是在頁面加載的時(shí)候,執(zhí)行完畢了

//  for(var k=0;k<5;k++){
//  }
//  console.log(k);
  //事件是在觸發(fā)的時(shí)候,執(zhí)行的

tab切換案例
點(diǎn)擊按鈕換圖片:

var oli=document.getElementsByTagName("li"); //獲取li標(biāo)簽
var oimg=document.getElementsByTagName("img")[0];  //獲取圖片標(biāo)簽
var index=0;  //存儲(chǔ)索引值,因?yàn)樵邳c(diǎn)擊按鈕前for已經(jīng)執(zhí)行完了
    for(var i=0;i<oli.length;i++){  
        oli[i].onclick=function (){
            oimg.src='images/'+index+'.png';
            index++;
        }
    }

案例
排他功能
一串input

var oinput=document.getElementsByTagName("input");
for(var i=0;i<oinput.length;i++){
    oinput[i].onclick=function(){
        //先讓所有的變成原來的樣子
        for(var j=0;j<oinput.length;j++){
            oinput[j].value="晴天";
            oinput[j].style.background="#ccc";
        }
        //再設(shè)置當(dāng)前的樣式
        this.value="陰天";
        this.style.background="red";
    }
}

通過類名修改樣式

var oinput=document.getElementById("btn");
var odiv=document.getElementById("dv");
oinput.onclick=function(){
    //判斷是否應(yīng)用了類樣式
    if(odiv.className!="cls"){
        odiv.className="cls";  //當(dāng)有多個(gè)類名時(shí)需要注意  留著不需要修改的
    }else{
        odiv.className="dd";
    }
};

tab切換
主要就是排他功能的應(yīng)用匈庭,下面對應(yīng)的塊夫凸,選隱藏,找出點(diǎn)擊span時(shí)對應(yīng)的li再讓它顯示

<div class="box" id="box">
    <div class="hd">
        <span class="current">體育</span>
        <span>娛樂</span>
        <span>新聞</span>
        <span>綜合</span>
    </div>
    <div class="bd">
        <ul>
            <li class="current">我是體育模塊</li>
            <li>我是娛樂模塊</li>
            <li>我是新聞模塊</li>
            <li>我是綜合模塊</li>
        </ul>
    </div>
</div>
<script>
var obox=document.getElementById("box");
    var hd=obox.getElementsByTagName("div")[0];
    var bd=obox.getElementsByTagName("div")[1];
    var oli=bd.getElementsByTagName("li");
    var ospan=hd.getElementsByTagName("span");
    for(var i=0;i<ospan.length;i++){
        ospan[i].setAttribute("index",i); //點(diǎn)擊之前就把索引保存在span標(biāo)簽中
        ospan[i].onclick=function(){
            //將所有的span樣式移除
            for(var j=0;j<ospan.length;j++){
                ospan[j].className="";
                //ospan[j].removeAttribute("class");
            }
           // 設(shè)置當(dāng)前的span類樣式
        this.className="current";

           //先將所有地li隱藏
           for(var k=0;k<oli.length;k++){
                oli[k].removeAttribute("class");
           }
            //獲取當(dāng)前被點(diǎn)擊的索引值
            var index=this.getAttribute("index");
            //當(dāng)前點(diǎn)擊span對應(yīng)的li顯示
            oli[index].className="current";
        }
    }

動(dòng)態(tài)創(chuàng)建列表

<input type="button" value="動(dòng)態(tài)創(chuàng)建列表" id="btn"/>
<div id="dv"></div>

js代碼:

var kungfu=["降龍十八掌", "黯然銷魂掌", "葵花寶典", "九陰真經(jīng)",
    "吸星大法", "如來神掌", "化骨綿掌", "玉女心經(jīng)", "極樂神功", "辟邪劍譜"];
var dv=document.getElementById("dv");
var oinput=document.getElementsByTagName("input")[0];
//點(diǎn)擊按鈕創(chuàng)建列表
oinput.onclick=function(){
    var oul=document.createElement("ul");
    for(var i=0;i<kungfu.length;i++){ //有多少個(gè)數(shù)組元素就創(chuàng)建多少個(gè)li
        var oli=document.createElement("li");
        dv.appendChild(oul);
        oul.appendChild(oli);
        oli.innerHTML=kungfu[i];  //給創(chuàng)鍵的li設(shè)置文本和事件
        oli.onmouseover=mouseoverHandle;
        oli.onmouseout=mouseoutHandle;
    }
}
    function mouseoverHandle(){
        this.style.backgroundColor="red";
    }
function mouseoutHandle(){
    this.style.backgroundColor="";
}
//如果是循環(huán)的方式添加事件,推薦用命名函數(shù)
//如果不是循環(huán)的方式添加事件,推薦使用匿名函數(shù)

動(dòng)態(tài)創(chuàng)建表格

//點(diǎn)擊按鈕創(chuàng)建表格
    var arr=[
        {name:"百度",href:"nn1"},
        {name:"谷歌",href:"nn2"},
        {name:"優(yōu)酷",href:"nn3"},
        {name:"土豆",href:"nn4"},
        {name:"快播",href:"nn5"},
        {name:"愛奇藝",href:"nn6"}
    ];
var btn=document.getElementById("btn");
    var odv=document.getElementById("dv");
    btn.onclick=function(){
        var otable=document.createElement("table");
        otable.cellPadding="0";
        otable.cellSpacing="0";
        otable.border="1"
        //根據(jù)數(shù)組長度創(chuàng)建表格
        for(var i=0;i<arr.length;i++){
            var otr=document.createElement("tr");
                var otd=document.createElement("td");
                otd.innerHTML=arr[i].name;
                var otd2=document.createElement("td");
                otd2.innerHTML=arr[i].href;
            odv.appendChild(otable);
            otable.appendChild(otr);
            otr.appendChild(otd);
            otr.appendChild(otd2);
        }
    }

只創(chuàng)建一個(gè)元素
為了防止不同的人都給同一個(gè)元素添加了相同事件阱持,執(zhí)行次數(shù)過多

方式1: 思路(沒有才去創(chuàng)建)

<input type="button" value="顯示效果" id="btn"/>
<div id="dv"></div>

js代碼:

var btn=document.getElementById("btn");
var odiv=document.getElementById("dv");
btn.onclick=function(){
    if(!document.getElementById("an")){
        var oinput=document.createElement("input");
        oinput.type="button";
        oinput.id="an";
        oinput.value="按鈕";
        odiv.appendChild(oinput);
    }
}

方式2:思路(有則刪除夭拌,刪除后再去創(chuàng)建)

js代碼:

btn.onclick=function(){
  if(document.getElementById("an")){
  odiv.removeChild(document.getElementById("an"));
  }
  var oinput=document.createElement("input");
  oinput.type="button";
  oinput.value="按鈕";
  oinput.id="an";
  odiv.appendChild(oinput);
  }

總結(jié)一句話就是:無則創(chuàng)建,有則刪除

模擬百度搜索框 ------重要
思路:每次鍵盤抬起都去獲取用戶輸入的內(nèi)容,并與數(shù)組中的數(shù)據(jù)進(jìn)行比較鸽扁,如果有相同的蒜绽,則獲取提取出來加入到下拉框展示出來

簡單的布局如下:

<div id="box">
  <input type="text" id="txt" value="">
  <input type="button" value="搜索" id="btn">
</div>

js代碼:

var keyWords = ["小楊才是最純潔的", "小楊才是最帥的", "小段是最猥瑣的", "小超是最齷齪的", "傳智播客是一個(gè)培訓(xùn)機(jī)構(gòu)", "傳說在傳智有個(gè)很帥很純潔的小楊", "蘋果好吃", "蘋果此次召回還是沒有中國"];
var txt=document.getElementById("txt");
    var btn=document.getElementById("btn");

    //每一次的鍵盤抬起都判斷頁面中有沒有這個(gè)div
    txt.onkeyup= function () {
        if(document.getElementById("dv")) {
            var dv=document.getElementById("dv");
            document.getElementById("box").removeChild(dv);
        }
            //把文本框輸入的內(nèi)容和數(shù)組中的每個(gè)數(shù)據(jù)對比
            var text=this.value;
            var arr=[];  //用來存儲(chǔ)用戶輸入的內(nèi)容
            for(var i=0;i<keyWords.length;i++){
                if(keyWords[i].indexOf(text)==0){
                    arr.push(keyWords[i]);
                }
            }
            //判斷文本框是否為空,空則不用創(chuàng)建div
            if(this.value.length==0||arr.length==0){
                if(document.getElementById("dv")){
                    document.getElementById("dv").removeChild("dv");
                }
                return;
            }
            //創(chuàng)建div桶现,把div加入id為box的盒子中
            var dv=document.createElement("div");
            document.getElementById("box").appendChild(dv);
            dv.id="dv";
            dv.style.width="350px";
            dv.style.border="1px solid #ccc";
            //循環(huán)遍歷臨時(shí)數(shù)組,創(chuàng)建對應(yīng)的p標(biāo)簽
            for(var i=0;i<arr.length;i++){
                //創(chuàng)建p標(biāo)簽
                var op=document.createElement("p");
                dv.appendChild(op);
                op.innerHTML=arr[i];
                op.onmouseover=function(){
                    this.style.background="red";
                };
                op.onmouseout=function(){
                    this.style.background="";
                };
            }
        };

為同一個(gè)元素綁定多個(gè)事件
對象.addEventListener(“事件類型”,事件處理函數(shù),false);

對象.attachEvent(“有on的事件類型”,事件處理函數(shù))鸿染; 只有ie支持

封裝緩動(dòng)動(dòng)畫函數(shù)
js代碼:

//動(dòng)畫函數(shù)---任意一個(gè)元素移動(dòng)到指定的目標(biāo)位置
function f1(ele,target){
    clearInterval(ele.timer);  //確保元素只有一個(gè)定時(shí)器
//動(dòng)畫函數(shù)---任意一個(gè)元素移動(dòng)到指定的目標(biāo)位置
    ele.timer=setInterval(function(){  //定時(shí)器的id值存儲(chǔ)到對象的一個(gè)屬性中
        var cur=ele.offsetLeft; //獲取當(dāng)前元素坐標(biāo)
        var step=(target-cur)/10;
        step=step>0?Math.ceil(step):Math.floor(step);
        cur+=step;
        //判斷當(dāng)前移動(dòng)后的位置是否到達(dá)目標(biāo)位置
        if(cur==target){
            clearInterval(ele.timer);  //清理指定元素的定時(shí)器
        }
        ele.style.left=cur+"px";
    },20);
}

封裝動(dòng)畫函數(shù)樱溉,改變?nèi)我舛鄠€(gè)屬性和回調(diào)函數(shù)
js代碼:

 function animate(element, json, fn) {
    clearInterval(element.timeId);//清理定時(shí)器
    element.timeId = setInterval(function () {
      var flag = true;//默認(rèn),假設(shè),全部到達(dá)目標(biāo)
      //遍歷json對象中的每個(gè)屬性還有屬性對應(yīng)的目標(biāo)值
      for (var attr in json) {
        if (attr == "opacity") { //判斷這個(gè)屬性attr中是不是opacity
          //獲取元素的當(dāng)前的透明度,當(dāng)前的透明度放大100倍
          var current = getStyle(element, attr) * 100;
          var target = json[attr] * 100;//目標(biāo)的透明度放大100倍
          var step = (target - current) / 10;
          step = step > 0 ? Math.ceil(step):Math.floor(step);//step<0時(shí)不用加-號(hào)
          current += step;//移動(dòng)后的值
          element.style[attr] = current / 100;
        } else if (attr == "zIndex") { //判斷這個(gè)屬性attr中是不是zIndex
          //層級(jí)改變就是直接改變這個(gè)屬性的值
          element.style[attr] = json[attr];
        } else {
          //普通的屬性
          //獲取元素這個(gè)屬性的當(dāng)前的值
          var current = parseInt(getStyle(element, attr));
          var target = json[attr];  //當(dāng)前的屬性對應(yīng)的目標(biāo)值
          var step = (target - current) / 10; //移動(dòng)的步數(shù)
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          current += step;//移動(dòng)后的值
          element.style[attr] = current + "px";
        }
        if (current != target) {   //是否到達(dá)目標(biāo)
          flag = false;
        }
      }
      if (flag) {
        //清理定時(shí)器
        clearInterval(element.timeId);
        //所有的屬性到達(dá)目標(biāo)才能使用這個(gè)函數(shù),前提是用戶傳入了這個(gè)函數(shù)
        if (fn) {
          fn();
        }
      }
    }, 20);
  }

完整的輪播圖 --------重要
思路:圖片和小按鈕分別放在不同的盒子里,然后去設(shè)置左右焦點(diǎn)的事件僻澎,和小按鈕的事件猎提,為小按鈕添加事件之前先把索引保存到li的自定義屬性中狭吼。

左右焦點(diǎn)有臨界值酱讶,需要去判斷第一個(gè)和最后一個(gè)

小按鈕需要設(shè)置樣式何暮,及第一個(gè)和的最后一個(gè)轉(zhuǎn)換時(shí)小按鈕對應(yīng)的樣式

簡單的布局代碼:

<div class="all" id='box'>
    <div class="screen"><!--相框-->
        <ul>
            <li><img src="img/1.jpg" width="500" height="200"/></li>
            <li><img src="img/2.jpg" width="500" height="200"/></li>
            <li><img src="img/3.jpg" width="500" height="200"/></li>
            <li><img src="img/4.jpg" width="500" height="200"/></li>
            <li><img src="img/5.jpg" width="500" height="200"/></li>
        </ul>
        <ol>  //用來存放小按鈕
        </ol>
    </div>
    <div id="arr"><span id="left">&lt;</span><span id="right">&gt;</span></div>
</div>

js代碼:

<script>
    var box = document.getElementById("box");
    var kuang = box.children[0];
    var kwidth = kuang.offsetWidth;
    var oul = kuang.children[0];
    var ol = kuang.children[1];
    var oli = oul.children;
    var arr = box.children[1]; //焦點(diǎn)
    var lf = document.getElementById("left");
    var rg = document.getElementById("right");
    box.onmouseover = function () {
        arr.style.display = "block";
        clearInterval(timer);
    }
    box.onmouseout = function () {
        arr.style.display = "none";
        timer=setInterval(clickHandle,2000);
    };
    
    //根據(jù)li的個(gè)數(shù)去創(chuàng)建小按鈕
    var pic=0;
    for(var i=0;i<oli.length;i++){
        var list=document.createElement("li");
        ol.appendChild(list);
        list.setAttribute("index",i);
        list.innerHTML=(i+1);
        list.onmouseover=function(){
            for(var j=0;j<ol.children.length;j++){
                ol.children[j].className="";
            }
            this.className="current";
            pic=this.getAttribute("index");
            f1(oul,-pic*kwidth);
        };
        list.onmouseout=function(){
            this.className="";
        }
    }
    
   //設(shè)置ol中第一個(gè)li有背景顏色
    ol.children[0].className="current";
//克隆克隆一個(gè)ul中第一個(gè)li,加入到ul中的最后
    oul.appendChild(oul.children[0].cloneNode(true));
    //自動(dòng)播放
    var timer=setInterval(clickHandle,2000);
   
   //右邊的按鈕
    rg.onclick=clickHandle;
    function clickHandle(){
        if(pic==oli.length-1){ //pic中存的是索引值
            pic=0;
            oul.style.left=0;
        }
        pic++;
    f1(oul,-pic*kwidth);
    if(pic==oli.length-1){
        ol.children[ol.children.length-1].className="";
        ol.children[0].className="current";
    }else {
        for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = ""
        }
        ol.children[pic].className= "current";
    }
    }
   
   //左邊的按鈕
    lf.onclick=function(){
    if(pic==0){
        pic=4;
        oul.style.left=-pic*kwidth+"px";
    }
    pic--;
        f1(oul,pic*kwidth);
        for(var j=0;j<oli.length;j++){
            oli[j].className="";
        }
        this.className="current";
}
    //運(yùn)動(dòng)函數(shù)
    function f1(ele, target) {
        clearInterval(ele.timer);
        var current = ele.offsetLeft;
        ele.timer = setInterval(function () {
            var step = 10;
            step = current < target ? step : -step;
            current += step;
            if (Math.abs(target - current) < Math.abs(step)) {
                clearInterval(ele.timer);
                ele.style.left = target + "px";
            } else {
                ele.style.left = current + "px";
            }
        }, 20);
    }

筋頭云案例:
基本布局代碼:

<div class="nav">   //相對定位
  <span id="cloud"></span>  //絕對定位
  <ul id="navBar">  
    <li>北京校區(qū)</li>
    <li>上海校區(qū)</li>
    <li>廣州校區(qū)</li>
    <li>深圳校區(qū)</li>
    <li>武漢校區(qū)</li>
    <li>關(guān)于我們</li>
    <li>聯(lián)系我們</li>
    <li>招賢納士</li>
  </ul>
</div>

js代碼:

//勻速動(dòng)畫
function animate(element, target) {
  clearInterval(element.timeId);  //清理定時(shí)器
  element.timeId = setInterval(function () {
    var current = element.offsetLeft;  //獲取元素的當(dāng)前位置
    var step = (target - current) / 10; //移動(dòng)的步數(shù)
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    current += step;
    element.style.left = current + "px";
    if (current == target) {
      //清理定時(shí)器
      clearInterval(element.timeId);
    }
   }, 20);
}

var cloud = my$("cloud");  //獲取云彩
var list = my$("navBar").children;  //獲取所有的li標(biāo)簽
for (var i = 0; i < list.length; i++) {//給所有的li注冊鼠標(biāo)進(jìn)入,鼠標(biāo)離開,點(diǎn)擊事件
  list[i].onmouseover = mouseoverHandle; //鼠標(biāo)進(jìn)入事件
  list[i].onclick = clickHandle;  //點(diǎn)擊事件
  list[i].onmouseout = mouseoutHandle;  //鼠標(biāo)離開事件
}
function mouseoverHandle() {//進(jìn)入
  animate(cloud, this.offsetLeft);
}
var lastPosition = 0;
function clickHandle() {//點(diǎn)擊
  lastPosition = this.offsetLeft;//點(diǎn)擊的時(shí)候,記錄此次點(diǎn)擊的位置
}
function mouseoutHandle() {//離開
  animate(cloud, lastPosition);
}

手風(fēng)琴案例
簡單的布局:

<div id="box">
  <ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</div>

js實(shí)現(xiàn)代碼:

<script src="common.js"></script>
<script>

  //獲取任意一個(gè)元素的任意一個(gè)屬性的當(dāng)前的值---當(dāng)前屬性的位置值
  function getStyle(element, attr) {
    return window.getComputedStyle ? window.getComputedStyle(element, null)[attr] : element.currentStyle[attr] || 0;
  }
  function animate(element, json, fn) {
    clearInterval(element.timeId);//清理定時(shí)器
    //定時(shí)器,返回的是定時(shí)器的id
    element.timeId = setInterval(function () {
      var flag = true;//默認(rèn),假設(shè),全部到達(dá)目標(biāo)
      //遍歷json對象中的每個(gè)屬性還有屬性對應(yīng)的目標(biāo)值
      for (var attr in json) {
        //判斷這個(gè)屬性attr中是不是opacity
        if (attr == "opacity") {
          //獲取元素的當(dāng)前的透明度,當(dāng)前的透明度放大100倍
          var current = getStyle(element, attr) * 100;
          //目標(biāo)的透明度放大100倍
          var target = json[attr] * 100;
          var step = (target - current) / 10;
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          current += step;//移動(dòng)后的值
          element.style[attr] = current / 100;
        } else if (attr == "zIndex") { //判斷這個(gè)屬性attr中是不是zIndex
          //層級(jí)改變就是直接改變這個(gè)屬性的值
          element.style[attr] = json[attr];
        } else {
          //普通的屬性
          //獲取元素這個(gè)屬性的當(dāng)前的值
          var current = parseInt(getStyle(element, attr));
          //當(dāng)前的屬性對應(yīng)的目標(biāo)值
          var target = json[attr];
          //移動(dòng)的步數(shù)
          var step = (target - current) / 10;
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          current += step;//移動(dòng)后的值
          element.style[attr] = current + "px";
        }
        //是否到達(dá)目標(biāo)
        if (current != target) {
          flag = false;
        }
      }
      if (flag) {
        //清理定時(shí)器
        clearInterval(element.timeId);
        //所有的屬性到達(dá)目標(biāo)才能使用這個(gè)函數(shù),前提是用戶傳入了這個(gè)函數(shù)
        if (fn) {
          fn();
        }
      }
      //測試代碼
      console.log("目標(biāo):" + target + ",當(dāng)前:" + current + ",每次的移動(dòng)步數(shù):" + step);
    }, 20);
  }

  //先獲取所有的li標(biāo)簽
  var list = my$("box").getElementsByTagName("li");
  for (var i = 0; i < list.length; i++) {
    list[i].style.backgroundImage = "url(images/" + (i + 1) + ".jpg)";
    //鼠標(biāo)進(jìn)入
    list[i].onmouseover = mouseoverHandle;
    //鼠標(biāo)離開
    list[i].onmouseout = mouseoutHandle;
  }
  //進(jìn)入
  function mouseoverHandle() {
    for (var j = 0; j < list.length; j++) {
      animate(list[j], {"width": 100});//動(dòng)畫效果
    }
    animate(this, {"width": 800});
  }
  //離開
  function mouseoutHandle() {
    for (var j = 0; j < list.length; j++) {
      animate(list[j], {"width": 240});//動(dòng)畫效果
    }
  }


</script>

圖片跟著鼠標(biāo)飛:

 //圖片跟著鼠標(biāo)飛,可以在任何的瀏覽器中實(shí)現(xiàn)
  //window.event和事件參數(shù)對象e的兼容
  //clientX和clientY單獨(dú)的使用的兼容代碼
  //scrollLeft和scrollTop的兼容代碼
  //pageX,pageY和clientX+scrollLeft 和clientY+scrollTop

  //把代碼封裝在一個(gè)函數(shù)

  //把代碼放在一個(gè)對象中
  var evt={
    //window.event和事件參數(shù)對象e的兼容
    getEvent:function (evt) {
      return window.event||evt;
    },
    //可視區(qū)域的橫坐標(biāo)的兼容代碼
    getClientX:function (evt) {
      return this.getEvent(evt).clientX;
    },
    //可視區(qū)域的縱坐標(biāo)的兼容代碼
    getClientY:function (evt) {
      return this.getEvent(evt).clientY;
    },
    //頁面向左卷曲出去的橫坐標(biāo)
    getScrollLeft:function () {
      return window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft||0;
    },
    //頁面向上卷曲出去的縱坐標(biāo)
    getScrollTop:function () {
      return window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop||0;
    },
    //相對于頁面的橫坐標(biāo)(pageX或者是clientX+scrollLeft)
    getPageX:function (evt) {
      return this.getEvent(evt).pageX? this.getEvent(evt).pageX:this.getClientX(evt)+this.getScrollLeft();
    },
    //相對于頁面的縱坐標(biāo)(pageY或者是clientY+scrollTop)
    getPageY:function (evt) {
      return this.getEvent(evt).pageY?this.getEvent(evt).pageY:this.getClientY(evt)+this.getScrollTop();
    }



  };
  //最終的代碼

  document.onmousemove=function (e) {
    my$("im").style.left=evt.getPageX(e)+"px";
    my$("im").style.top=evt.getPageY(e)+"px";
  };

滾動(dòng)條案例
api第七天案例

鋼琴版導(dǎo)航條:
css樣式:

 * {
      margin: 0;
      padding: 0;
      list-style: none;
    }
    
    .nav {
      width: 900px;
      height: 60px;
      background-color: black;
      margin: 0 auto;
    }
    
    .nav li {
      width: 100px;
      height: 60px;
      /*border: 1px solid yellow;*/
      float: left;
      position: relative;
      overflow: hidden;
    }
    
    .nav a {
      position: absolute;
      width: 100%;
      height: 100%;
      font-size: 24px;
      color: blue;
      text-align: center;
      line-height: 60px;
      text-decoration: none;
      z-index: 2;
    }
    
    .nav span {
      position: absolute;
      width: 100%;
      height: 100%;
      background-color: yellow;
      top: 60px;
    }

jq實(shí)現(xiàn)代碼: 需要引入jq文件

$(function () {
      //給li注冊鼠標(biāo)進(jìn)入事件,讓li下面的span top:0  播放音樂
      $(".nav li").mouseenter(function () {
        $(this).children("span").stop().animate({top: 0});
        //播放音樂
        var idx = $(this).index();
        $(".nav audio").get(idx).load();
        $(".nav audio").get(idx).play();
      }).mouseleave(function () {
        $(this).children("span").stop().animate({top: 60});
      });
      
      //節(jié)流閥  :按下的時(shí)候,觸發(fā)婆赠,如果沒彈起绵脯,不讓觸發(fā)下一次
      //1. 定義一個(gè)flag
      var flag = true;
      
      
      //按下1-9這幾個(gè)數(shù)字鍵,能觸發(fā)對應(yīng)的mouseenter事件
      $(document).on("keydown", function (e) {
        if(flag) {
          flag = false;
          //獲取到按下的鍵
          var code = e.keyCode;
          if(code >= 49 && code <= 57){
            //觸發(fā)對應(yīng)的li的mouseenter事件
            $(".nav li").eq(code - 49).mouseenter();
          }
        }
       
      });
  
      $(document).on("keyup", function (e) {
        flag = true;
        
        //獲取到按下的鍵
        var code = e.keyCode;
        if(code >= 49 && code <= 57){
          //觸發(fā)對應(yīng)的li的mouseenter事件
          $(".nav li").eq(code - 49).mouseleave();
        }
      });
      
      //彈起的時(shí)候页藻,觸發(fā)mouseleave事件
      
    });
事件

鍵盤控制div移動(dòng)
如果需要在頁面中移動(dòng)桨嫁,要將元素脫離文檔流(否則會(huì)影響頁面布局)

<div style="position: absolute;background-color:pink;width: 60px;height: 60px;"></div>

js實(shí)現(xiàn)代碼:

var odiv=document.getElementsByTagName("div")[0];
document.onkeydown=function(e){
    var evt=e||event; 
    var x=odiv.offsetLeft;  //獲取div的坐標(biāo)值
    var y=odiv.offsetTop;
    var code=evt.keyCode;  //獲取鍵盤碼
    switch (code){   //當(dāng)按下方向鍵,執(zhí)行對應(yīng)的功能
        case 38:
            odiv.style.left=x+"px";
            odiv.style.top=y-10+"px";
            break;
        case 40:
            odiv.style.left=x+"px";
            odiv.style.top=y+10+"px";
            break;
        case 37:
            odiv.style.left=x-10+"px";
            odiv.style.top=y+"px";
            break;
        case 39:
            odiv.style.left=x+10+"px";
            odiv.style.top=y+"px";
            break;
    }
}

鼠標(biāo)跟隨特效:
js實(shí)現(xiàn)代碼:

for(var i=0;i<10;i++){  //創(chuàng)建10個(gè)div份帐,并加入到頁面中
    var dv=document.createElement("div");
    document.body.appendChild(dv);
}
var odiv=document.getElementsByTagName("div");
document.onmousemove=function(e){
    var evt=e||event;
    var x=evt.clientX;  //獲取鼠標(biāo)的坐標(biāo)
    var y=evt.clientY;
    odiv[0].style.left=x+"px";  //讓第一個(gè)跟隨鼠標(biāo)移動(dòng)
    odiv[0].style.top=y+"px";
    //讓后一個(gè)跟隨前一個(gè)移動(dòng)
    for(var i=odiv.length-1;i>0;i--){
        odiv[i].style.left=odiv[i-1].style.left;
        odiv[i].style.top=odiv[i-1].style.top;
    }
}
事件委托機(jī)制 ----------重要

eg:點(diǎn)擊按鈕往ul中添加li,使添加的li也有相同的事件

var obtn=document.getElementById("btn");
    var olist=document.getElementById("list");  //獲取ul
    var oli=olist.children;  //獲取ul的子節(jié)點(diǎn)li
   olist.onclick=function(e){
       var evt=e||event;
       var tar=evt.target||evt.srcElement;  //獲取事件源
       if(tar.nodeName.toLowerCase()=="li"){  判斷事件源是不是是該執(zhí)行目標(biāo)
           console.log(tar.innerHTML); //此時(shí)不能用this楣导,因?yàn)閠his指向的是ul
       }
   }
    obtn.onclick=function(){
        for(var i=0;i<4;i++){
            var lli=document.createElement("li");
            lli.innerHTML="aaaa";
            olist.appendChild(lli);
        }
    }

拖拽效果

var odiv=document.getElementsByTagName("div")[0];
odiv.onmousedown=function(e){  //按下鼠標(biāo)的事件
    var evt=e||event;
    var lf=evt.offsetX;
    var tp=evt.offsetY;
  document.onmousemove=function(e){  //鼠標(biāo)移動(dòng)事件
       var evt=e||event;
        var x=evt.clientX-lf;  //讓鼠標(biāo)一直在按下的那個(gè)位置
       var y=evt.clientY-tp;
      //設(shè)置元素只能在可視區(qū)域內(nèi)移動(dòng)
      if(x<=0){
          x=0;
      }
      if(x>=document.documentElement.clientWidth-odiv.offsetWidth){
        x=document.documentElement.clientWidth-odiv.offsetWidth
      }
      if(y<=0){
          y=0;
      }
        if(y>=document.documentElement.clientHeight-odiv.offsetHeight){
            y=document.documentElement.clientHeight-odiv.offsetHeight;
        }
      odiv.style.left=x+"px";  //讓元素跟著鼠標(biāo)移動(dòng)
      odiv.style.top=y+"px";
    }
    document.onmouseup=function(){  //鼠標(biāo)抬起事件
        document.onmousemove=null;
    }
}

九宮格
js代碼:

var obox=document.getElementById("box");
    //創(chuàng)建結(jié)構(gòu)
    for(var i=0;i<3;i++){  //控制外層的行數(shù)
        for(var j=0;j<3;j++){  //控制內(nèi)層
            var odiv=document.createElement("div");
            obox.appendChild(odiv);
           /* var r=Math.floor(Math.random()*256);
            var g=Math.floor(Math.random()*256);
            var b=Math.floor(Math.random()*256);*/
            odiv.style.backgroundColor="rgb("+Math.floor(Math.random()*256)+','+Math.floor(Math.random()*256)+','+Math.floor(Math.random()*256)+")";  //字符串拼接
            odiv.style.left=j*(odiv.offsetWidth+10)+"px";
            odiv.style.top=i*(odiv.offsetHeight+10)+"px";

        }
    }
    var strarr=["a","b","c","d","e","f","g","h","i","m"];
    var child=obox.children;
    //給每個(gè)小塊加上文字
    for(var i=0;i<child.length;i++){
        child[i].innerHTML=strarr[i];
    }
    
//拖拽
    for(var i=0;i<child.length;i++){
        child[i].onmousedown=function(e){
            var evt=e||event;
            var lf=evt.offsetX;
            var tp=evt.offsetY;
            var current=this;  //將this保存current中 废境,因?yàn)樯舷轮赶虻膖his不同
            //因?yàn)橥蟿?dòng)的時(shí)候原位置,還需要有東西筒繁,所以才克隆
            var clone=current.cloneNode(); //克隆一個(gè)當(dāng)前的元素噩凹,并添加到盒子里
                clone.style.border="1px dashed #000";
//            obox.appendChild(clone);  //因?yàn)樘砑又罂寺〉乃饕谧詈螅?// 后面需要進(jìn)行距離比較,所以需要將克隆節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)進(jìn)行替換
            obox.replaceChild(clone,current);  //用克隆的節(jié)點(diǎn)替換當(dāng)前節(jié)點(diǎn)
            obox.appendChild(current);  //把當(dāng)前節(jié)點(diǎn)加到盒子里
            current.style.zIndex=1;
            document.onmousemove=function(e){
                var evt=e||event;
                var x= e.clientX-lf-obox.offsetLeft;
                var y= e.clientY-tp-obox.offsetTop;
                //當(dāng)前對象的坐標(biāo):隨著鼠標(biāo)移動(dòng)
                current.style.left=x+"px";
                current.style.top=y+"px";
                return false;  //取消默認(rèn)行為
            }
            document.onmouseup=function(){
                //將當(dāng)前的這個(gè)和剩下所有的進(jìn)行比較毡咏,找出距離最近的
                //將當(dāng)前放到距離最近的位置驮宴,最近的那個(gè)放到克隆的位置
                var arr=[];
                var newarr=[];
                //以為此時(shí)當(dāng)前節(jié)點(diǎn)的索引在最后,不需要和自身比較呕缭,所以去掉最后一個(gè)索引
                for(var i=0;i<child.length-1;i++){
                    var wid=current.offsetLeft-child[i].offsetLeft;
                    var hei=current.offsetTop-child[i].offsetTop;
                    var juli=Math.sqrt(Math.pow(wid,2)+Math.pow(hei,2));
                    arr.push(juli);
                    newarr.push(juli);
                }
                arr.sort(function(a,b){
                    return a-b;
                })
                var min=arr[0];
                var minindex=newarr.indexOf(min);

                //交換位置:當(dāng)前的坐標(biāo)為最小距離對應(yīng)的位置堵泽,最小值的放在克隆所在的位置
                current.style.left=child[minindex].style.left;
                current.style.top=child[minindex].style.top;

                child[minindex].style.left=clone.style.left;
                child[minindex].style.top=clone.style.top;

                obox.removeChild(clone); //交換位置之后將克隆的節(jié)點(diǎn)刪除
                document.onmousemove=null;
                document.onmouseup=null;
            }
        }
    }

軌跡
js代碼:

var odiv = document.getElementsByTagName("div")[0];
var arr=[];  //用來保存鼠標(biāo)移動(dòng)時(shí)的坐標(biāo)位置
document.onmousedown = function (e) {
    var evt1 = e || event;
    var x=evt1.clientX;
    var y=evt1.clientY;
    arr.push({pagex:x,pagey:y});
    document.onmousemove=function(e){
        var evt = e || event;
        var x = evt.clientX;
        var y = evt.clientY;
        arr.push({pagex:x,pagey:y}); //采用對象數(shù)組存儲(chǔ),因?yàn)樽鴺?biāo)成對好進(jìn)行操作
        return false;  //取消瀏覽器的默認(rèn)行為
        //console.log(arr);
    }
    document.onmouseup=function(){
        var timer=setInterval(function(){
            odiv.style.left=arr[0].pagex+"px";
            odiv.style.top=arr[0].pagey+"px";
            arr.splice(0,1); //讓元素坐標(biāo)始終從0開始恢总,splice會(huì)改變原數(shù)組長度
            if(arr.length==0){ //當(dāng)數(shù)組長度為0迎罗,說明保存的坐標(biāo)執(zhí)行完了
                clearInterval(timer);
            }
        },20);
        document.onmousemove=null;
    }
}
cookie

一周內(nèi)免登錄
樣式代碼:

<form action="">
    姓名:<input type="text" id="usename"/><br />
    密碼:<input type="text" i="mima"/><br />
    一周內(nèi)免登陸<input type="checkbox" />
    <input type="button" id="btn" value="登錄"/><br />
</form>

js功能代碼:

 var input=document.getElementsByTagName("input");
  if(getCookie("usename")){  //判端cookie是否有數(shù)據(jù)
     input[0].value=getCookie("usename");
      input[1].value=getCookie("password");
      input[2].checked=true;
  }
  input[3].onclick=function(){
      if(input[2].checked){
          setCookie("usename",input[0].value,1);
          setCookie("password",input[1].value,1);
      }else{
          removeCookie("usename");
          removeCookie("password");
      }
  }

  //將函數(shù)作為對象的方法進(jìn)行封裝
    function setCookie(name,value,n){
         var date=new Date();
         date.setDate(date.getDate()+n);
        //name+"="+value+";"+"expires"+"="+odate;
      document.cookie=name+"="+value+";"+"expires"+"="+date;
     }
    function getCookie(name){
         var str=document.cookie;
         var arr=str.split(";");
         for(var i=0;i<arr.length;i++){
             var newArr=arr[i].split("=");
             if(newArr[0]==name){
                  return newArr[1];
             }
         }
     }
    function removeCookie(name){
        setCookie(name, 11, -2);
    }
購物車

產(chǎn)品頁面js代碼:

<script type="text/javascript">
//商品數(shù)據(jù)  后臺(tái)傳過來
var data = [{
   "id":10001,
   "title":"蒙牛",
   "price":60,
   "imgUrl":"img/photo1.jpg"
},{
   "id":10002,
   "title":"婚紗照",
   "price":19999,
   "imgUrl":"img/photo2.jpg"
},{
   "id":10003,
   "title":"加濕器",
   "price":100,
   "imgUrl":"img/photo3.jpg"
}];

//生成結(jié)構(gòu)
var oUl = document.getElementById("productList");
var str = "";
for(var i = 0; i < data.length; i++){
   str += "<li><img src='"+data[i].imgUrl+"'><p>"+data[i].title+"</p><p>"+data[i].price+"</p><input class='addBtn' type='button' data-id='"+data[i].id+"' value='加入購物車'></li>";
}
oUl.innerHTML = str;

//加入購物車
var cartNum = document.getElementById("cartNum");
var oNum = cartNum.children[0];
var count = 0;


var addBtns = document.getElementsByClassName("addBtn");
//定義一個(gè)對象,去保存id和數(shù)量 判斷cookie里有沒有存過數(shù)據(jù)片仿,有就用纹安,沒有就賦值為{}
if(getCookie("cart")){
   var obj = JSON.parse(getCookie("cart"));//將json字符串轉(zhuǎn)換成對象的
}else{
   var obj = {};
}
//取所有購物車商品數(shù)量
for(var i in obj){
   count += obj[i];
}
oNum.innerHTML = count;

for(var i = 0; i < addBtns.length; i++){
   addBtns[i].onclick = function(){
      //存數(shù)據(jù)時(shí) 存id:num cart {"10001":1,"10002":3}
      //考慮如果取到加入購物車的商品id
      var prodId = this.getAttribute("data-id");
      if(obj[prodId]==undefined){
         obj[prodId] = 1;
      }else{
         obj[prodId]++;
      }
      
      //把這個(gè)對象存到cookie
      
      //console.log(obj);
      
      var objToStr = JSON.stringify(obj);//將js對象(數(shù)組,對象)轉(zhuǎn)換成JSON格式的字符串
      
      setCookie("cart",objToStr,7);
      
      //顯示購物籃中的數(shù)量
      oNum.innerHTML = ++count;

   }
}
</script>

cart頁面的js代碼:

<script type="text/javascript">
   /*var data = [{
      "id":10001,
      "title":"蒙牛",
      "price":60,
      "imgUrl":"img/photo1.jpg"
   },{
      "id":10002,
      "title":"婚紗照",
      "price":19999,
      "imgUrl":"img/photo2.jpg"
   },{
      "id":10003,
      "title":"加濕器",
      "price":100,
      "imgUrl":"img/photo3.jpg"
   }];*/
   var data = {"10001":{
      "id":10001,
      "title":"蒙牛",
      "price":60,
      "imgUrl":"img/photo1.jpg"
   },"10002":{
      "id":10002,
      "title":"婚紗照",
      "price":19999,
      "imgUrl":"img/photo2.jpg"
   },"10003":{
      "id":10003,
      "title":"加濕器",
      "price":100,
      "imgUrl":"img/photo3.jpg"
   }};
   var oList = document.getElementById("cartList");
   var obj = {};
   if(getCookie("cart")){
      obj = JSON.parse(getCookie("cart"));
   }
   var str = "";
   for(var i in obj){
      /*for(var j = 0; j < data.length; j++){
         if(i==data[j].id){
            str += "<li><img src='"+data[j].imgUrl+"'><span>"+data[j].title+"</span><span>"+data[j].price+"</span><span>"+obj[i]+"</span></li>"
         }
      }*/
   str += "<li><img src='"+data[i].imgUrl+"'><span>"+data[i].title+"</span><span>"+data[i].price+"</span><span>"+obj[i]+"</span></li>"
      
   }
   oList.innerHTML = str;
</script>
正則表達(dá)式

表單驗(yàn)證

簡單的布局:

<div class="container" id="dv">
  <label for="qq">Q Q</label><input type="text" id="qq"><span></span><br/>
  <label>手機(jī)</label><input type="text" id="phone"><span></span><br/>
  <label>郵箱</label><input type="text" id="e-mail"><span></span><br/>
  <label>座機(jī)</label><input type="text" id="telephone"><span></span><br/>
  <label>姓名</label><input type="text" id="fullName"><span></span><br/>
</div>

js代碼:

  checkInput(my$("qq"),/^\d{5,11}$/);  //qq的
  checkInput(my$("phone"),/^\d{11}$/);    //手機(jī)
  checkInput(my$("e-mail"),/^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}$/);     //郵箱
  checkInput(my$("telephone"),/^\d{3,4}[-]\d{7,8}$/);   //座機(jī)號(hào)碼
  checkInput(my$("fullName"),/^[\u4e00-\u9fa5]{2,6}$/);    //中文名字
//通過正則表達(dá)式驗(yàn)證當(dāng)前的文本框是否匹配并顯示結(jié)果
  function checkInput(input,reg) {
    //文本框注冊失去焦點(diǎn)的事件
    input.onblur=function () {
      if(reg.test(this.value)){
        this.nextElementSibling.innerText="正確了";
        this.nextElementSibling.style.color="green";
      }else{
        this.nextElementSibling.innerText="讓你得瑟,錯(cuò)了吧";
        this.nextElementSibling.style.color="red";
      }
    };
  }
運(yùn)動(dòng)

圓周運(yùn)動(dòng)
簡單的布局: 一個(gè)小球圍繞大球轉(zhuǎn)動(dòng)

<div id="box">   相對定位
    <div id="circal"></div>  子對定位  //注意小球的margin值
</div>    

js實(shí)現(xiàn)代碼: //思路:讓球的坐標(biāo)隨角度變化而變化

var box=document.getElementById("box");
 var circal=document.getElementById("circal");
 var count=0;
 var r=box.offsetWidth/2;
 var timer=setInterval(function(){
      count++;
     var x=r+r*Math.cos(count*Math.PI/180);
     //x=r+r*cosa;  math中用的是弧度值 記住了
     var y=r-r*Math.sin(count*Math.PI/180);
     circal.style.left=x+"px";
     circal.style.top=y+"px";
 },20);

平拋運(yùn)動(dòng)
簡單的布局:

<div id="ball"></div>

js代碼: //利用平拋的原理,讓球的位置發(fā)生改變

var ball=document.getElementById("ball");
var count=0;
var timer=setInterval(function(){
    //x=vt;y=0.5*10*t*t;
     count++;
    var t=count*0.02;
    var x=30*t;
    var y=0.5*10*t*t;
    ball.style.left=x+"px";
    ball.style.top=y+"px";
    if(x>600||y>600){
        clearInterval(timer);
    }
},20);

拋物線運(yùn)動(dòng)
簡單的布局

<div id="ball"></div>
<div id="cart"></div>

js實(shí)現(xiàn)代碼: 思路:先求出拋物線函數(shù)厢岂,然后再確定球的位置坐標(biāo)

var ball=document.getElementById("ball");
var cart=document.getElementById("cart");
var count=0;
    var timer=setInterval(function(){
        count+=2;
        var x1=ball.offsetLeft;
        var y1=ball.offsetTop;
         var x2=cart.offsetLeft;
        var y2=cart.offsetTop;
        //假設(shè)拋物線過原點(diǎn) y=ax*x+b*x+c;  a給定的值光督,c=0;
        var a=0.0005;
        var b=((y2-y1)-a*(x2-x1)*(x2-x1))/(x2-x1); //相當(dāng)于拋物線函數(shù)求出來了
        var x=count;
        var y=a*x*x+b*x;
        ball.style.left=x1+x+"px";
        ball.style.top=y1+y+"px";
        if(ball.offsetLeft>=x2){
            clearInterval(timer);
        }
    },20);

效果案例

startMove.js
function startMove(obj, json, fn) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function() {
        var flag = true; //假設(shè)所有屬性都達(dá)到目標(biāo)值
        for(var attr in json) {
            var iTarget = json[attr];
            if(attr == "opacity"){
                var iCur = parseInt(getStyle(obj, attr)*100);
            }else{
                var iCur = parseInt(getStyle(obj, attr));
            }
            
            var iSpeed = (iTarget - iCur) / 7;
            iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
            
            if(attr == "opacity"){
                obj.style.opacity = (iCur + iSpeed)/100;
                obj.style.filter = "alpha(opacity="+(iCur + iSpeed)+")";    
            }else{
                obj.style[attr] = iCur + iSpeed + "px";
            }
            
            
            //只要有一個(gè)達(dá)到目標(biāo)值,定時(shí)器就會(huì)被清除,會(huì)導(dǎo)致部分屬性沒有達(dá)到目標(biāo)值
            //所有屬性都達(dá)到目標(biāo)值時(shí)塔粒,清除定時(shí)器
            if(iCur != iTarget) { //假設(shè)是否成立由此判斷
                flag = false;
            }
        }

        if(flag) { //如果假設(shè)成立可帽,清除定時(shí)器
            clearInterval(obj.timer);
            if(fn) {
                fn();
            }
        }

    }, 20)
}

//獲取屬性值
function getStyle(obj, attr) {
    if(obj.currentStyle) {
        return obj.currentStyle[attr];
    }
    return getComputedStyle(obj, null)[attr];
輪播圖

css樣式

<style type="text/css">
            body,ul,li{
                padding: 0;
                margin: 0;
            }
            li{
                list-style: none;
            }
            img{
                display: block;
                border: none;
            }
            #scrollBanner{
                width: 900px;
                height: 300px;
                overflow: hidden;
                position: relative;
                }
            #scrollList {
                position: absolute;
                height: 300px;
            }
            #scrollList li{
                float: left;
                width: 900px;
                height: 300px;
            }
            #scrollList img{
                width: 900px;
                height: 300px;
            }
            #btns div{
                position: absolute;
                top: 50%;
                width: 50px;
                height: 50px;
                margin-top: -25px;
                background: #000;
                opacity: .3;
                line-height: 50px;
                text-align: center;
                font-size: 50px;
                color: white;
                cursor: pointer;
            }
            #btns div:first-child{
                left:50px;
            }
            #btns div:last-child{
                right:50px;
            }
            #nums{
                position: absolute;
                bottom: 20px;
                right: 20px;
            }
            #nums li{
                float: left;
                width: 20px;
                height: 20px;
                text-align: center;
                line-height: 20px;
                background: white;
                color: red;
                cursor: pointer;
                margin:0 10px;
                border-radius: 50%;
            }
            #nums li.hover,#nums li:hover{
                background: red;
                color: white;
            }
        </style>

html布局

<div id="scrollBanner">
                <ul id="scrollList">
                    <li><img src="img/1.jpg"></li>
                    <li><img src="img/2.jpg"></li>
                    <li><img src="img/3.jpg"></li>
                    <li><img src="img/1.jpg"></li>
                </ul>
                <div id="btns">
                    <div>&lt;</div>
                    <div>&gt;</div>
                </div>
                <ul id="nums">
                    <li class="hover">1</li>
                    <li>2</li>
                    <li>3</li>
                </ul>
        </div>

js實(shí)現(xiàn)代碼

<script src="startMove.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            var oScrollBanner = document.getElementById("scrollBanner");
            var oScrollList = document.getElementById("scrollList");
            var aList  =oScrollList.children;
            var perWidth = aList[0].offsetWidth;
            oScrollList.style.width = perWidth * aList.length + "px";
            var i = 0;
            
            var timer = setInterval(function(){
                move();
            },3000);
            
            function move(){
                i++;
                if(i==aList.length){
                    oScrollList.style.left = 0;
                    i = 1;
                }
                if(i==-1){
                    oScrollList.style.left = -perWidth * (aList.length-1) + "px";
                    i = aList.length - 2;
                }
                
                //控制角標(biāo)的變化
                for(var j = 0; j < aNumsList.length; j++){
                    aNumsList[j].className = "";
                }
                if(i==aList.length - 1){
                    aNumsList[0].className = "hover";
                }else{
                    aNumsList[i].className = "hover";
                }
                
                
                startMove(oScrollList,{left:-perWidth*i});
            }
            
            //左右按鈕實(shí)現(xiàn)圖片切換
            var oBtns = document.getElementById("btns");
            var oPrev = oBtns.children[0];
            var oNext = oBtns.children[1];
            
            oNext.onclick = function(){
                move();
            }
            oPrev.onclick = function(){
                i-=2;
                move();
            }
            
            oScrollBanner.onmouseover = function(){
                clearInterval(timer);
            }
            oScrollBanner.onmouseout = function(){
                timer = setInterval(function(){
                    move();
                },3000);
            }
            //角標(biāo)變化
            var oNums = document.getElementById("nums");
            var aNumsList = oNums.children;
            
            for(let j = 0; j < aNumsList.length; j++){
                aNumsList[j].onmouseover = function(){
                    i = j-1;
                    move();
                }
            }
        </script>
星級(jí)評價(jià)

html代碼:

<ul>
    <li></li>  //css樣式給li加的背景圖
    <li></li>
    <li></li>
    <li></li>       
    <li></li>
</ul>

js代碼:

var aLi = document.getElementsByTagName('li');
var flag = false;
var index = 0; //表示點(diǎn)擊了哪個(gè)星星
for(let i = 0; i < aLi.length; i++){
   aLi[i].onmouseover = function(){
      for(var j = 0; j < aLi.length; j++){
         //用的是背景圖,改變定位信息即可
         aLi[j].style.backgroundPosition = "0 0";
      }
      for(var j = 0; j <= i; j++){
         aLi[j].style.backgroundPosition = "0 -28px";
      }
   }
   aLi[i].onmouseout = function(){
      for(var j = 0; j < aLi.length; j++){
         aLi[j].style.backgroundPosition = "0 0";
      }
      if(flag){
         for(var j = 0; j <= index; j++){
            aLi[j].style.backgroundPosition = "0 -28px";
         }
      }
      
   }
   aLi[i].onclick = function(){
      flag = true;
      index = i;
   }
}
放大鏡

css代碼:

<style type="text/css">

    body,ul,li{
    margin: 0;
    padding: 0;
    }
    body{
    height: 1000px;
    }
    ul,li{
    list-style: none;
    }
    img{
    display: block;
    border: none;
    }
    #zoomBox{
    position: relative;
    margin: 20px;
    width: 400px;
    border: 1px solid #CECECE;
    }
    #midArea img{
    width: 400px;
    height: 400px;
    }
    #midArea{
    cursor: move;
    }
    #zoom{
    display: none;
    position: absolute;
    width: 200px;
    height: 200px;
    background: yellow;
    opacity: .5;
    }
    #bigArea{
    display: none;
    position: absolute;
    left: 400px;
    top: -1px;
    border: 1px solid #CECECE;
    width: 400px;
    height: 400px;
    overflow: hidden;
    }
    #bigArea img{
    position: absolute;
    width: 800px;
    height: 800px;
    }
    #smallArea ul{
    display: flex;
    height: 100px;
    width: 400px;
    border-top: 1px solid #CECECE;
    align-items: center;
    justify-content: space-around;
    }
    #smallArea li{
    border: 2px solid white;
    padding: 6px;
    }
    #smallArea li:hover,#smallArea li.hover{
    border: 2px solid red;
    }
    #smallArea img{
    width: 60px;
    height: 60px;
    }
</style>

html布局代碼

<div id="zoomBox">
            <div id="midArea">
                <img src="img/m01.jpg">
                <div id="zoom"></div>
            </div>
            <div id="bigArea">
                <img src="img/m01.jpg">
            </div>
            <div id="smallArea">
                <ul>
                    <li class="hover"><img src="img/m01.jpg"></li>
                    <li><img src="img/m02.jpg"></li>
                    <li><img src="img/m03.jpg"></li>
                    <li><img src="img/m04.jpg"></li>
                    <li><img src="img/m05.jpg"></li>
                </ul>
            </div>
        </div>

js實(shí)現(xiàn)代碼

var oMidArea = document.getElementById("midArea");
            var oZoom = document.getElementById("zoom");
            var oBigArea = document.getElementById("bigArea");
            var oZoomBox = document.getElementById("zoomBox");
            var oBigImg = oBigArea.children[0];
            var oSmallArea = document.getElementById("smallArea");
            var aSmallList = oSmallArea.children[0].children;
            var oMidImg = oMidArea.children[0];
            
            oMidArea.onmouseover = function(){
                oZoom.style.display = "block";
                oBigArea.style.display = "block";
            }
            oMidArea.onmouseout = function(){
                oZoom.style.display = "none";
                oBigArea.style.display = "none";
            }
            
            
            oMidArea.onmousemove = function(e){
                
                //控制放大鏡的移動(dòng)
                var evt = e || event;
                var x = evt.pageX - oZoomBox.offsetLeft - oZoom.offsetWidth/2;
                var y = evt.pageY - oZoomBox.offsetTop -  oZoom.offsetHeight/2;
                
                if(x <= 0){
                    x = 0;
                }
                if(x >= oMidArea.offsetWidth - oZoom.offsetWidth){
                    x = oMidArea.offsetWidth - oZoom.offsetWidth;
                }
                if(y <= 0){
                    y = 0;
                }
                if(y >= oMidArea.offsetHeight - oZoom.offsetHeight){
                    y = oMidArea.offsetHeight - oZoom.offsetHeight;
                }
                
                oZoom.style.left = x + "px";
                oZoom.style.top = y + "px";

                //控制大圖的移動(dòng)
                oBigImg.style.left = - oZoom.offsetLeft/oMidArea.offsetWidth * oBigImg.offsetWidth + "px";
                oBigImg.style.top = - oZoom.offsetTop/oMidArea.offsetHeight * oBigImg.offsetHeight + "px";
                
            }
        
            //點(diǎn)擊縮略圖 切圖片
            
            for(let i = 0; i < aSmallList.length; i++){
                aSmallList[i].onclick = function(){
                    for(var j = 0; j < aSmallList.length; j++){
                        aSmallList[j].className = "";
                    }
                    aSmallList[i].className = "hover";
                    
                    oMidImg.src = aSmallList[i].children[0].src;
                    oBigImg.src = aSmallList[i].children[0].src;
                    
                }
            }
定時(shí)器案例

循環(huán)打印5,6,7,8,9,10,9,8,7,6,5,6,7…循環(huán)輸出

var a=4;
        var b=1;
        setInterval(function(){
            a=a+b;
            if(a==10){
                b=-1;
            }else if(a==5){
                b=1;
            }
            console.log(a);
        },500);
ajax

ajax的基本封裝 ----必須掌握

function ajax(url,fn){
    if(window.XMLHttpRequest){
        var xhr = new XMLHttpRequest();
    }else{
        var xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    xhr.open("get",url,true);
    xhr.send();
    
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                var data = xhr.responseText;
                fn(data);
            }
        }
    }
}

ajax的完整封裝
function ajax(obj){
    //obj -> type url data success
    var str = "";
    for(var key in obj.data){
        str += key+"="+obj.data[key]+"&";
    }
    //str = str.substring(0,str.length-1);
    str = str.replace(/&$/,"");
    
    if(window.XMLHttpRequest){
        var xhr = new XMLHttpRequest();
    }else{
        var xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    if(obj.type.toUpperCase()=="GET"){
        if(obj.data){
            var url = obj.url + "?" + str;
        }else{
            var url = obj.url;
        }
        
        xhr.open("get",url,true);
        xhr.send();
    }
    if(obj.type.toUpperCase()=="POST"){
        xhr.open("post",obj.url,true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(str);
    }
    
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                var data = xhr.responseText;
                obj.success(data);
            }
        }
    }
}
頁碼
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
        *{
        margin: 0;
        padding: 0;
        }
    
        #list{
        width: 500px;
        }
        #list li{
        border-bottom: 1px solid #ccc;
        height: 40px;
        line-height: 40px;
        list-style: none;
        }
        #btm{
        margin-top: 20px;
        }
        #btm li{
        float: left;
        margin: 0 10px;
        border:1px solid #ccc;
        list-style: none;
        background: orange;
        padding: 0 6px;
        }
        #osp span{
        display: inline-block;
        padding: 0 10px;
        margin: 0 5px;
        background: red;
        }
        </style>
    </head>
    <body>
        <ul id="list"></ul>
        <ul id="btm">
            <li>上一頁</li>
            <li>首頁</li>
            <li id="osp"></li>
            <li>下一頁</li>
            <li>尾頁</li>
        </ul>
    <script src="ajax.js"></script>
    <script>
    var list=document.getElementById("list");
    var btm=document.getElementById("btm");
    var oli=btm.children;
    var osp=document.getElementById("osp");
    
    ajax("data.json",foo);
    
    function foo(data){
         data=JSON.parse(data);
         var tatalnums=data.length;
         var pernums=5;
        var numsp=Math.ceil(tatalnums/pernums); //得到具體的頁數(shù)
    
        //創(chuàng)建具體的頁碼數(shù)字
        var str="";
        for(var i=0;i<numsp;i++){
            str+=`<span>${i+1}</span>`;
        }
        osp.innerHTML=str;
        
        //默認(rèn)顯示第一頁的內(nèi)容
        index=0;
        click(index);
        
        //上一頁事件
        var index=0;
        oli[0].onclick=function(){
            index--;
            if(index<=0){
                index=0;
            }
            click(index);
        }
        
        function click(index){
            var str1="";
            for(var i=index*pernums;i<Math.min(data.length,(index+1)*pernums);i++){
                str1+=`<li>${data[i]}</li>`;
            }
            list.innerHTML=str1;
        }
        
        //首頁
        oli[1].onclick=function(){
            index=0;
            click(index);
        }
        
        //下一頁
        oli[oli.length-2].onclick=function(){
            index++;
            if(index>=numsp-1){
            index=numsp-1;
            }
            click(index);
        }
        
        //尾頁
        oli[oli.length-1].onclick=function(){
            index=numsp-1;
            click(index);
        }
        
        //具體頁
        
        var ospan=osp.children;
        for(var i=0;i<ospan.length;i++){
            ospan[i].index=i;
            ospan[i].onclick=function(){
            index=this.index;
                click(index);
            }
        }
    }
    </script>
    </body>
</html>
data.json數(shù)據(jù):

["111","2222","3333","2222","3333","2222","3333","2222","3333","2222","3333","2222","3333","2222","3333","2222","3333","2222","3333","2222","3333","2222","4444","2222","3333","55555","3333","2222","3333","2222","3333","2222","6666"]
1
自動(dòng)補(bǔ)全
html樣式代碼

<input type="text" name="txt" id="txt" />
<ul id="list"></ul>

js代碼:

var oTxt = document.getElementById("txt");
            var oList = document.getElementById("list");
            oTxt.oninput = function(){
                ajax({
                    type:"post",
                    url:"index.php",
                    data:{"kw":oTxt.value},
                    success:function(data){
                        data = JSON.parse(data);
                        var str = "";
                        for(var i = 0; i < data.length; i++){
                            str += `<li>${data[i]}</li>`;
                        }
                        oList.innerHTML = str;
                    }
                })
            }

index.php文件代碼:

<?php
$kw = $_POST["kw"];
$arr = ["a","aa","aba","aaaa","aaaaaaaaa"];
$newArr = [];
foreach($arr as $val){
   
   if($kw == substr($val,0,strlen($kw))){
      array_push($newArr,$val);
   }
   
}

$json = json_encode($newArr);

echo $json;

?>

jsonp -------百度接口
html結(jié)構(gòu)代碼

搜索<input type="text" id="txt">
<ul id="list">
   
</ul>

js代碼

<script type="text/javascript">
   var oTxt = document.getElementById("txt");
   var oList = document.getElementById("list");
   //給文本框添加輸入事件
   oTxt.oninput = function(){
   //jsonp請求窗怒,得到的是callback包裹的函數(shù)
      var oScript = document.createElement("script");
      oScript.src = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+oTxt.value+"&cb=aa";
      document.body.appendChild(oScript);
      document.body.removeChild(oScript);
   }
  //接收傳來的數(shù)據(jù)并進(jìn)行處理
   function aa(data){
      data = data.s;
      var str = "";
      data.forEach(function(item){
         str += `<li><a >${item}</a></li>`;
      })
      oList.innerHTML = str;
      }
</script>
promise

promise-ajax的封裝

function ajax(url){
//創(chuàng)建promise對象
   var promise = new Promise(function(resolve,reject){
   //創(chuàng)建ajax對象
         if(window.XMLHttpRequest){
            var xhr = new XMLHttpRequest();
         }else{
            var xhr = new ActiveXObject("Microsoft.XMLHTTP");
         }
         
         xhr.open("get",url,true);
         xhr.send();
         
         xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){
               if(xhr.status == 200){
                  var data = xhr.responseText;
                  resolve(data);
               }else{
                  reject();
               }
            }
         }
   
   })
   return promise;  //返回promise對象
}

紅綠燈

html結(jié)構(gòu)代碼

<ul id="traffic" class="">
    <li id="green"></li>
    <li id="yellow"></li>
    <li id="red"></li>
</ul>

css樣式代碼:

ul {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    }
    /*畫3個(gè)圓代表紅綠燈*/

    ul>li {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    opacity: 0.2;
    display: inline-block;
    }
    /*執(zhí)行時(shí)改變透明度*/

    ul.red>#red,
    ul.green>#green,
    ul.yellow>#yellow {
    opacity: 1.0;
    }
    /*紅綠燈的三個(gè)顏色*/

    #red {
    background: red;
    }

    #yellow {
    background: yellow;
    }

    #green {
    background: green;
}

js實(shí)現(xiàn)代碼:

function timeout(timer) {
     return function() {
          return new Promise(function(resolve, reject) {
                setTimeout(resolve, timer)
                     })
                 }
             }
         var green = timeout(1000);
         var yellow = timeout(1000);
         var red = timeout(1000);
         var traffic = document.getElementById("traffic");
        
         (function restart() {
             'use strict' //嚴(yán)格模式
             traffic.className = 'green';
             green().then(function() {
                     traffic.className = 'yellow';
                     return yellow();
                 })
                 .then(function() {
                     traffic.className = 'red';
                     return red();
                 }).then(function() {
                     restart()
                 })
         })();
閉包案例

編寫一個(gè)求和函數(shù)sum映跟,使輸入sum(2)(3)或輸入sum(2,3),輸出結(jié)果相同

可以傳入多個(gè)參數(shù)

function sum(){    
    var num = arguments[0];    
    if(arguments.length==1){       
    return function(sec){           
        return num+sec;       
            }    
        }else{        
        var num = 0;        
        for(var i = 0;i<arguments.length;i++){           
            num = num + arguments[i];        
            }   
            return num;    
        }
    }
遞歸----深拷貝
function deepCopy(obj){
                if(Array.isArray(obj)){
                    var newobj=[];
                }else{
                    var newobj={};
                }
                
                for(var i in obj){
                    if(typeof obj[i]=="object"){
                     newobj[i]=deepCopy(obj[i]);
                        
                    }else{
                        newobj[i]=obj[i];
                    }
                }
                return newobj;
            }
觀察者模式案例

觀察者模式(發(fā)布-訂閱模式):其定義對象間一種一對多的依賴關(guān)系扬虚,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí)努隙,所有依賴于它的對象都將得到通知


var observer = {
   regist:function(eventName,callback){
      if(!this.obj){
         this.obj = {};
      }
      if(!this.obj[eventName]){
         this.obj[eventName] = [callback];
      }else{
         this.obj[eventName].push(callback);
      }
   },
   emit:function(eventName){
      for(var i = 0; i < this.obj[eventName].length; i++){
         this.obj[eventName][i]();
      // this.obj[eventName][i](arguments[n]); 有參數(shù)的
      }
   },
   remove:function(eventName,callback){
      for(var i = 0; i < this.obj[eventName].length; i++){
         if(this.obj[eventName][i] == callback){
            this.obj[eventName].splice(i,1);
         }
      }
   }
}

//給三個(gè)模塊注冊事件
observer.regist("loginSuccess",function(){
   console.log("用戶信息模塊接收到了登錄成功的消息,做出了響應(yīng)");
})
observer.regist("loginSuccess",function(){
   console.log("購物車模塊接收到了登錄成功的消息辜昵,做出了響應(yīng)");
})
observer.regist("loginSuccess",function(){
   console.log("消息模塊接收到了登錄成功的消息荸镊,做出了響應(yīng)");
})

observer.emit("loginSuccess");  //廣播
JQ
全選和反選:

簡單的布局:

<input type="checkbox" id="checkAll">全選
<input type="checkbox" id="checkOther">反選
<ul>
   <li><input type="checkbox"></li>
   <li><input type="checkbox"></li>
   <li><input type="checkbox"></li>
   <li><input type="checkbox"></li>
   <li><input type="checkbox"></li>
   <li><input type="checkbox"></li>
</ul>

jq代碼: 思路:下面的狀態(tài)和全選的狀態(tài)一致,和反選的狀態(tài)相反的

$(function(){
    //全選
   $("#checkAll").click(function(){
        //讓li 下的input的狀態(tài)和當(dāng)前的這個(gè)保持一致
      $("li input").prop("checked",$(this).prop("checked"));
   });
   //反選
   $("#checkOther").click(function(){
        //遍歷下面的每一個(gè)堪置,讓它的狀態(tài)和它當(dāng)前的狀態(tài)相反
      $("li input").each(function(){
         $(this).prop("checked",!$(this).prop("checked"));
      })
   });
   //下方
   $("li input").click(function(){
        //根據(jù)選中狀態(tài)的長度判斷下方是否都選上了
      if($("li input:checked").length == $("li input").length){
         $("#checkAll").prop("checked",true);
      }else{
         $("#checkAll").prop("checked",false);
      }
   })
})
手風(fēng)琴

html結(jié)構(gòu)

<div id="acc">
   <ul>
       <li class="active">
           <h3 class="active">紅玫瑰</h3>
           <div><img src="img/bg1.jpg"></div>
       </li>
       <li>
           <h3>白玫瑰</h3>
           <div><img src="img/bg2.jpg"></div>
       </li>
       <li>
           <h3>白玫瑰</h3>
           <div><img src="img/bg3.jpg"></div>
       </li>
       <li>
           <h3>白玫瑰</h3>
           <div><img src="img/bg4.jpg"></div>
       </li>
       <li class="last">
           <h3>白玫瑰</h3>
           <div><img src="img/bg5.jpg"></div>
       </li>
   </ul>

</div>

JQ代碼

<script src="jquery-1.11.0.js"></script>
<script>
    $(function(){
        $("#acc li").on("mouseenter",function(){
            $(this).stop().animate({"width":434}).find("h3").addClass("active")
                    .end().siblings().stop().animate({"width":50}).find("h3").removeClass("active")
        })
    })
</script>
多級(jí)下拉菜單

html結(jié)構(gòu)

<ul>
            <li>主題市場
                <ul>
                    <li>運(yùn)動(dòng)派
                        <ul>
                            <li>三級(jí)菜單a</li>
                            <li>三級(jí)菜單b</li>
                            <li>三級(jí)菜單c</li>
                            <li>三級(jí)菜單d</li>
                        </ul>
                    </li>
                    <li>有車族
                        <ul>
                            <li>三級(jí)
                                <ul>
                                    <li>四級(jí)</li>
                                    <li>四級(jí)</li>
                                    <li>四級(jí)</li>
                                </ul>
                            </li>
                            <li>三級(jí)</li>
                            <li>三級(jí)</li>
                            <li>三級(jí)</li>
                        </ul>
                    </li>
                    <li>生活家</li>
                </ul>
            </li>
            <li>特色購物
                <ul>
                    <li>淘寶二手</li>
                    <li>拍賣會(huì)</li>
                    <li>愛逛街</li>
                    <li>全球購</li>
                    <li>淘女郎</li>
                </ul>
            </li>
            <li>優(yōu)惠促銷
                <ul>
                    <li>天天特價(jià)</li>
                    <li>免費(fèi)試用</li>
                    <li>清倉</li>
                    <li>1元起拍</li>
                </ul>
            </li>
            <li>工具</li>
        </ul>

JQ代碼: 用了多種方式躬存,練習(xí)jq的用法

<script type="text/javascript" src="js/jquery-1.11.0.js"></script>
        <script type="text/javascript">
            
            $(function(){
                //給每一個(gè)有ul(有子菜單)的li添加一個(gè)圖標(biāo)
                //添加點(diǎn)擊事件,展開收縮
                //$("li:has(ul)").css("list-style-image","url(img/plus.gif)")
                $("li:has(ul)").addClass("plus")
                //鏈?zhǔn)秸{(diào)用
                .click(function(e){
                    //e.stopPropagation();
                    //$(this).css("list-style-image","url(img/minus.gif)");
                    //$(this).toggleClass('minus');
                    if($(e.target).children().length){
                    if($(this).children().is(":hidden")){
                        $(this).css("list-style-image","url(img/minus.gif)");
                    }else{
                        $(this).css("list-style-image","url(img/plus.gif)");
                    }
                    $(this).children().slideToggle();
                    }
                    return false;
                })
                
            })
                
        </script>
輪播案例

html

<div id="main">
            <div class="pic">
                <ul>
                    <li style="background: url(img/bg1.jpg);">
                        <img class="img1" src="img/text1.png"/>
                        <img class="img2" src="img/con1.png"/>
                    </li>
                    <li style="background: url(img/bg2.jpg);">
                        <img class="img1" src="img/text2.png"/>
                        <img class="img2" src="img/con2.png"/>
                    </li>
                    <li style="background: url(img/bg3.jpg);">
                        <img class="img1" src="img/text3.png"/>
                        <img class="img2" src="img/con3.png"/>
                    </li>
                    <li style="background: url(img/bg4.jpg);">
                        <img class="img1" src="img/text4.png"/>
                        <img class="img2" src="img/con4.png"/>
                    </li>
                    <li style="background: url(img/bg5.jpg);">
                        <img class="img1" src="img/text5.png"/>
                        <img class="img2" src="img/con5.png"/>
                    </li>

                </ul>
            </div>
            <div class="nav">
                <ul>
                    <li class="select"></li>
                    <li></li>
                    <li></li>
                    <li></li>
                    <li></li>
                </ul>
            </div>
            
        </div>

JQ代碼

<script type="text/javascript" src="js/jquery-1.11.3.js"></script>
        <script type="text/javascript">
            $(function(){
                $(".pic li").eq(0).find(".img1").stop().animate({"left":0},1000)
                .next().show().stop().animate({"left":0},1000);
                var i = 0;
                var timer = setInterval(function(){
                    i++;
                    if(i==$(".pic li").length){
                        i = 0;
                    }
                    $(".pic li").eq(i).fadeIn().find(".img1").stop().animate({"left":0},1000)
                    .next().show().stop().animate({"left":0},1000)
                    //.parent().siblings().fadeOut().find(".img1").css("left",-760).next().hide().css("left",-20);
//移除樣式也可以用這種方法                  .parent().siblings().fadeOut().children().removeAttr("style");
                    
                    $(".nav li").eq(i).addClass("select").siblings().removeClass("select");
                },2000);
            })
        </script>
樓梯

html結(jié)構(gòu)

<div id="floorNav">
    <ul>
        <li>1F<span>服飾</span></li>
        <li>2F<span>美妝</span></li>
        <li>3F<span>手機(jī)</span></li>
        <li>4F<span>家電</span></li>
        <li>5F<span>數(shù)碼</span></li>
        <li>6F<span>運(yùn)動(dòng)</span></li>
        <li>7F<span>居家</span></li>
        <li>8F<span>母嬰</span></li>
        <li>9F<span>食品</span></li>
        <li>10F<span>圖書</span></li>
        <li>11F<span>服務(wù)</span></li>
        <li>TOP</li>
    </ul>
</div>
<div id="header"></div>
<div id="content">
    <ul>
        <li style="background: #8B0000;">服飾</li>
        <li style="background: #123;">美妝</li>
        <li style="background: #667;">手機(jī)</li>
        <li style="background: #558;">家電</li>
        <li style="background: #900;">數(shù)碼</li>
        <li style="background: #456;">運(yùn)動(dòng)</li>
        <li style="background: #789;">居家</li>
        <li style="background: #234;">母嬰</li>
        <li style="background: #567;">食品</li>
        <li style="background: #887;">圖書</li>
        <li style="background: #980;">服務(wù)</li>
    </ul>
</div>
<div id="footer"></div>

js代碼

<script src="jquery-1.11.0.js"></script>
<script>
    //滾動(dòng)到某值讓小nav顯示
    $(function(){
        var flag=true;
        $(window).scroll(function(){
            if(flag){
            //滾動(dòng)條的顯示與隱藏
            var scrolltop=$(this).scrollTop();
            if(scrolltop>300){
                $("#floorNav").fadeIn();
            }else{
                $("#floorNav").fadeOut();
            }

            //隨著滾動(dòng)顯示對應(yīng)的內(nèi)容
            //判斷offset.top-outheight/2和scrolltop的值
                $("#content li").each(function(){
                    if(scrolltop>=$(this).offset().top-$(this).outerWidth()/2){
                        var index=$(this).index();
                        $("#floorNav li").eq(index).addClass("hover").siblings().removeClass("hover");

                    }
                })
            }
        })

        //給每個(gè)小nav注冊點(diǎn)擊事件,不包含最后一個(gè)
        $("#floorNav li:not(:last)").click(function(){
           flag=false;
            var index= $(this).index();
            $("#floorNav li").eq(index).addClass("hover").siblings().removeClass("hover");
          $("html,body").stop().animate({"scrollTop":$("#content li").eq(index).offset().top},800,function(){
              flag=true;
          });
        })
        //回到頂部的事件
        $("#floorNav li:last").click(function(){
            $("html,body").stop().animate({"scrollTop":0});
        })
        
    })
</script>
商城后臺(tái)接口

先建數(shù)據(jù)庫,建好之后舀锨,開始接口的操作

1.創(chuàng)建連接數(shù)據(jù)庫的接口 conn.php

<?php
//防止中文亂碼
header("content-type:text/html;charset=utf-8");
//連接數(shù)據(jù)庫
$conn=new mysqli("localhost","root","","work2");
//判斷是否連接成功
if($conn->connect_error){
    die("連接失敗".$conn->connect_error);
}

2.創(chuàng)建注冊接口 register.php
//我的用戶表是 users

用戶名不能重復(fù)

請求方式:get岭洲,post都支持

參數(shù) :用戶名 usename ,密碼 password

<?php
header("content-type:text/html;charset=utf-8");
//連接數(shù)據(jù)庫
include_once "connect.php";
//接收數(shù)據(jù)
$usename=$_REQUEST["usename"];
$pwd=$_REQUEST["password"];

//先判斷數(shù)據(jù)庫中是否有相同的數(shù)據(jù)坎匿,如果有則插入失敗盾剩,無則插入成功
$sq="select usename from users where usename=$usename";
$result=$conn->query($sq);
if ($result->num_rows>0){
    $data=array('msg'=>'注冊失敗','code'=>'0');
    echo json_encode($data,JSON_UNESCAPED_UNICODE);
}else{
    //讓插入的數(shù)據(jù)從1開始
    $sq="alter table users auto_increment=1";
    $conn->query($sq);
   //插入數(shù)據(jù)庫中的表
    $sql="insert into users (usename,pwd) values
   ('$usename','$pwd')";
//執(zhí)行,返回?cái)?shù)據(jù)
    $conn->query($sql);
    $data=array('msg'=>'注冊成功','code'=>'1');
    //將數(shù)組轉(zhuǎn)成json字符串
    echo json_encode($data,JSON_UNESCAPED_UNICODE);
}

3.創(chuàng)建登錄接口 login.php
必須先注冊才能登錄

請求方式:get,post 都支持

參數(shù):用戶名 usename

<?php
header("content-type:text/html;charset=utf-8");
include_once "connect.php";
$usename=$_REQUEST["usename"];
$sql="select usename from users where usename=$usename";
$result=$conn->query($sql);
$sql1="select id from users where usename=$usename";
$result1=$conn->query($sql1);
if($result->num_rows>0){
    while ($row=$result1->fetch_assoc()) {
        $oid = $row["id"];
    }

   $data=array("code"=>"1",
        "msg"=>"ok",
        "data"=>array("token"=>"$oid")
    );
    echo json_encode($data,JSON_UNESCAPED_UNICODE);
}else{
    echo "0";  //登錄失敗替蔬,先注冊再登錄
}

4.商品列表接口 protects.php
//我的產(chǎn)品表是protects

無需參數(shù)

<?php
header("content-type:text/html;charset=utf-8");
include_once "connect.php";
$sql ="select * from protects";
$result=$conn->query($sql);
if($result->num_rows){
    $prot=[];
    $data=[];  //不用多個(gè)數(shù)組嵌套只能獲取到一組數(shù)組
    while ($row=$result->fetch_assoc()){
        //將數(shù)據(jù)庫中的數(shù)據(jù)添加到data數(shù)組中
        Array_push($data,[
            "pid"=>$row["pid"],
            "pname"=>$row["pname"],
            "pimg"=>$row["pimg"],
            "pchar"=>$row["pchar"]
        ]);
    }
    //循環(huán)完之后告私,再將data添加到最外層prot數(shù)組中
    $prot["msg"]="查詢成功";
    $prot["data"]=$data;

  echo json_encode($prot,JSON_UNESCAPED_UNICODE);
}

5.詳情頁接口 details.php
參數(shù):商品的 pid

請求方式:get,post 都支持

<?php
header("content-type:text/html;charset=utf-8");
include_once "connect.php";
$id=$_REQUEST["id"];
//獲取一整條數(shù)據(jù)承桥,select 字段 where 獲取的就是一個(gè)字段值
$sql="select * from protects where pid=$id";
$result=$conn->query($sql);
if($result->num_rows){
   $data=[];
   while($row=$result->fetch_assoc()){
       Array_push($data,[
           "pid"=>$row["pid"],
           "pname"=>$row["pname"],
           "pimg"=>$row["pimg"],
           "pchar"=>$row["pchar"]
       ]);
   }
   $data=json_encode($data,JSON_UNESCAPED_UNICODE);
   echo $data;
}

6.添加購物車的接口 add-protect.php
請求方式:get驻粟,post都支持

參數(shù):用戶 uid ,商品 pid ,添加商品的數(shù)量 numbers

<?php

header("content-type:text/html;charset=utf-8");
include_once "connect.php";

//添加商品凶异,用戶id蜀撑,商品id,商品數(shù)量

$uid=$_REQUEST["uid"];
$pid=$_REQUEST["pid"];
$numbers=$_REQUEST["numbers"];

$data1=["code"=>"1","msg"=>"加入成功"];
$data1=json_encode($data1,JSON_UNESCAPED_UNICODE);
$data2=["code"=>"0","msg"=>"加入失敗".$conn->error];
$data2=json_encode($data2,JSON_UNESCAPED_UNICODE);
//先判斷數(shù)據(jù)庫中是否有這條數(shù)據(jù)
$sql1="select * from uplink where uid=$uid and pid=$pid";
$result=$conn->query($sql1);
//如果有這條數(shù)據(jù)唠帝,只需修改數(shù)據(jù)值屯掖,無,則新插入進(jìn)去
if($result->num_rows){
    $sql3="select numbers from uplink where uid=$uid and pid=$pid";
    $res=$conn->query($sql3);
    while ($row1=$res->fetch_assoc()){
        $resnum=$row1["numbers"];
    }
    $numbers=$numbers+$resnum;
    $sql2="update uplink set numbers=$numbers where uid=$uid and pid=$pid";
    if ($conn->query($sql2)){
        echo $data1;
    }else{
        echo $data2;
    }
}else{
    $sq="alter table users auto_increment=0";
    $conn->query($sq);
 //字段值用 , 分開襟衰,再錯(cuò)錘死你
    $sql="insert into uplink (uid,pid,numbers) values
    ('$uid','$pid','$numbers')";
    if($conn->query($sql)){
        echo $data1;
    }else{
        echo $data2;
    }
}

7.獲取購物車列表的接口 cart-list.php
請求方式:get贴铜,post 都支持

參數(shù): 用戶 uid

<?php
header("content-type:text/html;charset=utf-8");
include_once "connect.php";

//獲取購物車列表, 用戶id
$uid=$_REQUEST["uid"];
/*$sql1="alter table uplink add constraint fk_pid foreign
key (pid) references protects(pid)";
$conn->query($sql1);*/
/*多表查詢時(shí),需給子表添加外鍵約束,如果表已經(jīng)創(chuàng)建好绍坝,在軟件的SQL面板中運(yùn)行下方的代碼
 *  alter table 子表明 add constraint fk_pid foreign
    key (pid) references protects(pid)
     //子表                 //主表
 * */
//兩個(gè)表聯(lián)合查詢徘意,先從主表中查,再從子表中查
$sql="select * from protects u 
  join uplink p on u.pid=p.pid where uid=$uid 
";

/*  //將表中的字段求和轩褐,對該欄賦個(gè)別名                 group by 分組
 * $sql="select pid,sum(numbers) as numbers from uplink where uid=$uid group by pid";*/
/*$sql="select pid,numbers from uplink where uid=$uid";*/
$result=$conn->query($sql);
if($result->num_rows){
//    $wrap=[];
    $data=[];
    $pid=[];
    while ($row=$result->fetch_assoc()){
        Array_push($data,[
            "pid"=>$row["pid"],
            "numbers"=>$row["numbers"],
            "pname"=>$row["pname"],
            "pimg"=>$row["pimg"],
            "pchar"=>$row["pchar"]
        ]);

    }
    $wrap["data"]=$data;
    $wrap["msg"]="查詢成功";
    $wrap=json_encode($wrap,JSON_UNESCAPED_UNICODE);
    echo $wrap;
}else{
    echo "查詢失敗.$conn->error";
}

8.修改購物車的接口 modifycart.php
請求方式:get椎咧,post 都支持

參數(shù):用戶 uid , 商品 pid ,修改的商品數(shù)目(>0 增加,<0 減少, =0 刪除)

<?php
header("content-type:text/html;charset=utf-8");
include_once "connect.php";

//修改購物車, 用戶id把介,商品id勤讽,修改的商品數(shù)目(>0 增加,<0 減少, =0 刪除)
$uid=$_REQUEST["uid"];
$pid=$_REQUEST["pid"];
$nums=$_REQUEST["nums"];

$sql="select * from uplink where uid=$uid and pid=$pid";
$result=$conn->query($sql);
if($result->num_rows){
    $sql1="select numbers from uplink where uid=$uid and pid=$pid";
    if($nums>0){
        $res1=$conn->query($sql1);
            while ($row1=$res1->fetch_assoc()){
                $resnum1=$row1["numbers"];
            }
        $resnum1=$resnum1+$nums;
        $sql2="update uplink set numbers=$resnum1 where uid=$uid and pid=$pid";
        if($conn->query($sql2)){
            $data=["code"=>"1","msg"=>"修改成功 + "];
            echo json_encode($data,JSON_UNESCAPED_UNICODE);
        }else{
            $data=["code"=>"0","msg"=>"修改失敗.$conn->error"];
            echo json_encode($data,JSON_UNESCAPED_UNICODE);
        }

    }else if($nums<0){
        $res1=$conn->query($sql1);
        while ($row1=$res1->fetch_assoc()){
            $resnum1=$row1["numbers"];
        }
        $resnum1=$resnum1+$nums;
        $sql2="update uplink set numbers=$resnum1 where uid=$uid and pid=$pid";
        if($conn->query($sql2)){
            $data=["code"=>"1","msg"=>"修改成功 - "];
            echo json_encode($data,JSON_UNESCAPED_UNICODE);
        }

    }else if($nums==0){
        //等于0 ,直接刪除該數(shù)據(jù)
        $sql3="delete from uplink where uid=$uid and pid=$pid";
        if($conn->query($sql3)){
            $data=["code"=>"1","msg"=>"修改成功,該條數(shù)據(jù)已刪除"];
            echo json_encode($data,JSON_UNESCAPED_UNICODE);
        }

    }

}else{
    echo "購物車還沒有該商品哦";
}

復(fù)制于qq_43101321的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拗踢,一起剝皮案震驚了整個(gè)濱河市脚牍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巢墅,老刑警劉巖诸狭,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異君纫,居然都是意外死亡驯遇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門蓄髓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叉庐,“玉大人,你說我怎么就攤上這事双吆≌;#” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵好乐,是天一觀的道長。 經(jīng)常有香客問我瓦宜,道長蔚万,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任临庇,我火速辦了婚禮反璃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘假夺。我一直安慰自己淮蜈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布已卷。 她就那樣靜靜地躺著梧田,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裁眯,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天鹉梨,我揣著相機(jī)與錄音,去河邊找鬼穿稳。 笑死存皂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逢艘。 我是一名探鬼主播旦袋,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼它改!你這毒婦竟也來了疤孕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤搔课,失蹤者是張志新(化名)和其女友劉穎胰柑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爬泥,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柬讨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袍啡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踩官。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖境输,靈堂內(nèi)的尸體忽然破棺而出蔗牡,到底是詐尸還是另有隱情,我是刑警寧澤嗅剖,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布辩越,位于F島的核電站,受9級(jí)特大地震影響信粮,放射性物質(zhì)發(fā)生泄漏黔攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一强缘、第九天 我趴在偏房一處隱蔽的房頂上張望督惰。 院中可真熱鬧,春花似錦旅掂、人聲如沸赏胚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觉阅。三九已至崖疤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間留拾,已是汗流浹背戳晌。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痴柔,地道東北人沦偎。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像咳蔚,于是被迫代替她去往敵國和親豪嚎。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348