基于jquery实现在线选座订座之影院篇


Posted in Javascript onAugust 24, 2015

先给大家展示效果图(支持源码下载哦):

基于jquery实现在线选座订座之影院篇

查看演示          源码下载

我们在线购票时(如电影票、车票等)可以自己选座。开发者会在页面上列出座次席位,用户可以一目了然的看到可以选择的座位及支付。本文以电影院购票为例,为您展示如何选座、处理选座数据等。

在这里,我给大家介绍一款基于jQuery的在线选座插件:jQuery Seat Charts,它支持自定义座位类型和价格,支持自定义样式,支持设置不可选的座位,也支持键盘控制座位。

HTML

我们假设进入电影《星际穿越》的选座页面,页面布局请看上面的大图,页面左边将在#seat-map中显示影院的座位布局图,右侧#booking-details显示影片相关信息以及选中的座位信息#selected-seats和票价金额信息,选择座位后确认到支付页面完成支付。

<div class="demo"> 
 <div id="seat-map"> 
 <div class="front">屏幕</div>   
 </div> 
 <div class="booking-details"> 
 <p>影片:<span>星际穿越3D</span></p> 
 <p>时间:<span>11月14日 21:00</span></p> 
 <p>座位:</p> 
 <ul id="selected-seats"></ul> 
 <p>票数:<span id="counter">0</span></p> 
 <p>总计:<b>¥<span id="total">0</span></b></p> 
 <button class="checkout-button">确定购买</button> 
 <div id="legend"></div> 
 </div> 
</div>

CSS

使用CSS将页面中的各个元素美化,尤其是座位列表布局,为座位状态(已售出、可选座位、已选座位等)设置不同的样式,我们已经整理好CSS代码,当然你可以根据自己项目页面风格自己修改任意CSS代码。

