一道筆試題
之前偶然看到一個公司的筆試題,題目如下:
用HTML5、CSS3、JavaScript,做一個網頁,實現如下圖形式計算器
1.有且只有一個文件:index.html。不允許再有其他文件,不允許再有單獨的CSS、JS、PNG、JPG文件。 2.運行環境為 Google Chrome。 3.必須支援標準的四則運算。例如:1+2*3=7。 4.請在收到郵件的48小時內獨立完成本測試,並回覆本郵件。一道筆試題引發的一個練手項目
花了一點時間寫好的第一版,符合了筆試題的要求。後來左看右看覺得還可以改進做的更好,於是給它不斷的改進,加新功能等,這樣下來沒完沒了,利用業餘時間一點一點的寫,從剛開始的網頁版,到後來做響應式的行動版,再到現在的行動App,短短續續大概寫了3個月吧。 專案地址最終版的計算器,專案地址和預覽圖片在 GitHub:https://github.com/dunizb/sCalc。 功能說明最終版的功能如下:版本更新檢查(App)
專案只是練手,所以採用了HTML5個CSS3技術,也不打算相容IE等低版瀏覽器,所以直接使用CSS3提供的Flexbox佈局方式。並且使用rem單位來進行自動計算尺寸。
key由appName+id組成,id是自動增長不重複的,可以按id和appName刪除一條記錄,輸入*則全部刪除。 打包APP行動Web版計算器寫完後,又想把他做成APP在手機上運行,由於本人沒用過混合APP諸如ionic之類的框架,所以參考了一下,選擇了Hbuild來進行開發和APP的打包,非常方便。 (HBuild).單手模式
左滑右滑可以切換單手模式,這就需要移動端的touch事件了,使用如下代碼判斷是左滑還是又滑:
/** 单手模式 */ function singleModel(){ var calc = document.getElementById("calc"); var startX = 0,moveX = 0,distanceX = 0; var distance = 100; var width = calc.offsetWidth; //滑动事件 calc.addEventListener("touchstart",function(e){ startX = e.touches[0].clientX; }); calc.addEventListener("touchmove",function(e){ moveX = e.touches[0].clientX; distanceX = moveX - startX; isMove = true; }); window.addEventListener("touchend",function(e){ if(Math.abs(distanceX) > width/3 && isMove){ if( distanceX > 0 ){ positionFun("right"); //右滑 }else{ positionFun("left"); //作滑 } } startY = moveY = 0; isMove = false; }); }
如果是坐滑,就position:absolut;left:0,bottom:0,再把最外層DIV縮小到80%,這樣就實現了左滑計算器縮小移動到左下角。右滑道理一樣。
電話撥打功能
當輸入手機號碼後長按等於號碼可以撥打手機號碼。這個功能沒什麼神奇,在行動Web上會對那些看起來像是電話號碼的數字處理為電話鏈接,例如:
7位數字,形如:1234567
帶括號及加號的數字,形如:(+86)123456789
雙連接線的數字,形如:00-00-00111
11位元數字,形狀如:13800138000也會被識別。我們可以透過以下的meta來開啟電話號碼的自動辨識
<meta name="format-detection" content="telephone=yes" />
<a href="tel:123456">123456</a>
開啟簡訊功能:
<a href="sms:123456">123456</a>
在關於頁面,有一個版本更新檢查按鈕,就能檢查是否有新版本,這個功能的原理是發送一個JSOPN請求去檢查伺服器上的JSON文件,比對版本號,如果伺服器上的版本比APP的版本高則會提示有新版本可以下載。
客戶端JavaScript程式碼:
function updateApp(){ //检查新版本 var updateApp = document.getElementById("updateApp"); updateApp.onclick = function(){ var _this = this; $.ajax({ type:'get', url:'http://duni.sinaapp.com/demo/app.php?jsoncallback=?', dataType:'jsonp', beforeSend : function(){ _this.innerHTML = " 正在检查新版本..."; }, success:function(data){ var newVer = data[0].version; if(newVer > appConfig.version){ var log = data[0].log; var downloadUrl = data[0].downloadUrl; if(confirm("检查到新版本【"+newVer+"】,是否立即下载?\n 更新日志:\n " + log)){ var a = document.getElementById("telPhone"); a.href = downloadUrl; a.target = "_blank"; a.click(); } }else{ alert("你很潮哦,当前已经是最新版本!"); } _this.innerHTML = " 检查新版本"; }, error:function(msg){ _this.innerHTML = " 检查新版本"; alert("检查失败:"+msg.message); } }); } }
服務端JSON:
[ { "version":"3.1.0", "downloadUrl":"http://dunizb.b0.upaiyun.com/demo/app/myCalc-3.1.0.apk", "hashCode":"20160812224616", "log":"1.新增切换主题功能 \n 2.新增单手切换模式功能 \n 3.调整UI " } ]