在微信開發H5頁面的時候,每每藉助於WeUI或者Jquery WeUI等基礎上進行界面效果的開發,因爲本人喜歡在Asp.net的Web界面上使用JQuery,所以比較傾向於使用 jQuery WeUI,本篇隨筆結合官方案例和本身的項目實際開發過程的經驗總結,對在H5頁面開發過程當中設計到的界面控件進行逐一的分析和總結,以期可以給你們在H5頁面開發過程當中提供有用的參考。javascript
本篇隨筆繼續上篇隨筆《基於Jquery WeUI的微信開發H5頁面控件的經驗總結(1)》進行介紹其餘部分的內容。html
7)條碼、二維碼生成java
在咱們作一些掃碼操做的時候,咱們可能須要根據一些參數生成一些URL,而後生成一個二維碼的方式,方便手機掃碼直接查看,或者給一些條碼設備進行條碼的讀取,那麼這兩種狀況結合起來就是二維碼和條碼的處理場景。jquery
例以下面的處方信息展現裏面,就須要這樣的場景。git
二維碼QRCode使用的地址是:https://github.com/davidshimjs/qrcodejs github
條碼JsBarcode使用的地址是:https://github.com/lindell/JsBarcodeajax
使用前,咱們引入所須要的qrcodejs和JsBarcode的JS庫文件。數據庫
<script src="~/Content/JQueryTools/qrcodejs/qrcode.min.js"></script> <script src="~/Content/JQueryTools/JsBarcode/dist/JsBarcode.all.min.js"></script>
二維碼和條碼的處理腳本很簡單,以下JS代碼所示。json
//條碼 JsBarcode("#barcode", "@ViewBag.Info.PrescriptionNo", { format: "CODE128", lineColor: "#0aa", height: 50, displayValue: false }); //二維碼 var url = '@ViewBag.WebsiteDomain/h5/PrescriptionDetail?id=@ViewBag.Info.ID'; var qrcode = new QRCode(document.getElementById("qrcode"), { text: url, //"@ViewBag.Info.PrescriptionNo", width: 128, height: 128, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.H });
使用腳本處理的方式很是不錯。跨域
8)JQuery的Ajax/Post/Get等相關處理
在咱們前面不少案例代碼裏面,都採用了JQuery的Ajax/Post/Get/getJSON等函數,它們之間不少時候能夠相互替代,差別只是不多的部分。
$.get()方法使用GET方式來進行異步請求,它的語法結構爲:$.get( url [, data] [, callback] )。以下代碼所示。
$.getJSON()是專門爲ajax獲取json數據而設置的,而且支持跨域調用,其語法的格式爲:getJSON(url,[data],[callback])。
var flowUsers = []; var url = '/qyh5flow/GetCorpUser'; $.getJSON(url, function (data) { $.each(data, function (i, item) { flowUsers.push({ title: item.name, value: item.userid }); }); $("#txtSelectSignUser").select({ title: "選擇會籤人員", items: flowUsers, multi: true, //min: 2, //max: 3, }); });
$.get()和$.getJSON()兩種方法,後者比前者多了一個對返回數據進行JSON轉換對象的處理,$.get()方法須要使用下面代碼進行JSON的轉換。
var data = $.parseJSON(json);
$.post()方法使用POST方式來進行異步請求,它的語法結構爲:$.post(url,[data],[callback],[type]),這個相對於$.get()的操做,使用POST方式提交。
其中的type:type爲請求的數據類型,能夠是html,xml,json等類型,若是咱們設置這個參數爲:json,那麼返回的格式則是json格式的,若是沒有設置,就和$.get()返回的格式同樣,都是字符串的。
以下代碼是咱們使用$.post()的函數進行數據的提交,注意咱們也須要使用$.parseJSON進行返回值JSON轉換對象的處理。
$.post(url, postData, function (json) { //轉義JSON爲對象 var data = $.parseJSON(json); if (data.Success) { $.toptip("刪除成功!", 'success'); //在界面上找到對應控件ID,移除控件 RemoveImg(); } else { $.toast("操做失敗:" + data.ErrorMessage, "forbidden"); } });
$.ajax()是jquery中通用的一個ajax封裝,其語法的格式爲:$.ajax(options),其中options是一個object類型,它指明瞭本次ajax調用的具體參數。
通常在使用FormData對象的時候,我傾向於使用$.ajax進行處理,以便更多的彈性化設置。
//提交表單數據和文件 var url = "/qyH5Flow/PaymentSave?userid=@ViewBag.userid"; $.ajax({ url: url, type: 'post', processData: false, contentType: false, data: formData, success: function (json) { //轉義JSON爲對象 var data = $.parseJSON(json); if (data.Success) { $.toast("保存成功,稍後請到列表界面查看。"); } else { $.toast("保存失敗:" + data.ErrorMessage, "forbidden"); } } });
以上就我進行在案例裏面使用的各類操做,有時候能夠相互替換,根據須要選擇不一樣的操做方式便可。
9)JS腳本的數組對象處理
上面咱們使用了各類異步的操做,如JQuery的Ajax/Post/Get/getJSON等函數操做,常常會涉及對數組的遍歷處理或者插入處理。
JS數組是一個很的強大的數組對象,支持不少複雜的操做,對數組的操做也是咱們常常處理的方式之一。
例如對於返回的數據,咱們通常須要進行數組的遍歷,而後逐一追加到界面顯示,這裏就須要使用$.each()函數。
//動態處理圖片綁定 $.getJSON("/Qyh5Flow/GetImageList2?attachGuid=" + info.AttachGUID, function (data) { $.each(data, function (i, item) { $("#imgAttach").append(`<img class='weui-uploader__file' src='${item.Text}' id='img_${item.Value}'/>`); }); });
$.each()函數另外一個常用的場景就是根據JQuery選擇器進行元素集合的遍歷處理。
var itemCount = 0; //計算單選框的選中數量 $("input[type='radio']:checked").each(function(){ itemCount += 1; }); //複選框選中算一個 var chkName = [] $("input[type='checkbox']:checked").each(function () { var name = $(this).attr('name'); if (chkName.indexOf(name) < 0) { itemCount += 1; chkName.push(name); } });
咱們在須要加入對象的時候,就須要使用push()函數操做了,有時候每每和$.each()函數配合使用。
var items = []; $.each(data, function (i, item) { items.push({ title: item.Text, value: item.Value }); });
或者進行元素遍歷查詢的時候,以下代碼所示。
//構建選中的列表內容 var list = []; //計算單選框 $("input[type='radio']:checked").each(function () { list.push($(this).val()); }); //計算複選框 $("input[type='checkbox']:checked").each(function () { list.push($(this).val()); });
若是咱們須要判斷某個對象是否在集合裏面,咱們就會用到$.inArray() 函數進行判斷,以下代碼所示。
if ($.inArray(key, addKeyList) == -1) { addKeyList.push(key); addValueList.push(value); sendList.push({ key: key, value: value}); $('#tagsToSend').addTag(value); }
另外,咱們對數組還須要瞭解,如何移除單個或者全部的集合,這個就用到了splice()函數,以下代碼所示。
addKeyList.splice(i, 1);//移除某個對象 addValueList.splice(i, 1);//移除某個對象 sendList.splice(i, 1);//移除某個對象
若是須要清空數組,經常使用的作法以下所示,也是使用splice()函數。
//清空用戶選擇 function ClearChoice() { $('#tagsToSend').importTags(''); sendList.splice(0, sendList.length);//待發送的部門、標籤、用戶列表 addKeyList.splice(0, addKeyList.length);//鍵的集合 addValueList.splice(0, addValueList.length);//值的集合 }
以上就是咱們操做數據的時候,常用的一些方法。
10)查詢即時列表展現
有時候,咱們須要根據查詢的條件,對數據庫的信息進行檢索,而後即時的顯示在列表中,供選擇使用,以下界面所示。
上圖是我項目中,根據拼音碼或者名稱對藥品進行檢索,返回的數據進行顯示的處理。
爲了使用搜索欄,咱們使用了微信WeUI定義的搜索欄樣式,如下是界面定義的搜索欄DIV層,以下代碼。
<!--搜索欄,相似於微信原生的搜索欄,應用於常見的搜索場景。--> <div class="weui-search-bar" id="searchBar"> <form class="weui-search-bar__form" onkeydown="if(event.keyCode==13) return false;"> <div class="weui-search-bar__box"> <i class="weui-icon-search"></i> <input type="search" class="weui-search-bar__input" id="searchInput" placeholder="搜索" required=""> <a href="javascript:clear()" class="weui-icon-clear" id="searchClear"></a> </div> <label class="weui-search-bar__label" id="searchText" style="transform-origin: 0px 0px 0px; opacity: 1; transform: scale(1, 1);"> <i class="weui-icon-search"></i> <span>請輸入你想要查看的關鍵字</span> </label> </form> <a href="javascript:clear()" class="weui-search-bar__cancel-btn" id="searchCancel">取消</a> </div>
咱們在JS代碼上執行對應事件的處理,以下所示。
主要就是監控Input控件的內容變化,進行及時的查詢和內容展現。
//查詢框輸入內容觸發事件 $('#searchInput').bind('input propertychange', function () { var name = $("#searchInput").val(); //獲取Json對象集合,並生成數據顯示內容 var url = "/h5/FindDrugWithPager?page=1&rows=5&Name=" + encodeURI(name); $.getJSON(url, function (data) { $("#searchContent").html(""); var html = ""; $.each(data.rows, function (i, item) { var background = (i % 2 == 0) ? "background-color:Highlight" : ""; html += `<li> <div class='pic'><img src='@ViewBag.WebsiteDomain/Content/images/drug.png' /></div> <div class='text'> <h2><i></i><span>` + item.CommonName + `</span><em>`+ item.Specification +`</em></h2> <p>商品名:` + item.ProductName + `</p> <p>廠 家:`+item.Manufacturer +`</p> </div> <a class='ture' href=\"javascript:;\" onclick=\"AddDrug('` + item.ID + `','`+ item.ProductName +`')\" ><img src='@ViewBag.WebsiteDomain/Content/images/add1-24.png'></a> </li>`; }); $("#searchContent").html(html); }); }); function cancel() { $("#searchContent").empty(); } function clear() { $('#searchInput').val('') $("#searchContent").empty(); }
這裏的HTML模板,咱們有時候也使用代碼塊的方式,在模板代碼裏面插入變量,以下所示。
$.getJSON("/Qyh5Flow/GetImageList2?attachGuid=" + info.AttachGUID, function (data) { $.each(data, function (i, item) { $("#previewImage").append(`<img class="weui-preview-box" src='${item.Text}' id='img_${item.Value}'/>`); }); });
這裏的代碼塊,開始和結束符使用了 ` ` 符號塊,其中插入了變量${item.Text} 、${item.Value}等變量字符串,並無打斷模板的內容,若是多行,咱們同樣的處理,很是方便。
$.getJSON(url, function (data) { var html = ""; $.each(data.rows, function (i, item) { html += `<div class="weui-panel weui-panel_access"> <div class="weui-panel__hd"> <span>${item.FormName}</span>:<span>${item.EditorName}</span>,<span>${item.Edittime}</span> <span class="ord-status-txt-ts fr"><b>${GetStatus(item.Status)}</b></span> </div> <div class="weui-media-box__bd pd-10"> <div class="weui-media-box_appmsg ord-pro-list"> <div class="weui-media-box__bd"> <p class="weui-media-box__desc">標題:<span>${item.Title}</span></p> <div class="clear mg-t-10"> <div class="pro-amount fl"><span class="font-13">當前處理類型:<em class="num font-15">${item.Proc_TypeName}</em></span></div> <div class="pro-amount fr"><span class="font-13">當前處理人:<em class="name">${item.Proc_UserName}</em></span></div> </div> </div> </div> </div> <div class="weui-panel__ft"> <div class="weui-cell weui-cell_access weui-cell_link oder-opt-btnbox"> <a href="${item.ViewUrl}?id=${item.ID}" class="ords-btn-dele">查看詳情</a> </div> </div> </div>`; }); $("#" +divname).html(html); });
這是咱們推薦使用的JS代碼塊,整塊代碼都不影響閱讀,並且能夠換行排版,很是直觀。
11)界面彈窗處理
在微信Weui裏面定義了幾種常規的彈窗處理。
對話框只能經過 JavaScript 進行調用,微信WeUI提供了三種經常使用的對話框 Alert, Confirm, Prompt 和 Login。咱們也能夠經過 $.modal
來自定義對話框
實際上, Alert, Confirm, Prompt 和 Login 都是 Modal 的一種定製而已。
通常的JS調用代碼以下所示。
//常規提示窗口 $.alert("自定義的消息內容", "自定義的標題"); //確認提示窗口 $.confirm("自定義的消息內容", "自定義的標題", function() { //點擊確認後的回調函數 }, function() { //點擊取消後的回調函數 });
例如咱們在流程表單處理裏面,會在操做前進行提示用戶是否確認處理。
//退回擬稿人從新處理 function ApplyCancel(opinion) { var tipMessage2 = "數據檢查完畢,如確認無誤將【退回擬稿人從新處理】,您確實要提交嗎?"; $.confirm(tipMessage2, "退回擬稿人從新處理?", function () { var userid = "@ViewBag.userid"; var applyid = "@Request["id"]"; var url = "/QyH5Flow/SkipFirstApply"; //構造參數發送給後臺 var postData = { userid: userid, applyId: applyid, opinion: opinion }; $.post(url, postData, function (json) { var data = $.parseJSON(json); if (data.Success) { //console.log(data); //提示處理結果 $.toast("您已經退回經辦人進行修改。"); $.closePopup(); initControls();//從新加載 } else { $.toast("操做失敗:" + data.ErrorMessage); } }); }, function () { //取消操做 }); }
登錄窗口界面效果以下所示。
$.login("自定義的消息內容", function(username, password) { // 這裏進行登陸操做 }, function() { }); //若是參數過多,建議經過 object 方式傳入 $.login({ title: '標題', text: '內容文案', username: 'tom', // 默認用戶名 password: 'tom', // 默認密碼 onOK: function (username, password) { //點擊確認 }, onCancel: function () { //點擊取消 } });
咱們能夠利用登陸框進行一個系統帳號的綁定,以下是實際項目的處理代碼。
$(document).on('click', '#btnBind', function() { $.login({ title: '登陸', text: '請輸入用戶名和密碼', onOK: function (username, password) { var url = "/H5/VerifyUser?openid=@ViewBag.openid"; var postData = { username: username, password: password }; $.post(url, postData, function (json) { //轉義JSON爲對象 var data = $.parseJSON(json); if (data.Success) { $.toptip('登陸成功!'); location.reload();//刷新頁面 //WeixinJSBridge.call('closeWindow');//關閉窗口 } else { $.toptip("登陸失敗:" + data.ErrorMessage, "forbidden"); } }); }, onCancel: function () { $.toptip('取消登陸!', 'cancel'); } }); });
上述的幾種對話框都是 $.modal
的一種特殊形式。你能夠經過 $.modal
來定製對話框
$.modal({ title: "Hello", text: "我是自定義的modal", buttons: [ { text: "支付寶", onClick: function(){ console.log(1)} }, { text: "微信支付", onClick: function(){ console.log(2)} }, { text: "取消", className: "default", onClick: function(){ console.log(3)} }, ] });
默認狀況下,點擊對話框的按鈕都會先關閉對話框再觸發回調函數。能夠經過JS來關閉任何正在顯示的對話框:
$.closeModal();
除了上面的幾種狀況的模態對話框,還有一種是Popup彈出遮蓋下面頁面的場景,如常規的購物車的狀況。
Popup 是一個覆蓋式的彈出層,能夠徹底蓋住當前頁面或者遮蓋一半。
例如我在流程處理頁面中,每每須要進行審覈、會籤處理的時候,彈出對應的處理內容,這個就是Popup的使用場景。
咱們經過JS進行調用顯示窗口。
$("#SignAction").popup();//主動彈出窗口
其中SignAction層就是一個popup的窗口層,視圖HTML代碼以下所示。
咱們只須要注意到 class='weui-popup__container popup-bottom' 的說明,就知道它的樣式了,從底部彈出的Popup窗口。
若是沒有加上Popup-bottom的樣式,那麼就是全屏覆蓋的模式。
關閉 Popup
給任何連接加上 class='close-popup'
則點擊以後能夠關閉當前打開的 popup. 你也能夠經過 $.closePopup()
來關閉。
12)微信JSSDK的整合等處理
微信JSSDK提供了不少豐富的功能,咱們能夠利用JSSDK實現圖片的上傳、預覽、掃碼等操做,圖片上傳因爲我使用了附件上傳的方式,所以不在介紹較爲繁瑣的JSSDK圖片上傳模式,有興趣能夠參考我以前隨筆《微信開發中使用微信JSSDK和使用URL.createObjectURL上傳預覽圖片的不一樣處理對比》瞭解下不一樣。
a) 圖片預覽
通常咱們在一些查看內容的視圖界面裏面,每每對圖片進行預覽操做,這時候能夠利用JSSDK的圖片預覽接口,在使用JSSDK接口前,須要進行接口的初始化,而後才能調用,下面是初始化和調用的案例代碼。
<!--微信API初始化--> <script language="javascript"> var appid = '@ViewBag.appid'; var noncestr = '@ViewBag.noncestr'; var signature = '@ViewBag.signature'; var timestamp = '@ViewBag.timestamp'; wx.config({ debug: false, appId: appid, // 必填,公衆號的惟一標識 timestamp: timestamp, // 必填,生成簽名的時間戳 nonceStr: noncestr, // 必填,生成簽名的隨機串 signature: signature, // 必填,簽名,見附錄1 jsApiList: [ 'checkJsApi', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage' ] }); //全部準備好後,經過樣式查找的方式,加入對應集合,而後綁定click事件 wx.ready(function () { var $images = $(".preview").find("img"); var imgPaths = []; $images.each(function(){ imgPaths.push(this.src); }); $images.on("click",function(){ wx.previewImage({ current: this.src, urls: imgPaths }); }); }); </script>
而圖片的初始化,咱們能夠在HTML代碼進行處理便可。
<div id="previewImage" class="preview"> @if (ViewBag.PresImages != null) { for (var i = 0; i < ViewBag.PresImages.Count; i++) { <img class="weui-preview-box" src='@ViewBag.PresImages[i]' alt="處方圖片"> } } </div>
b) 調用掃碼處理
咱們能夠利用JSSDK調用手機的掃碼操做,讓其進行相應的掃碼處理,以下是使用JSSDK進行掃碼的JS代碼。
<script language="javascript"> var appid = '@ViewBag.appid'; var noncestr = '@ViewBag.noncestr'; var signature = '@ViewBag.signature'; var timestamp = '@ViewBag.timestamp'; wx.config({ debug: false, appId: appid, // 必填,公衆號的惟一標識 timestamp: timestamp, // 必填,生成簽名的時間戳 nonceStr: noncestr, // 必填,生成簽名的隨機串 signature: signature, // 必填,簽名,見附錄1 jsApiList: [ 'checkJsApi', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'scanQRCode' ] }); //全部準備好後 wx.ready(function () { document.querySelector('#scancode').onclick = function () {//調用掃碼事件返回掃碼值 wx.scanQRCode({ needResult: 1, desc: 'scanQRCode desc', success: function (res) { //console.log(res.resultStr); var isUrl = CheckUrl(res.resultStr); if (isUrl) { location.href = res.resultStr;//跳轉頁面 } } }); }; }); //驗證URL字符串 function CheckUrl(str) { var RegUrl = new RegExp(); RegUrl.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$");//jihua.cnblogs.com if (!RegUrl.test(str)) { return false; } return true; } </script>
上面掃碼後,識別判斷URL,若是是URL,那麼頁面地址自動調整到相應的界面上去。
以上就是一些實際項目中運用到的各類界面處理和JS處理代碼,拋磚引玉,但願你們多多支持和鼓勵。