1. 程式人生 > >三十四、jquery練習 手機點餐demo

三十四、jquery練習 手機點餐demo

一、所用知識點:

1.jquery事件繫結方法:

(1) bind():類似於js中事件的監聽方法;

   語法:  $(selector).bind(event,data,function,map)

selector:被選元素;

event:新增到元素的事件(一個或多個);

data:可選,傳遞到函式的額外資料;

function:執行函式;

map:事件對映 ({event:function, event:function, ...})

(2) on(): 向元素新增事件處理程式

語法:$(selector).on(event,childSelector,data,function)

 

   childSelector:可選,規定只能新增到指定的子元素上的事件處理程式;

(3) 元素.方法(function(){}):最常用的事件繫結方法

eg: $(div).click(執行函式)

 

2.jquery事件移除方法:

(1)unbind() :從被選元素上移除新增的事件處理程式

語法:$(selector).unbind(event,function,eventObj)

(2)off():移除通過 on() 方法新增的事件處理程式

語法:$(selector).off(event,selector,function(eventObj),map)

注意:off()其實也可以移除bind()繫結的事件

 

3.jquery遍歷方法:列舉幾個常用的

add() 把元素新增到匹配元素的集合中;

children() 返回被選元素的所有直接子元素

find() 返回被選元素的後代元素 //注意find()是所有後代 children()只指兒子

each() 為每個匹配元素執行函式 //相當於js中的遍歷迴圈

eq() 返回帶有被選元素的指定索引號的元素

next() 返回被選元素的後一個同級元素

prev() 返回被選元素的前一個同級元素

parent() 返回被選元素的直接父元素

parents() 返回被選元素的所有祖先元素

//注意區別

siblings() 返回被選元素的所有同級元素

slice() 把匹配元素集合縮減為指定範圍的子集

blur() 新增/觸發失去焦點事件

4.jquery HTML/CSS常用方法

addClass() 向被選元素新增一個或多個類名;//js不同的是無需寫已有的類名稱

removeClass() 從被選元素移除一個或多個類 

after() 在被選元素後插入內容

before() 在被選元素前插入內容 

append() 在被選元素的結尾插入內容

appendTo() 在被選元素的結尾插入 HTML 元素 

attr() 設定或返回被選元素的屬性/

eg:console.log($("#bn").attr("value"));//獲取 只能單個獲取
$("#bn").attr("value","點我");//設定單個屬性
$("#bn").attr({   //設定多個屬性
    "value":"點選",
    "type":"text"
})

prop() 設定或返回被選元素的屬性///用法和attr()一致

css() 為被選元素設定或返回一個或多個樣式屬性 

html() 設定或返回被選元素的內容

text() 設定或返回被選元素的文字內容 

remove() 移除被選元素(包含資料和事件)

empty() 從被選元素移除所有子節點和內容 

replaceAll() 把被選元素替換為新的 HTML 元素

 

二、步驟

1.基礎介面 樣式

注意:除錯需使用手機除錯介面,這裡手機型號為iPhone6 Plus;

另外手機字型無法通過字型大小設定調整,需在head標籤內新增手機自適應語句:

<meta name="viewport" content="width=device-width,initial-scale=1.0,maxinum-scale=1.0,user-scalable=no">
<!--手機app自適應大小-->

 

2、點選購物車 顯示選擇商品同時建立一行商品欄

   需要動態建立dom元素:

   var =dom元素內容

   注意:當未選擇商品時,不能再點選新增商品欄

$("#btnmenu").click(function(){
    //動態建立dom元素
    var trdata="<tr class='trlist'><td class='number'></td><td class='pro_num'></td><td class='name'></td><td class='num'></td><td class='totle'></td><td class='del'><button>刪除</button></td></tr>"
    //判斷是否存在商品
    if($(".pro_num:last")==undefined)
    {
        $(".tab").append(trdata);//使用前後追加的語法
        num++;
        $(".number:last").html(num<10?"0"+num:num);
    }
    else{
        if($(".pro_num:last").html()!="")
        {
            $(".tab").append(trdata);//使用前後追加的語法
            num++;
            $(".number:last").html(num<10?"0"+num:num);
        }
    }

    //顯示選單
    $(".tablist").css("display","block");

})

 

 

