亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

200行HTML+JavaScript實現年會抽獎程序

2019-11-19 12:14:08
字體:
來源:轉載
供稿:網友

本文實例為大家分享了js實現年會抽獎程序的具體代碼,供大家參考,具體內容如下

需求分析

1.多輪抽獎,每輪只有3個環節:展示獎品圖,人名閃動,停止閃動確定中獎名單
2.中獎分級,例如試用期員工不能中二等獎或以上
3.每輪抽獎的中獎人數不同。每個人只能中一次獎
4.可臨時加場,現場輸入獎品名、數量。額外窗口輸入,避免被觀眾看到修改過程。
5.本地記錄每輪的獎品和中獎名單
6.全屏顯示。不確定現場的屏幕分辨率,故核心部分固定1024*768,居中顯示;背景拉伸鋪滿全屏。


技術選型

搞桌面程序第一時間就想到了這幾個框架:Java Swing、Python Tkinter、C++ Qt、C# WPF。雖然都可行,但感覺開發不夠便捷。而且誰知道年會現場那臺電腦有沒有對應的運行時庫。

最后經同事給的靈感想到了用JavaScript做,選定了node-webkit,即nw.js。沒有選electron是它需要搭開發環境。

既然連開發環境都懶得搭,那自然也用不了Vue、React、Angular。實際上也沒必要,小學生才用牛刀殺雞。

代碼開源

開源在 年會抽獎程序 。文末會貼一下當前的版本,但以github上的為準。

使用方法
啟動
Windows的啟動方法:到 這里 下載node-webkit,解壓出來,把代碼的整個目錄拖動到nwjs.exe上。

其它操作系統按官方說明做:

cd /path/to/your/app
/path/to/nw .

/path/to/nw is the binary file of NW.js. On Windows, it's nw.exe; On Linux, it's nw; On Mac, it's nwjs.app/Contents/MacOS/nwjs.

按鍵

  • f:切換全屏
  • 4:下一步。進入下一輪抽獎的展示獎品圖片、進入名單滾動。
  • 空格:立刻停止名單滾動。即確定中獎人員。
  • 8:重新加載配置文件。主要用于臨場增加獎項
  • 1:上一步,用來看看上個獎項的情況

核心文件說明

  • index.html:所有代碼都在這
  • steps.json:流程配置文件,應該一看就懂。中獎后此文件會被修改,包含中獎名單。如果需要加獎項,不用退出程序,編輯完這個文件后按8就能重新加載配置,繼續抽。
  • names.ini:人員名單與可中獎等級,等級數字越小表示可中更大的獎。中獎后此文件會被修改,刪除已中獎的人

TODO

  • 啟動的時候設置窗口大小和位置會閃動,可以做得體驗好點,雖然沒必要
  • 更多的可動態設置項
  • 啟動方式還是有點別扭,可打包一下程序

代碼

程序步驟說明:

1.調整窗口大小和位置
2.讀取配置文件,得到人員名單和抽獎輪次信息
3.進入第1輪。通過按鍵4和空格進入下個環節
4.用state變量來記錄狀態:展示圖片、滾動名單、顯示中獎名單

html的部分:

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <script>  var win = nw.Window.get()  win.resizeTo(1024, 768)  win.moveTo(0, 0) </script> <style type="text/css">  * {  margin: 0;  padding: 0;  }  html, body {  width: 100%;  height: 100%;  }  body {  text-align: center;  background: url("./bg.png") no-repeat;  overflow: hidden;  background-size: 100% 100%;  font-weight: bold;  color: #D40000;  }  #container {  min-width: 1000px;  min-height: 700px;  }  #title {  font-size: 100px;  margin-top: 80px;  }  #disc {  font-size: 40px;  margin: 10px 0;  }  #image {  margin-top: 20px;  max-height: 280px;  border: 1px solid #E23540FF;  border-radius: 20px;  }  #list {  margin: 0 auto;  max-width: 800px;  }  #list span {  display: inline-block;  width: 160px;  font-size: 36px;  margin-top: 8px;  } </style> </head> <body> <div id="container">  <div id="title">XX公司年會</div>  <div id="disc">獎品描述</div>  <img id="image" />  <div id="list"></div> </div> <script>  var fs = require('fs')  var steps = null  var step = 0  var names = null  var state = ''    var disc = document.getElementById('disc')  var image = document.getElementById('image')  var list = document.getElementById('list')  function reloadConf(func) {  fs.readFile('names.ini', 'utf8', function(err, data) {   names = data.split('/n').map(x => x.split(','))  })  fs.readFile('./steps.json', 'utf8', function(err, data) {   steps = eval(data)   if (func) func()  })  }  function saveConf(func) {  fs.writeFile('./steps.json', JSON.stringify(steps), function(err) {   if (err) {   alert(err)   }  })  fs.writeFile('./names.ini', names.map(x => x.join(',')).join('/n'), function(err) {   if (err) {   alert(err)   }  })  }  function showPic(data) {  disc.innerHTML = data.disc  image.src = data.image  image.style.display = 'inline'  list.style.display = 'none'  while (list.hasChildNodes()) {   list.removeChild(list.firstChild)  }  }  function showBlink(data) {  disc.innerHTML = data.disc  image.style.display = 'none'  list.style.display = 'block'  var spans = []  for (var i = 0; i < data.count; ++i) {   var span = document.createElement('span')   list.appendChild(span)   spans.push(span)  }  function doBlink() {   if (state == 'showBlink') {   names.sort(function() {    return 0.5 - Math.random()   })   for (var i = 0; i < data.count; ++i) {    spans[i].innerHTML = names[i][0]   }   window.requestAnimationFrame(doBlink)   }  }  window.requestAnimationFrame(doBlink)  }  function showList(data) {  disc.innerHTML = data.disc  image.style.display = 'none'  list.style.display = 'block'  while (list.hasChildNodes()) {   list.removeChild(list.firstChild)  }  for (var i = 0; i < data.list.length; ++i) {   var span = document.createElement('span')   span.innerHTML = data.list[i]   list.appendChild(span)  }  }  function nextStep() {  var data = steps[step]  if (state == 'showPic') {   data.list = data.list || []   if (data.list.length > 0) {   state = 'showList'   showList(data)   } else {   state = 'showBlink'   showBlink(data)   }  } else if (state == 'showBlink') {   if (data.list.length > 0) {   state = 'showList'   showList(data)   }  } else if (state == 'showList') {   if (step < (steps.length - 1)) {   ++step   state = ''   nextStep()   }  } else {   state = 'showPic'   showPic(data)  }  }  function previousStep() {  if (step > 0) {   --step  }  state = ''  nextStep()  }  function drawPrize() {  if (state == 'showBlink') {   var data = steps[step]   names.sort(function (a, b) {   if (a[1] <= data.level && b[1] > data.level) {    return -1   }   return 0   })   var luck = names.splice(0, data.count)   data.list = luck.map(x => x[0])   saveConf()   nextStep()  }  }  document.addEventListener('keydown', function(e) {  e=e||window.event  if (e.keyCode == 56) {   // 8   reloadConf()  } else if (e.keyCode == 52) {   // 4   nextStep()  } else if (e.keyCode == 49) {   // 1   previousStep()  } else if (e.keyCode == 32) {   // 空格   drawPrize()  } else if (e.keyCode == 70) {   // f   win.toggleFullscreen()  }  })    reloadConf(nextStep) </script>  </bdoy></html>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品激情blacked18| 日本老师69xxx| 成人欧美一区二区三区在线湿哒哒| 91在线观看免费观看| 国产精品久久久久久亚洲影视| 精品美女久久久久久免费| 91久久久久久久| 久久亚洲精品视频| 国产一区二区三区中文| 中文在线资源观看视频网站免费不卡| 国产视频丨精品|在线观看| 亚洲一区二区三区sesese| 亚洲色图日韩av| 日韩欧美a级成人黄色| 亚洲免费视频在线观看| 日韩精品极品在线观看| 欧美精品中文字幕一区| 久久亚洲电影天堂| 日韩视频免费在线| 伊人精品在线观看| 久久国产精品久久精品| 在线成人免费网站| 亚洲在线免费观看| 日韩av观看网址| 国产精品亚洲一区二区三区| 亚洲国产精品电影| 国产精品三级美女白浆呻吟| 国产精品大陆在线观看| 久久久久日韩精品久久久男男| 免费99精品国产自在在线| 欧洲亚洲女同hd| 精品人伦一区二区三区蜜桃免费| 亚洲日韩欧美视频一区| 午夜精品福利电影| 亚洲欧美精品suv| 国产精品亚洲一区二区三区| 91在线播放国产| 久久天天躁狠狠躁夜夜av| 国产一区二区在线免费| 97久久国产精品| 久久国产精品偷| 久久精品国产亚洲精品| 在线视频日本亚洲性| 隔壁老王国产在线精品| 美女撒尿一区二区三区| 亚洲精品狠狠操| 日韩综合视频在线观看| 国产精品69久久| 欧美激情视频一区| 精品久久久久久中文字幕一区奶水| 国产激情久久久久| 欧美性一区二区三区| 69av在线视频| 久久久91精品国产一区不卡| 国产精品∨欧美精品v日韩精品| 九九热这里只有在线精品视| 国产日韩精品综合网站| 精品亚洲国产视频| 日韩在线观看你懂的| 91福利视频网| 日韩欧美成人精品| 欧美在线观看网站| 亚洲成人国产精品| 欧美韩国理论所午夜片917电影| 亚洲精品电影在线| 精品福利在线观看| 97色在线观看免费视频| 国产精品网站入口| 国产亚洲成精品久久| **欧美日韩vr在线| 日韩欧美精品网站| 91精品久久久久久久久久久久久| 国产99视频精品免视看7| 国产69精品久久久久9| 欧美日韩亚洲精品内裤| 久久精品视频99| 久久69精品久久久久久国产越南| 亚洲国产精品嫩草影院久久| 91久久久久久久久久久久久| 欧美性色视频在线| 亚洲精品av在线播放| 亚洲午夜激情免费视频| 亚洲欧美国产视频| 欧美国产日本高清在线| 少妇高潮久久77777| 777午夜精品福利在线观看| 中文字幕精品www乱入免费视频| 欧美日韩电影在线观看| 国产va免费精品高清在线观看| 国产精品69精品一区二区三区| 成人国产精品一区二区| 狠狠躁夜夜躁人人爽超碰91| 在线播放国产一区二区三区| 性色av香蕉一区二区| 国精产品一区一区三区有限在线| 欧美丰满少妇xxxx| 国产一区二区三区在线视频| 国产盗摄xxxx视频xxx69| 国产人妖伪娘一区91| 欧美成人精品激情在线观看| 91精品国产乱码久久久久久久久| 国产成人亚洲综合91精品| 欧美日韩国产二区| 一本大道香蕉久在线播放29| 亚洲图片制服诱惑| 亚洲区在线播放| 国产精品电影观看| 精品色蜜蜜精品视频在线观看| 欧美野外wwwxxx| 欧美刺激性大交免费视频| 亚洲黄色www网站| 久久久成人的性感天堂| 日韩精品在线免费观看| 亚洲欧美另类人妖| 91日本在线观看| 国产精品高潮在线| 欧美久久精品一级黑人c片| 国产精品美女www爽爽爽视频| 亚洲精品www久久久| 亚洲91精品在线| 久久亚洲精品小早川怜子66| 国产99视频在线观看| 精品成人69xx.xyz| 91久久综合亚洲鲁鲁五月天| 日韩精品日韩在线观看| 欧美日韩激情视频| 国产成人精品电影| 国产99久久久欧美黑人| 国产精品av电影| 国产一区二区黄| 91亚洲一区精品| 92看片淫黄大片欧美看国产片| 国产日本欧美在线观看| 91香蕉嫩草神马影院在线观看| 日韩精品在线观看一区二区| 日韩中文字幕在线免费观看| 欧美裸体视频网站| 亚洲精品久久久久久下一站| 国产日韩欧美在线看| 亚洲白拍色综合图区| 亚洲色图校园春色| 久久久99免费视频| 成人黄色影片在线| 色哟哟入口国产精品| 在线观看精品自拍私拍| 国产又爽又黄的激情精品视频| 91青草视频久久| 九九精品视频在线观看| 国产精品永久免费| 亚洲国产第一页| 国产精品99导航| 色偷偷av一区二区三区乱| 欧美日韩免费观看中文| 欧美性猛交xxxx乱大交蜜桃| 欧美国产日韩一区| 国产婷婷成人久久av免费高清| 久久综合伊人77777蜜臀| 国产欧美久久久久久| 亚洲精品视频中文字幕| 国产精品视频自在线| 国产丝袜视频一区| 欧美日韩国产999| 日韩国产欧美精品一区二区三区| 成人在线激情视频|