基于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验证表单第二部分
Nov 25 Javascript
JavaScript 自动完成脚本整理(33个)
Oct 20 Javascript
jQuery each()方法的使用方法
Mar 18 Javascript
window.open的页面如何刷新(父页面)上层页面
Dec 28 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
js创建对象的区别示例介绍
Jul 24 Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
Vue实现按钮级权限方案
Nov 21 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 Javascript
JS Generator 函数的含义与用法实例总结
Apr 08 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
Sep 24 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
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
javascript判断office版本示例
2014/04/11 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
python中的yield使用方法
2014/02/11 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
详解Python中的路径问题
2020/09/02 Python
浅析python实现动态规划背包问题
2020/12/31 Python
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
UML设计模式笔试题
2014/06/07 面试题
班级活动总结格式
2014/08/30 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS