學習之路--微信公眾號開發(二)--前端開發遇到的問題


(邏輯和表達能力不強,或許只有我自己才能看懂吧?/捂臉)

大寫的壹——技術知識點學習

一、http://jqweui.com/extends#infinite  ——JQuery WEUI

  在這里也不詳細說了,功能很多,如果寫的話能寫好幾章……下面列出一些主要功能:

    表單,文件上傳,加載提示,搜索欄,加載更多,下拉刷新,滾動加載,圖片瀏覽器,日歷日期時間控件,地址控件,通知控件,下拉框控件,彈出框

二、http://lbs.qq.com/javascript_v2/index.html  ——騰訊地圖導航接口文檔

三、http://lbsyun.baidu.com/index.php?title=jspopular/guide/routeplan  ——百度地圖導航接口文檔,實現距離計算。示例:http://lbsyun.baidu.com/jsdemo.htm#i5_5

四、文件上傳ajaxfileupload.js

大寫的貳——遇到的問題及解決方法

一、輪播圖問題

  1、輪播圖的圖片由后台傳過來的數據加載;

  2、輪播圖在電腦上的微信web開發者工具沒法調試,需要使用真機調試;

  3、應該是先通過模板或別的途徑加載好輪播圖內部的節點,才進行初始化。

 1 // 初始化輪播圖
 2 function newSwiper() {
 3     var mySwiper = new Swiper('.swiper-container', {
 4         direction: 'horizontal',
 5         loop: true,
 6         // 如果需要分頁器
 7         pagination: '.swiper-pagination'
 8     })
 9 }
10 
11 // 加載輪播圖數據
12 function addSwiper() {
13     var url = "/home-ajax/swiper";
14     $.post(url, function(data) {
15         console.log(data);
16         var h = template("swiper-tpl", data);
17         $('#swiper-body').html(h);
18         newSwiper();
19     }, "json");
20 }

 

 二、滾動加載問題

   1、滾動加載在電腦上的微信web開發者工具沒法調試,需要使用真機調試;

   2、項目采用了WEUI的滾動加載功能,沒有注意原項目在common.js層已經另行寫有了一個不采用WEUI的滾動加載的方法。

   3、內容的加載不能使用.html(),而應該使用.append();

  4、滾動加載相當於后台項目中的分頁功能,需要分步去請求數據,需要有分頁的索引;

  5、最后一頁的下一頁的滾動加載不需要請求后台,直接變換為無更多內容。

  6、滾動加載事件的觸發在加載期間是持續觸發的,要做判斷並提前提出事件。

  7、觸發滾動事件的滾動高度寫高點,數據加載的量(每頁多少條數據)也寫大點,盡量不要讓用戶看到類似正在加載的文字,這樣體驗友好一點。

 1     var listParam = {
 2         "menuId": "1001",
 3         "pageIndex": 0,
 4         "totalPages": 0,
 5         "newsSort": "new"
 6     };
 7     // 初始加載第一頁
 8     addList(listParam);
 9     // 滾動加載
10     var loading = false; //狀態標記為不加載
11     $(document.body).infinite(50).on("infinite", function() {
12         if (loading) return; // 如果正在加載,則退出事件
13         // 如果沒有下一頁了,加載圖標消失和無更多內容顯示
14         if (listParam.pageIndex >= listParam.totalPages) {
15             setTimeout(function() {
16                 $(".loadmore .weui-loadmore").hide();
17                 $(".loadmore .no-more-data").show();
18                 $(document.body).destroyInfinite();
19                 return;
20             }, 1000);
21         }
22         loading = true;
23         setTimeout(function() {
24             addList(listParam);
25             loading = false;
26         }, 1000);
27     });
28     // 加載列表數據
29     function addList(listParam) {
30         var url = "/home-ajax/newsList";
31         $.post(url, listParam, function(data) {
32             var h = template("list-tpl", data);
33             $('#list-body').append(h);
34             listParam.totalPages = data.totalPages;
35             listParam.pageIndex++;
36         }, "json");
37     }

 

 