.front{width: 300px;margin: 5px 32px 45px 32px;background-color: #f0f0f0; color: #666;text-align: center;padding: 3px;border-radius: 5px;} 
.booking-details {float: right;position: relative;width:200px;height: 450px; } 
.booking-details h3 {margin: 5px 5px 0 0;font-size: 16px;} 
.booking-details p{line-height:26px; font-size:16px; color:#999} 
.booking-details p span{color:#666} 
div.seatCharts-cell {color: #182C4E;height: 25px;width: 25px;line-height: 25px;margin: 3px;float: left;text-align: center;outline: none;font-size: 13px;} 
div.seatCharts-seat {color: #fff;cursor: pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius: 5px;} 
div.seatCharts-row {height: 35px;} 
div.seatCharts-seat.available {background-color: #B9DEA0;} 
div.seatCharts-seat.focused {background-color: #76B474;border: none;} 
div.seatCharts-seat.selected {background-color: #E6CAC4;} 
div.seatCharts-seat.unavailable {background-color: #472B34;cursor: not-allowed;} 
div.seatCharts-container {border-right: 1px dotted #adadad;width: 400px;padding: 20px;float: left;} 
div.seatCharts-legend {padding-left: 0px;position: absolute;bottom: 16px;} 
ul.seatCharts-legendList {padding-left: 0px;} 
.seatCharts-legendItem{float:left; width:90px;margin-top: 10px;line-height: 2;} 
span.seatCharts-legendDescription {margin-left: 5px;line-height: 30px;} 
.checkout-button {display: block;width:80px; height:24px; line-height:20px;margin: 10px auto;border:1px solid #999;font-size: 14px; cursor:pointer} 
#selected-seats {max-height: 150px;overflow-y: auto;overflow-x: none;width: 200px;} 
#selected-seats li{float:left; width:72px; height:26px; line-height:26px; border:1px solid #d3d3d3; background:#f7f7f7; margin:6px; font-size:14px; font-weight:bold; text-align:center}

jQuery

本实例基于jQuery,所以别忘了要先加载jquery库和选座插件:jQuery Seat Charts。

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="jquery.seat-charts.min.js"></script>

接下来我们定义好诸如票价,座位区,票数,总计金额之类的元素,然后调用插件:$('#seat-map').seatCharts()。

我们先设置好座位图,一个放映厅的座位是固定好的。在本例中,第三排是过道,以及三四排的右侧空位是出口,最后一排我们设置了情侣座,那么放映厅的布局是这样的:

aaaaaaaaaa
aaaaaaaaaa
__________
aaaaaaaa__
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aa__aa__aa

我们用字母a表示座位,用符号_表示空的,即没有座位,当然你也可以用a,b,c等代表不同等级的座位。

然后定义图例样式,关键是侦探点击事件click():用户点击座位时,如果座位状态为可选(available),那么点击座位后,将座位信息(几排几座)加入到右侧的已选座列表中,并计算总票数和总金额;如果座位状态为已选中(selected),那么再次点击座位后,则会将已选中的座位信息从右侧的座位列表中删除,并将状态设置可选;如果座位状态为已售出(unavailable),则不可点击座位。最后使用get()方法将已售出的座位号状态设置为已售出。

以下是详细代码:

var price = 80; //票价 
$(document).ready(function() { 
 var $cart = $('#selected-seats'), //座位区 
 $counter = $('#counter'), //票数 
 $total = $('#total'); //总计金额 
 var sc = $('#seat-map').seatCharts({ 
 map: [ //座位图 
  'aaaaaaaaaa', 
  'aaaaaaaaaa', 
  '__________', 
  'aaaaaaaa__', 
  'aaaaaaaaaa', 
  'aaaaaaaaaa', 
  'aaaaaaaaaa', 
  'aaaaaaaaaa', 
  'aaaaaaaaaa', 
  'aa__aa__aa' 
 ], 
 legend : { //定义图例 
  node : $('#legend'), 
  items : [ 
  [ 'a', 'available', '可选座' ], 
  [ 'a', 'unavailable', '已售出'] 
  ]   
 }, 
 click: function () { //点击事件 
  if (this.status() == 'available') { //可选座 
  $('<li>'+(this.settings.row+1)+'排'+this.settings.label+'座</li>') 
   .attr('id', 'cart-item-'+this.settings.id) 
   .data('seatId', this.settings.id) 
   .appendTo($cart); 
  $counter.text(sc.find('selected').length+1); 
  $total.text(recalculateTotal(sc)+price); 
  return 'selected'; 
  } else if (this.status() == 'selected') { //已选中 
  //更新数量 
  $counter.text(sc.find('selected').length-1); 
  //更新总计 
  $total.text(recalculateTotal(sc)-price); 
  //删除已预订座位 
  $('#cart-item-'+this.settings.id).remove(); 
  //可选座 
  return 'available'; 
  } else if (this.status() == 'unavailable') { //已售出 
  return 'unavailable'; 
  } else { 
  return this.style(); 
  } 
 } 
 }); 
 //已售出的座位 
 sc.get(['1_2', '4_4','4_5','6_6','6_7','8_5','8_6','8_7','8_8', '10_1', '10_2']).status('unavailable'); 
}); 
//计算总金额 
function recalculateTotal(sc) { 
 var total = 0; 
 sc.find('selected').each(function () { 
 total += price; 
 }); 
 return total; 
}

说明

jQuery Seat Charts插件提供了多个选项设置和方法调用,具体可参照项目官网:

https://github.com/mateuszmarkowski/jQuery-Seat-Charts。

以上代码使用jquery实现在线选座订座之影院篇,希望大家喜欢。

Javascript 相关文章推荐
js no-repeat写法 背景不重复
Mar 18 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
Oct 10 Javascript
javascript入门教程基础篇
Nov 16 Javascript
基于javascript实现随机颜色变化效果
Jan 14 Javascript
Bootstrap所支持的表单控件实例详解
May 16 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
Apr 11 Javascript
js判断传入时间和当前时间大小实例(超简单)
Jan 11 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
js实现验证码功能
Jul 24 Javascript
关于JavaScript轮播图的实现
Nov 20 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 #Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
Aug 24 #Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
Aug 24 #Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 #Javascript
jquery+html5烂漫爱心表白动画代码分享
Aug 24 #Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
Aug 24 #Javascript
jQuery超酷平面式时钟效果代码分享
Mar 30 #Javascript
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
PHP教程 预定义变量
2009/10/23 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
js防止表单重复提交实现代码
2012/09/05 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
python实现简单socket通信的方法
2016/04/19 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python ETL工具 pyetl
2020/06/07 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
一年级学生评语
2014/04/23 职场文书
安全标兵事迹材料
2014/08/17 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python