佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 妙用Ajax技術(shù)實(shí)現(xiàn)局部刷新商品數(shù)量和總價(jià)實(shí)例代碼

妙用Ajax技術(shù)實(shí)現(xiàn)局部刷新商品數(shù)量和總價(jià)實(shí)例代碼

熱門標(biāo)簽:銀行業(yè)務(wù) 電子圍欄 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 團(tuán)購(gòu)網(wǎng)站 阿里云 Mysql連接數(shù)設(shè)置 服務(wù)器配置 Linux服務(wù)器

1. 問(wèn)題的分析

  先看一下頁(yè)面中的情況:

 

  功能如上,在沒(méi)有Ajax之前,一般都是根據(jù)用戶修改的值去找Action,然后返回新的jsp頁(yè)面重新加載整個(gè)頁(yè)面,完成數(shù)字的更新。但是有了Ajax技術(shù)后,我們可以利用Ajax技術(shù)局部刷新要改變的地方,而不是重新加載整個(gè)頁(yè)面。首先看一下上圖對(duì)應(yīng)的jsp部分的代碼:

div class="section_container">
!-- 購(gòu)物車 -->
div id="shopping_cart">
div class="message success">我的購(gòu)物車/div>
table class="data-table cart-table" cellpadding="0" cellspacing="0">
tr>
th class="align_center" width="10%">商品編號(hào)/th>
th class="align_left" width="35%" colspan="2">商品名稱/th>
th class="align_center" width="10%">銷售價(jià)格/th>
th class="align_center" width="20%">數(shù)量/th>
th class="align_center" width="15%">小計(jì)/th>
th class="align_center" width="10%">刪除/th>
/tr>
c:forEach items="${sessionScope.forder.sorders }" var="sorder" varStatus="num">
tr lang="${sorder.product.id}">
td class="align_center">a href="#" class="edit">${num.count }/a>/td>
td width="80px">img src="${shop}/files/${sorder.product.pic}" width="80" height="80" />/td>
td class="align_left">a class="pr_name" href="#">${sorder.name }/a>/td>
td class="align_center vline">${sorder.price }/td>
td class="align_center vline">
!-- 文本框 -->
input class="text" style="height: 20px;" value="${sorder.number }" lang="${sorder.number }"> 
/td>
td class="align_center vline">${sorder.price*sorder.number }/td>
td class="align_center vline">a href="#" class="remove">/a>/td>
/tr>
/c:forEach>
/table>
!-- 結(jié)算 -->
div class="totals">
table id="totals-table">
tbody>
tr>
td width="60%" colspan="1" class="align_left">strong>小計(jì)/strong>/td>
td class="align_right" style="">strong>¥span
class="price" id="total">${sessionScope.forder.total}/span>
/strong>/td>
/tr>
tr>
td width="60%" colspan="1" class="align_left">運(yùn)費(fèi)/td>
td class="align_right" style="">¥span class="price" id="yunfei">0.00/span>/td>
/tr>
tr>
td width="60%" colspan="1" class="align_left total">strong>總計(jì)/strong>/td>
td class="align_right" style="">¥span class="total" id="totalAll">strong>${sessionScope.forder.total}/strong>/span>
/td>
/tr>
/tbody>
/table>
div class="action_buttonbar">
font>a href="${shop}/user/confirm.jsp">
button type="button" title="" class="checkout fr" style="background-color: #f38256;">訂單確認(rèn)/button>/a>
/font>
font>a href="#">
button type="button" title="" class=" fr">
font>清空購(gòu)物車/font>
/button>
/font>
a href="${shop}/index.jsp">
button type="button" title="" class="continue fr">
font>繼續(xù)購(gòu)物/font>
/button>/a>
div style="clear:both">/div>
/div>
/div>
/div>

  看著貌似很多的樣子,其實(shí)功能很簡(jiǎn)單,就是從域中拿出相應(yīng)的數(shù)據(jù)顯示出來(lái)而已,我們現(xiàn)在要實(shí)現(xiàn)上面描述的功能的話,先來(lái)分析一下思路:

首先得注冊(cè)一個(gè)事件:即修改了數(shù)量那里的文本框觸發(fā)的事件;

在該事件中,我們拿到用戶輸入的數(shù),判斷輸入的合法性,因?yàn)橐乐褂脩魜y輸入;

如果合法,通過(guò)Ajax請(qǐng)求將數(shù)據(jù)發(fā)送到后臺(tái);

后臺(tái)針對(duì)新的數(shù)量,調(diào)用相應(yīng)的業(yè)務(wù)邏輯方法得到新的結(jié)果,并將其通過(guò)流返回到前臺(tái);

Ajax收到結(jié)果后,再對(duì)相應(yīng)位置的數(shù)據(jù)進(jìn)行更新。整個(gè)流程就走完了。

如果非法,則顯示修改前的數(shù)字。不做任何處理

2. Ajax請(qǐng)求的實(shí)現(xiàn)

分析完了流程,接下來(lái)我們就著手去實(shí)現(xiàn)了,首先把js部分的代碼貼在這,然后我們根據(jù)上面的流程詳細(xì)分析:

script type="text/javascript">
$(function(){
//1. 注冊(cè)事件
$(".text").change(function(){
//2. 驗(yàn)證數(shù)據(jù)的有效性
var number = this.value; //也可以使用$(this).val();
//isNaN(number)表示若number不是數(shù)字就返回真
if(!isNaN(number)  parseInt(number)==number  number>0){ 
//如果合法,同步更新的數(shù)
$(this).attr("lang", number);
//找到當(dāng)前標(biāo)簽中第一個(gè)是tr的父節(jié)點(diǎn),然后拿到屬性為lang的值,也就是商品的id
var pid = $(this).parents("tr:first").attr("lang");
//發(fā)送Ajax請(qǐng)求,傳輸當(dāng)前的數(shù)量與商品的id,返回修改數(shù)量后的總價(jià)格
$.post("sorder_updateSorder.action", 
{number:number, 'product.id':pid},
function(total){ 
$("#total").html(total); //所有商品小計(jì)
var yunfei = $("#yunfei").html();
$("#totalAll").html((total*1 + yunfei*1).toFixed(2));//所有商品小計(jì)和運(yùn)費(fèi)的和
}, "text");
//計(jì)算單個(gè)商品的小計(jì),保留兩位小數(shù)
var price = ($(this).parent().prev().html()*number).toFixed(2);
$(this).parent().next().html(price);
} else {
//如果非法,還原為剛剛合法的數(shù)
this.value = $(this).attr("lang");
}
})
})
/script>

2.1 注冊(cè)事件

  我們看上面的代碼可知,注冊(cè)事件首先要定位到這個(gè)文本框,這里是通過(guò)類選擇器來(lái)定位的,因?yàn)槭俏谋究颍杂胏hange()來(lái)注冊(cè)該事件,然后在里面定義一個(gè)function()函數(shù)來(lái)處理該事件。

2.2 判斷數(shù)據(jù)合法性

  好了,注冊(cè)好了事件后,我們首先要對(duì)用戶輸入的數(shù)進(jìn)行合法性判斷,因?yàn)橛脩艨赡茌斎肓?或者負(fù)數(shù),可能輸入了小數(shù),甚至輸入了字母或其他字符等等。所以要進(jìn)行驗(yàn)證。

isNaN(number)表示若number不是數(shù)字就返回真,我們可以用這個(gè)函數(shù)來(lái)判斷是否為數(shù)字;parseInt(number)表示對(duì)數(shù)組進(jìn)行取整,然后跟它自身進(jìn)行比較,我們巧妙的運(yùn)用了這個(gè)來(lái)判斷number是否為整數(shù)。

2.3 發(fā)送Ajax請(qǐng)求

  如果數(shù)據(jù)是合法的,我們獲取該數(shù)據(jù)后,就可以向后臺(tái)發(fā)送Ajax請(qǐng)求了,我們需要考慮一個(gè)問(wèn)題:需要傳哪些參數(shù)呢?首先用戶想要更新數(shù)量,毫無(wú)疑問(wèn),用戶輸入的數(shù)字肯定要傳過(guò)去,其次到底傳哪個(gè)商品呢?也就是說(shuō)我們需要獲取用戶想要修改的商品的id號(hào),知道了要傳的參數(shù)后,我們想辦法獲取id號(hào)即可。

  這里有一個(gè)問(wèn)題,用戶的購(gòu)物車?yán)锟赡懿恢挂患唐?,很自然的?huì)想到,如果能用一條語(yǔ)句可以拿到不同商品的id,就非常好了,因此,想到了可以使用該文本框的父標(biāo)簽,因?yàn)椴煌纳唐匪母笜?biāo)簽都一樣,都是第一個(gè)tr>標(biāo)簽,所以我們把商品的id放在那個(gè)tr>標(biāo)簽中的lang屬性里,為什么要放在lang屬性里呢?因?yàn)閘ang屬性基本不會(huì)用到,它是用來(lái)定義語(yǔ)言的,而且用lang屬性還不容易和其他屬性沖突~這樣我們就可以通過(guò)$(this).parents("tr:first").attr("lang");來(lái)獲取商品的id了。

接下來(lái)開(kāi)始發(fā)送Ajax請(qǐng)求,使用post方式發(fā)送,post方法中有四個(gè)參數(shù):

第一個(gè)參數(shù)是要發(fā)送到的Action

第二個(gè)參數(shù)是要傳過(guò)去的參數(shù),使用的是json格式

第三個(gè)參數(shù)是一個(gè)function(result),result是用來(lái)接收后臺(tái)穿過(guò)來(lái)的數(shù)據(jù)

