三十四、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屬性值*input的value值
//新增數量顯示事件
$(".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>