3.點選新增購物車商品到商品欄中

遍歷每個商品,點選時分別擷取編號以及名稱新增到動態建立的dom元素欄中;

注意:由於計算總價需要用到單價 但是這裡沒有顯示單價 所以將單價作為title屬性新增到商品數量中;$(".num").last().html(1+"/").attr("title",$(this).attr("title"));

 

//點選購物車內容新增 each遍歷
$(".tablist td").each(function () {
    $(this).click(function(){
        var h_text=$(this).html();
        $(".pro_num").last().html(h_text.substr(0,4));//字串擷取
        $(".name").last().html(h_text.substring(5,h_text.length-1));//擷取商品名稱
        $(".num").last().html(1+"/個").attr("title",$(this).attr("title"));//將單價隱藏到數量中
        //獲取單價  預設總價
        var price=$(this).attr("title");//attr()獲取屬性
        $(".totle").last().html(price+"元");
    });
});

 

4.新增數量顯示時間

由於是手機中無法使用-””+,這裡使用動態建立input元素value值改變數量值,在給元素新增input元素時需要阻止冒泡;

利用失焦事件將input輸入的value作為商品數量;

計算總價 將數量的title屬性值*inputvalue

//新增數量顯示事件
$(".num").each(function(){
    $(this).click(function(){
        //清空預設的數量文字,動態建立input輸入框修改數量
        var num_txt=$(this).html().substring(0,$(this).html().indexOf("/"));//記錄數量值
        $(this).html("");//清空
        var input=$("<input type='text' class='text' value='"+num_txt+"'>");//建立dom
        $(this).append(input);//給this新增input
        //給input新增失焦事件 修改數量 鏈式操作
        $(".text").click(function(){
            return false;//防止事件冒泡 新增給input
        }).keydown(function(e){ //處理輸入數量必須為數字
            if(!e.key.match(/[0-9]/)){
                return false;
            }
        }).blur(function(){//失焦事件
            //失焦時清除input文字框 並將value值賦給對應td
            var txt_num=$(this).val();

            //修改總價
            var Price=$(this).parent("td").attr("title");//獲取隱藏於數量的單價
            $(this).parent("td").next().html(Price*txt_num+"元");//計算總價 next()下一個同級元素
            //或者$(this).parent("td").siblings(".totle").html(Price*txt_num+"元");//sibling()名為..的同胞兄弟
            $(this).parent("td").html(txt_num+"/個");
        })
    });
});

 

5.點選刪除按鈕移除當前行商品欄

注意:當刪除一行商品欄,需要重新對序號排序

定義一個全域性變數num 每次刪除重新遍歷排序;

//新增刪除按鈕的事件
$(".del").each(function(){
    $(this).click(function(){
        $(this).parents("tr").remove();
        //重新對列表排序
        num=0;
        $(".trlist").each(function(){ //利用遍歷每個tr 找其子集第一個修改num
            num++;
            $(this).children("td").first().html(num<10?"0"+num:num);
        });
    });
});