第四個(gè)方式是規(guī)定接收什么類型的數(shù)據(jù),json表示接收json數(shù)據(jù),text表示接收流

  從后臺(tái)返回的total是所有商品的總價(jià)格,所以在function中,首先我們根據(jù)id拿到所有商品小計(jì)的元素然后賦值為total即可,totalAll是加了運(yùn)費(fèi)的總價(jià),后面那個(gè)toFixes(2)表示保留兩位小數(shù)。然后再拿到單個(gè)商品小計(jì)的元素,計(jì)算一下單個(gè)商品的小計(jì),這樣前臺(tái)頁(yè)面在沒(méi)有重新載入的情況下,更新了我們想要更新的部分,這就是Ajax強(qiáng)大的地方,這個(gè)和前面EasyUI一樣的,EasyUI也是Ajax請(qǐng)求。

   好了,關(guān)于Ajax部分到這里就介紹完了,下面是后臺(tái)的處理剛剛的請(qǐng)求,是針對(duì)自己這個(gè)項(xiàng)目的,用來(lái)記錄項(xiàng)目進(jìn)度用的。

3. 后臺(tái)的更新

  剛剛Ajax請(qǐng)求的action是SortedAction中的updateSorder()方法,所以我們?nèi)orderAction中完成updateSorder()方法:

@Controller
@Scope("prototype")
public class SorderAction extends BaseActionSorder> {
public String addSorder() {
//省略無(wú)關(guān)的代碼……
//根據(jù)商品編號(hào)更新商品數(shù)量
public String updateSorder() {
Forder forder = (Forder) session.get("forder");
//更新購(gòu)物項(xiàng),傳進(jìn)來(lái)的product.id被封裝到了model中
forder = sorderService.updateSorder(model, forder);
//計(jì)算新的總價(jià)格
forder.setTotal(forderService.cluTotal(forder));
session.put("forder", forder);
//以流的形式返回新的總價(jià)格
inputStream = new ByteArrayInputStream(forder.getTotal().toString().getBytes());
return "stream";
}
}

相應(yīng)的Service中的方法完善如下:

//SorderService接口
public interface SorderService extends BaseServiceSorder> {
//省去無(wú)關(guān)的代碼……
//根據(jù)商品id和數(shù)量更新商品數(shù)量
public Forder updateSorder(Sorder sorder, Forder forder);
}
//SorderServiceImpl實(shí)現(xiàn)類
@Service("sorderService")
public class SorderServiceImpl extends BaseServiceImplSorder> implements
SorderService {
//省略無(wú)關(guān)的代碼……
@Override
public Forder updateSorder(Sorder sorder, Forder forder) {
for(Sorder temp : forder.getSorders()) {
if(temp.getProduct().getId().equals(sorder.getProduct().getId())) {
temp.setNumber(sorder.getNumber());
}
}
return forder;
}
}

最后struts.xml文件中的配置,是把”stream”配在了global-result>里面,如下

global-results>
!-- 省去其他公共配置 -->
result name="stream" type="stream">
param name="inputName">inputStream/param>
/result>
/global-results>

   好了,現(xiàn)在Action中計(jì)算出的總價(jià)格就可以通過(guò)流的形式傳到前臺(tái)了,Ajax就可以在它的function中接收到,放到total中了,跟前面的就接上了。

以上所述是小編給大家介紹的妙用Ajax技術(shù)局部刷新商品數(shù)量和總價(jià)實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • php+ajax實(shí)現(xiàn)商品對(duì)比功能示例
  • jQuery+Ajax請(qǐng)求本地?cái)?shù)據(jù)加載商品列表頁(yè)并跳轉(zhuǎn)詳情頁(yè)的實(shí)現(xiàn)方法
  • php實(shí)現(xiàn)的簡(jiǎn)單美國(guó)商品稅計(jì)算函數(shù)
  • 利用ajax+php實(shí)現(xiàn)商品價(jià)格計(jì)算

標(biāo)簽:大理 江蘇 萍鄉(xiāng) 棗莊 廣元 衢州 衡水 蚌埠

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《妙用Ajax技術(shù)實(shí)現(xiàn)局部刷新商品數(shù)量和總價(jià)實(shí)例代碼》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    永登县| 措勤县| 巨野县| 潞西市| 白水县| 习水县| 万源市| 罗田县| 本溪市| 苗栗市| 岳普湖县| 黄陵县| 德兴市| 东乡族自治县| 稻城县| 固安县| 南昌市| 桃源县| 通海县| 司法| 房产| 石嘴山市| 原平市| 页游| 托克逊县| 林西县| 平陆县| 新宾| 乐安县| 新乡县| 饶平县| 崇义县| 石景山区| 旺苍县| 仙居县| 濮阳市| 陇西县| 五大连池市| 新竹市| 科技| 怀仁县|