最近做微信公眾號開發的時候遇到一個問題,上線后發現此問題后檢查代碼沒有發現問題,無奈只能回滾到上一個版本。
問題是這樣的:頁面一個選擇的浮層,在浮層點擊確定后,下面的頁面會自動提交
在測試環境上無法重現,也不可能用正式環境測試問題,百撕不得騎姐之際,突然想到這個現象十分像JS冒泡,當然不是JS冒泡,那會不會是點了這個確定觸發了下面的提交,測試環境沒問題是因為測試環境由於數據原因,提交按鈕剛好沒在確定下面。
這個容易,造數據驗證,果然猜對了。剩下的就好辦了,在浮層還在的時候鎖掉下面的提交就好了。
這個浮層是由mobiscroll.scroller控件產生的,去翻文檔,發現特別慢,懶得翻牆就看了下控件的源碼。
找到了浮層打開前的事件:onBeforeShow;又找到了選擇事件,同時因為需要顯示的值和控件原本的不同,就直接改代碼了:
/** * Set button handler. */ that.select = function () { if (that.hide(false, 'set') !== false) { setValue(true, true, 0, true); var showText = that.getValue(); if(showText.length>12){ var text = showText.slice(0,11); showText = text + "..."; } /*event('onSelect', [that.val]);改為顯示值*/ event('onSelect', [showText]); /*加個事件*/ event('onEndSelect', [showText]); } }; /** * Cancel and hide the scroller instance. */ that.cancel = function () { if (that.hide(false, 'cancel') !== false) { event('onCancel', [that.val]); event('onEndSelect', [that.val]); } };
掉用處的代碼:
var opt = { 'select-opt': { preset: 'select', group: true, width: 50 ,onBeforeShow:function(){ lockSure = true; } ,onClose:function(){ setTimeout('lockSure = false;',400); } ,onEndSelect:function(){ setTimeout('lockSure = false;',330); } } };
上面onClose是同事連VPN后在文檔中找到的事件,不過發現直接在事件中設置鎖定變量值是不行的,只好延遲一下執行。經過測試,在手機反應比較慢時onClose在400毫秒時或選擇結束時延遲330毫秒基本可以保證執行正常,選擇結束效果產生會快一點,onClose的效果會比我加的事件處理全面一些,所以兩個都保留了。