三、圖片加載問題

  1、除去前端頁面的logo等死圖片之外,大部分圖片的加載來自后台;

  2、公司使用的template.js,寫法是這樣:<img src="/gridfs-download?f_id={{v.imgId}}">,完整的是這樣:<img src="${contextPath}/gridfs-download?f_id={{v.imgId}}">

  3、但是這樣寫不對,因為鏈接到的應該是后台項目的方法,后台的前端頁面可以這樣寫,畢竟在同一個項目,而微信項目是另一個項目,其本身的${contextPath}是微信本身的路徑。

  4、還有一個地方就是詳情加載的時候,詳情的內容是可以有圖片視頻之類的,在后台的新增頁里,詳情的正文內容是一個編輯器(UEditor),圖片鏈接有可能是這樣的:

   

    也有可能是這樣的:

  

  5、微信加載內容的代碼是這樣的:

 1 <script type="text/html" id="detail-tpl">
 2     <div class="title">
 3         <p>{{results.title}}</p>
 4     </div>
 5     <div class="time">
 6         {{results.lastUpdate | dateFormat:'yyyy-MM-dd'}}
 7     </div>
 8     <div class="content">
 9         {{#results.content}}
10     </div>
11 </script>
12 
13 // 去掉文本標簽
14 // {{#jobinfo.info | removeTag}}
15 template.helper('removeTag', function(data) {
16     return data.replace(/<[^>]+>/g, "");
17 });

  6、綜上所述,我們要解決問題的關鍵是改掉圖片的鏈接:

 1 // 首先在最頂部的位置(聲明contextPath的位置)聲明一個后台系統的絕對路徑
 2 <%
 3     String serverUrl=Constants.MEN_HU;
 4     request.setAttribute("serverUrl",serverUrl);
 5 %>
 6 <script>
 7     var serverUrl = '${serverUrl}';
 8 </script>
 9 // 前端頁面img鏈接改寫成:
10     <img src="${serverUrl}/gridfs-download?f_id={{v.imgId}}">
11 
12 
13 // 詳情的鏈接沒法直接改寫,我們可以在填充模板之后,再通過js遍歷所有的圖片,再改寫
14     $.post(url, listParam, function(data) {
15         var h = template("detail-tpl", { "results": data });
16         $('#detail-body').html(h);
17         updateImgSrc('detail-body');
18     }, 'json');
19 
20 /**
21  * 修改詳情內容中的圖片鏈接路徑,(contextPath)
22  * @param {*要填充模板的body的id} templateBodyId
23  *  
24  */
25 function updateImgSrc(templateBodyId) {
26     $("#" + templateBodyId).find("img").each(function(i) {
27         var src = $("#" + templateBodyId).find("img").eq(i).attr("src");
28         if ("/gridfs-download?f_id=" == src.substring(0, 22)) {
29             src = serverUrl + src;
30         }
31         $("#" + templateBodyId).find("img").eq(i).attr("src", src);
32     });
33 }

 

 

 四、文件上傳問題

  1、整個項目就一個地方用到了文件上傳,因為整個包括后台項目都是我來干,所以我很清楚微信項目並沒有連接數據庫,而且文件上傳后支撐它的后台項目要能看到。

  2、解決方法:首先在微信項目中引入數據庫,文件上傳的數據庫和后台項目中文件上傳的數據庫(MongoDb)要一致。

  3、引入mongo的maven包(改pom.xml),引入gridFSKit.java文件(從后台項目中拷過來,這個文件我是看不懂),新建一個GridfsController.java;

  4、在新建的文件里面寫upload方法,然后把url給前端,前端就可以調用了。

  5、前端采用的是ajaxfileupload.js插件實現文件的上傳。

 1     var data = {
 2         fileId: 'btnUpLoad',
 3         successCall: function(data, status) {
 4             if (data) {
 5                 $('input[name="entity.imgName"]').val(data.filename);
 6                 $('input[name="entity.imgId"]').val(data.f_id);
 7             }
 8         }
 9     }
10     uploadFile(data);
11 
12 // 上傳文件(點擊上傳文件控件就上傳)
13 function uploadFile(options) {
14     options = options || {};
15     options.url = options.url || "/gridfs/upload";
16     options.fileId = options.fileId || "btnUpLoad";
17     $(document).on('change', '#' + options.fileId, function(e) {
18         _doUpload(options);
19     });
20 }
21 
22 function _doUpload(options) {
23     $.ajaxFileUpload({
24         url: options.url, //用於文件上傳的服務器端請求地址
25         secureuri: false, //是否需要安全協議,一般設置為false
26         fileElementId: options.fileId, //文件上傳域的ID
27         dataType: 'json', //返回值類型 一般設置為json
28         success: function(data, status) { //服務器成功響應處理函數
29             if (!data.success) {
30                 return;
31             }
32             $.toptip("上傳成功", 'success');
33             if (options.successCall && typeof options.successCall == 'function') {
34                 options.successCall.call($(options.fileId), data, status);; //data.info --> fileId
35             }
36         },
37         error: function(data, status, e) { //服務器響應失敗處理函數
38             $.toptip(e + "", 'error');
39         }
40     });
41 }

 

 

 五、微信呼叫功能

  1、就是調用手機的打電話功能,看上去很高大上,但實現上微信這個軟件已經幫我們實現了,我們需要做的只有一步:

  2、給呼叫按鈕用a標簽表示,href這樣寫:<a href="tel:{{v.phone}}">呼叫</a>

  3、只要點擊這個呼叫,就會有一個彈窗,當然,不一樣的手機效果可能不一樣。彈窗之后的操作微信都實現了。效果圖如下:

           

 

 

六、地圖導航功能問題

  1、微信開發要用地圖首先想到的就是騰訊地圖,於是我就去學習了騰訊地圖的API,當我做出來后,發現我並不能實現距離的計算。

  2、彎路:我在騰訊地圖的JavaScript  API 中沒有找到計算距離的方法,然后去學習了微信小程序JavaScript  SDK,最后發現SDK並不適用於公眾號。

  3、彎路:因為此微信項目是有一個原版公眾號的,這次開發是相當於重做,於是我去看了原項目的實現方法,被它帶進去了。

  4、彎路:在網上百度了如何實現距離的計算,以及看了一些案例,發現都是用的百度地圖,於是學習百度地圖JavaScript API。

  5、雖然最后寫出來了,但是很怪異,有點個功能點,一個是在詳情頁顯示距離(百度地圖實現),一個是點擊詳情頁的導航按鈕進入地圖導航(騰訊地圖實現)。

  6、最后回來發現騰訊地圖也可以實現距離的計算,方法在WebService API中。可惜我已經完成功能了,沒必要再否定百度地圖再來一次。

 1 // 導航按鈕功能的實現(騰訊地圖),只需要一個鏈接,這就是騰訊地圖的特點。
 2 // routeplan為路線規划方法,eword為地點名稱,epointx為經度,epointy為緯度,referer為我的應用名稱,key為申請的密鑰,起點不填默認為我的位置(手機定位當前位置)
 3 <a id="map-nav" class="map-nav" href="http://apis.map.qq.com/tools/routeplan/eword={{name}}&epointx={{longitude}}&epointy={{latitude}}?referer=myapp&key=XXX">導航</a>
 4 
 5 // 下面是百度地圖
 6 // 引入js
 7 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=xxx"></script>
 8 // 放置百度地圖的容器,(頁面只要距離,不要地圖,所以樣式設置為隱身)
 9 <div class="baidu-map" id="mymap"></div>
10 
11     /** 百度地圖API功能 start**/
12     var map = new BMap.Map("mymap");
13     map.centerAndZoom(new BMap.Point(116.404, 39.915), 12);
14     var searchComplete = function(results) {
15         if (transit.getStatus() != BMAP_STATUS_SUCCESS) {
16             return;
17         }
18         var plan = results.getPlan(0);
19         $("#distance").text(plan.getDistance(true));
20     }
21     var transit = new BMap.DrivingRoute(map, {
22         renderOptions: { map: map },
23         onSearchComplete: searchComplete,
24         onPolylinesSet: function() {
25 
26         }
27     });
28     var geolocation = new BMap.Geolocation();
29 
30     /** 百度地圖API功能 end**/
31 
32     // 因為距離也是數據填充上去的,百度地圖是異步的,所以百度地圖的請求要放在數據填充之后
33         $.post(url, listParam, function(data) {
34             data.distance = "正在加載…";
35             longitude = data.longitude;
36             latitude = data.latitude;
37             var h = template("list-tpl", data);
38             $("#list-body").html(h);
39             geolocation.getCurrentPosition(function(r) {
40                 if (this.getStatus() == BMAP_STATUS_SUCCESS) {
41                     var mk = new BMap.Marker(r.point);
42                     map.addOverlay(mk);
43                     map.panTo(r.point);
44                     var p1 = new BMap.Point(r.point.lng, r.point.lat);
45                     var p2 = new BMap.Point(longitude, latitude);
46                     transit.search(p1, p2);
47                 } else {
48                     alert('failed' + this.getStatus());
49                 }
50             }, { enableHighAccuracy: true });
51         }, "json");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM