頁面初始由伺服器輸出兩種按鈕其中之一:a.apply (紅色可點) 或 a.applydefault (灰色不可點)。點擊紅色按鈕後:
<a class="apply Q-buy-btn" wishseId="123" href="javascript:void(0)">
<span>申請</span>
</a>
<!-- 或灰色版 -->
<a class="applydefault" wishseId="123" href="javascript:void(0)">
<span>已申請</span>
</a>
<span class="count">0</span> <!-- 數量顯示 -->
$(function() {
// 事件委派,支援動態新增按鈕
$(document).on('click', 'a.apply', function(e) {
e.preventDefault();
var $btn = $(this);
// 1. 已是灰色則忽略
if ($btn.hasClass('applydefault')) return;
var wishId = $btn.attr('wishseId');
var $count = $('.count'); // 或依上下文精確選擇
// 2. 立即切換 UI (樂觀更新)
$btn.removeClass('apply Q-buy-btn')
.addClass('applydefault')
.find('span').text('已申請');
$btn.css('cursor', 'default');
// 3. 數量 +1
var curr = parseInt($count.text(), 10) || 0;
$count.text(curr + 1);
// 4. AJAX 同步後端
$.post('/api/wish/apply', { wishseId: wishId })
.done(function(res) {
if (!res.success) { // 失敗回滾
$btn.removeClass('applydefault')
.addClass('apply Q-buy-btn')
.find('span').text('申請');
$btn.css('cursor', 'pointer');
$count.text(curr);
alert('申請失敗:' + res.msg);
}
})
.fail(function() {
// 網路錯誤回滾
$btn.removeClass('applydefault')
.addClass('apply Q-buy-btn')
.find('span').text('申請');
$btn.css('cursor', 'pointer');
$count.text(curr);
alert('網路錯誤,請重試');
});
});
});
POST /api/wish/apply
{ "wishseId": 123 }
Response: { "success": true, "newCount": 5, "status": "applied" }