三、完整程式碼

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maxinum-scale=1.0,user-scalable=no">
    <!--手機app自適應大小-->
    <title></title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        body,html{
            width: 100%;
            height: 100%;
        }
        .block{
            width: 100%;
            height: 100%;
            border: 1px solid black;
        }
        #title{
            line-height: 35px;
            background-color: black;
            color: white;
            text-align: center;
        }
        #btnmenu{
            width: 18%;
            height: 4%;
            display: block;
        }
        .tab{
            width: 100%;
            margin-top: 2px;
        }
        .tab td{
            width: 16.6666%;;
            border: 1px solid silver;
            text-align: center;
            padding: 5px 0;
        }
        .tablist{
            position: fixed;
            bottom: 0;
            width: 100%;
            height: 30%;
            display: none;
        }
        .tablist td{
            width: 20%;
            line-height: 35px;
            border: 1px solid silver;
            white-space: nowrap;
            font-size: 14px;
        }
        .text{
            width: 100%;
            height: 100%;
            outline: none;
            border-style: none;
            color: red;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="block">
    <div id="title">購物車</div>
    <button id="btnmenu">新增購物</button>
    <table class="tab">
        <tr>
            <td>序號</td>
            <td>編號</td>
            <td>名稱</td>
            <td>數量</td>
            <td>總價</td>
            <td>操作</td>
        </tr>
    </table>
    <!--商品列表-->
    <table class="tablist">
        <caption>請選擇商品</caption>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
        <tr>
            <td title="5">1001(方便麵)</td>
            <td title="2">1002(辣條)</td>
            <td title="1">1003(泡菜)</td>
            <td title="1">1004(火腿)</td>
            <td title="3">1005(餅乾)</td>
        </tr>
    </table>
</div>
<script src="js/jquery-3.0.0.js"></script>
<script>
    var num=0;
    $(function(){
        $("#btnmenu").click(function(){
            //動態建立dom元素
            var trdata="<tr class='trlist'><td class='number'></td><td class='pro_num'></td><td class='name'></td><td class='num'></td><td class='totle'></td><td class='del'><button>刪除</button></td></tr>"
            //判斷是否存在商品
            if($(".pro_num:last")==undefined)
            {
                $(".tab").append(trdata);//使用前後追加的語法
                num++;
                $(".number:last").html(num<10?"0"+num:num);
            }
            else{
                if($(".pro_num:last").html()!="")
                {
                    $(".tab").append(trdata);//使用前後追加的語法
                    num++;
                    $(".number:last").html(num<10?"0"+num:num);
                }
            }

            //顯示選單
            $(".tablist").css("display","block");

            //新增數量顯示事件
            $(".num").each(function(){
                $(this).click(function(){
                    //清空預設的數量文字,動態建立input輸入框修改數量
                    var num_txt=$(this).html().substring(0,$(this).html().indexOf("/"));//記錄數量值
                    $(this).html("");//清空
                    var input=$("<input type='text' class='text' value='"+num_txt+"'>");//建立dom
                    $(this).append(input);//給this新增input
                    //給input新增失焦事件 修改數量 鏈式操作
                    $(".text").click(function(){
                        return false;//防止事件冒泡 新增給input
                    }).keydown(function(e){ //處理輸入數量必須為數字
                        if(!e.key.match(/[0-9]/)){
                            return false;
                        }
                    }).blur(function(){//失焦事件
                        //失焦時清除input文字框 並將value值賦給對應td
                        var txt_num=$(this).val();

                        //修改總價
                        var Price=$(this).parent("td").attr("title");//獲取隱藏於數量的單價
                        $(this).parent("td").next().html(Price*txt_num+"元");//計算總價 next()下一個同級元素
                        //或者$(this).parent("td").siblings(".totle").html(Price*txt_num+"元");//sibling()名為..的同胞兄弟
                        $(this).parent("td").html(txt_num+"/個");
                    })
                });
            });

            //新增刪除按鈕的事件
            $(".del").each(function(){
                $(this).click(function(){
                    $(this).parents("tr").remove();
                    //重新對列表排序
                    num=0;
                    $(".trlist").each(function(){ //利用遍歷每個tr 找其子集第一個修改num
                        num++;
                        $(this).children("td").first().html(num<10?"0"+num:num);
                    });
                });
            });
        });
        //點選購物車內容新增 each遍歷
        $(".tablist td").each(function () {
            $(this).click(function(){
                var h_text=$(this).html();
                $(".pro_num").last().html(h_text.substr(0,4));//字串擷取
                $(".name").last().html(h_text.substring(5,h_text.length-1));//擷取商品名稱
                $(".num").last().html(1+"/個").attr("title",$(this).attr("title"));//將單價隱藏到數量中
                //獲取單價  預設總價
                var price=$(this).attr("title");//attr()獲取屬性
                $(".totle").last().html(price+"元");
            });
        });
    });
</script>
</body>
</html>