H5頁面基於介面實現數據交互

来源:https://www.cnblogs.com/wangjifeng23/archive/2018/03/19/8603507.html
-Advertisement-
Play Games

對於現在APP開發來說,目前流行的兩個方式是原生和H5。就如同之前業界程式猿爭論的BS和CS之爭一樣,業界對於H5和原生也有不小的爭論。對於前者的爭論在於PC端,後者在於移動端上體現。 那一個APP適合用什麼技術來開發,主要通過下麵幾點來判斷:1、APP對於文字的要求(格式加粗,字體多樣性)是否高, ...


對於現在APP開發來說,目前流行的兩個方式是原生和H5。就如同之前業界程式猿爭論的BS和CS之爭一樣,業界對於H5和原生也有不小的爭論。對於前者的爭論在於PC端,後者在於移動端上體現。

那一個APP適合用什麼技術來開發,主要通過下麵幾點來判斷:

1、APP對於文字的要求(格式加粗,字體多樣性)是否高,H5可以很好的實現,而原生則會弱於H5;

2、APP對於交互(頁面切換,部分版塊變化)的要求是否高,H5通常在交互上比較吃力,有交互的需求是基本上是在載入一個網頁,而原生來說是很簡單的一個過程,只是載入變化部分;

3、APP對於網路的要求(網路較差、是否離線操作)的敏感度,原生可以做到,H5雖然能做,但難度較大;

4、APP對於硬體(麥克風、攝像頭、重力感應器)時候有硬性要求,原生完美實現,未來有新的功能也能有很好的擴展,而H5望塵莫及;

5、APP對於一些活動的更換頻繁程度,對此H5扳回一局,H5對此更換十分方便,維護方便;

6、當然就是預算和對時間的要求,用戶體驗度要求不高的話,那可以用H5來做。


所以綜上所述,對於交互性較強建議原生態開發,而那些大量數據展示的,做H5嵌套進原生框架中,這樣APP會有良好的體驗。同樣在這種情況下,混合開發對於全原生態開發下來說是縮短工期,而對比H5來說,將來的可擴展性和用戶體驗得到保證。

基於上篇http介面開發的博客,這篇文章給大家詳解,H5頁面如何調用介面對數據進行交互以及與原生態鑲嵌。

 

首先展示兩個我自己編寫的請求介面、獲得數據解析之後填充到H5頁面的通用方法(json格式),可以複製直接使用,已寫好註釋

//請求介面
function ajaxForJson(url, op, jsonData, array_params_list) {

    $.post(myConfigHost + url, { "op": op, "jsonData": encodeURIComponent(JSON.stringify(jsonData)) }, function (data)
    {
        if (typeof (array_params_list) == 'undefined' || array_params_list == "" || array_params_list==null)
        {
            ajaxForJsonCommon(data,"#div_temp_items", "#divMain", "");
        }
        else
        {
            if (array_params_list.length > 0)
            {
                for (var p = 0; p < array_params_list.length; p++)
                {
                    ajaxForJsonCommon(data,array_params_list[p]["template_id"], array_params_list[p]["show_id"], array_params_list[p]["data_name"]);
                }
            }
        }
    });
}


//數據解析、模板填充
function ajaxForJsonCommon(data,template_id,show_id,data_name)
{
    var temp_items = $(template_id).html();//獲取模板內容

    var finalHTML = ""; //最終html填充好的字元串

    var list = eval('(' + data + ')'); //這句固定這麼寫,相容所有瀏覽器,將字元串,轉成js的json對象,可以通過.的方式得到數組或者類對象
    if (data_name != "") {
        list = list[data_name];
    }
    for (var i = 0; i < list.length; i++) { //這句幾乎也是固定,後面自行封裝
        var temp_item = temp_items; //每次都是用新模版,避免模版只能使用一次,用到replace函數
        for (var itemKey in list[i]) { //js是有in語法的,用於提出json里的key-value
            if (typeof (wangjifengHandler_key) != 'undefined') {
                wangjifengHandler_key(itemKey, list[i], template_id);
            }
            for (var m = 0; m < 4; m++) {
                temp_item = temp_item.replace("{" + itemKey + "}", list[i][itemKey]);
            }
        }
        finalHTML += temp_item;//拼接內容
    }
    $(show_id).html(finalHTML);//將內容填充到html模板內
    if (typeof (wangjifengHandler) != 'undefined') {
        wangjifengHandler(template_id);
    }
}

 

1.查詢功能

請求通用方法獲得已填充好的html

 

GetQueryString()方法用於接收http請求所帶的參數,便於與原生態進行嵌套。 例如請求地址:http://127.0.0.1:8002/h5app/MyStudy.html?UserId=123456   那麼就會獲得UserId的值。

ajaxForJson()這個方法就是我們剛剛寫的請求介面通用方法,第一個值為介面地址,第二個值為介面名稱,第三個值為介面指定格式的請求數據(本篇文章都是json格式)

我們先F12看下請求介面之後返回的數據

json格式數組的數據。包含CourseId,CourseImage,CourseName,剛剛我寫的兩個通用方法派上用場了。通過他們,可以實現請求介面、獲得數據解析之後填充到H5頁面,意味著我們這個時候什麼都不用做,只需要到H5頁面做數據展示就OK了。

<body>

        <!--
            作者:Wangjifeng
            時間:2018-03-19
            描述:html模版,預設隱藏,只為了讀取出裡面的模版html
        -->
        <div id="div_temp_items" style="display: none;">
            <div class="content">
                <div id="left"><img src="{CourseImage}" width="118.5px" height="67px"></div>
                <div id="right">{CourseName}</div>
            </div>
        </div>

        <div id="divMain" class="main">
            <!--<div class="content">
                <div id="left"><img src="img/kc_bg01.png" width="118.5px" height="67px"></div>
                <div id="right">阿裡前端P6架構師培養計劃</div>
            </div>
            <div class="content">
                <div id="left"><img src="img/kc_bg01.png" width="118.5px" height="67px"></div>
                <div id="right">阿裡前端P6架構師培養計劃</div>
            </div>
            <div class="content">
                <div id="left"><img src="img/kc_bg01.png" width="118.5px" height="67px"></div>
                <div id="right">阿裡前端P6架構師培養計劃</div>
            </div>
            <div class="content">
                <div id="left"><img src="img/kc_bg01.png" width="118.5px" height="67px"></div>
                <div id="right">阿裡前端P6架構師培養計劃</div>
            </div>
            <div class="content">
                <div id="left"><img src="img/kc_bg01.png" width="118.5px" height="67px"></div>
                <div id="right">阿裡前端P6架構師培養計劃</div>
            </div>
            <div class="content">
                <div id="left"><img src="img/kc_bg01.png" width="118.5px" height="67px"></div>
                <div id="right">阿裡前端P6架構師培養計劃王繼峰開發創建的頁面H5開發的頁面</div>
            </div>-->
        </div>
    </body>

有幾個註意的地方

1.需要將以前的div 添加id="divMain",div里內容註釋

2.新增一個div id="div_temp_items" display=“none”

3.將註釋內容複製到div里(一個對象就夠了),再以{屬性名稱}進行數據填寫就可以了。這樣的操作主要是為了配合兩個通用方法進行html模板填充。

我們來看看效果,一個簡單的查詢就完成了~

 

2.編輯功能

首先來看看頁面,兩個開關,實現對狀態的更改操作

 

我們要對這兩個狀態進行更改操作,那麼首先進入頁面時,就要獲取到這兩個狀態的值進行開關的綁定。並且用js進行取值。先看看請求後獲得的json

EnableCourse為課程展示的值,EnableInfo為資料展示的值。ajax請求獲取到了,那麼怎麼利用js進行取值呢?

<script type="text/javascript">
            var UserId = GetQueryString("UserId");

            ajaxForJson("/user/userInfo.aspx", "myInfo", {
                "UserId": UserId
            });

            var EnableCourse = 1; //課程展示狀態
            var EnableInfo = 1; //資料展示狀態

            //獲取課程展示、資料展示狀態
            function wangjifengHandler_key(key, item) {
                if(key == "EnableCourse") {
                    EnableCourse = item[key];
                } else if(key == "EnableInfo") {
                    EnableInfo = item[key];
                }
            }
</script>
wangjifengHandler_key為通用方法已經編寫好的取值方法,所以直接調用,key-value的格式,這樣就可以輕易利用通用方法取你想要的值併進行存儲了,方便各種操作。

我們再回過頭看看通用方法中有一個名為
wangjifengHandler()的方法,他在數據取到並填充至html模板之後進行調用綁定。這個時候我們就可以在html里用它執行各種增刪改操作了,
每次提交請求之後,這個方法都會執行
            //回調函數,在模版填充完畢,自動調用
            function wangjifengHandler() {

                //進行開關圖片的綁定
                if(EnableCourse == 0) {
                    $(".img_course").attr("src", "img/switch_close.png");
                }
                if(EnableCourse == 1) {
                    $(".img_course").attr("src", "img/switch_open.png");
                }
                if(EnableInfo == 0) {
                    $(".img_Info").attr("src", "img/switch_close.png");
                }
                if(EnableInfo == 1) {
                    $(".img_Info").attr("src", "img/switch_open.png");
                }

                //綁定反覆單擊事件
                $(".img_course,.img_Info").click(function() {
                    var value_scr = $(this).attr("src");
                    var value_src_open = $(this).attr("src_open");
                    var value_src_close = $(this).attr("src_close");
                    var value_src_type = $(this).attr("value_src_type");

                    var type = "";
                    var type_state = "";
                    if(value_src_type == "kczs") {
                        //課程展示
                        type = "setEnableCourse";
                        type_state = EnableCourse;
                    } else {
                        //資料展示
                        type = "setEnableInfo";
                        type_state = EnableInfo;
                    }

                    //課程展示、資料展示狀態設置
                    $.post(myConfigHost + "/user/userInfo.aspx", {
                        "op": type,
                        "jsonData": encodeURIComponent(JSON.stringify({
                            "UserId": UserId,
                            "EnableState": type_state
                        }))
                    }, function(data) {
                        var dataObj = eval("(" + data + ")"); //轉換為json對象
                        if(type == "setEnableCourse") {
                            EnableCourse = dataObj.State;
                        } else {
                            EnableInfo = dataObj.State;
                        }
                    });

                    if(value_scr == value_src_open) {
                        $(this).attr("src", value_src_close);
                    } else {
                        $(this).attr("src", value_src_open);
                    }
                });
            }

前面雜七雜八的代碼可以忽略~主要是利用前面wangjifengHandler_key()方法取到兩個我們想要的值後,然後在wangjifengHandler()中post提交給介面執行修改操作,根據介面響應狀態,再進行頁面綁定。

刪除也和這一模一樣,利用wangjifengHandler_key()取到你所需的值,於wangjifengHandler()中post提交,執行之後制動重新載入頁面。

 

由於時間不多,文章寫得有些凌亂~諒解。主要是理解兩個通用方法,後面調用起來就很極其方便。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://m.blog.csdn.net/blog/business122/21722039 http://m.blog.csdn.net/blog/business122/21722151 C/C++編譯就是要將C/C++的代碼映射到相應的機器碼,以及討論其中的記憶體管理模式,包括記憶體的分 ...
  • 出現的問題 如下圖 原因 android 輸入框預設帶有上下內邊距 解決 將Textinput元素樣式的垂直內邊距設置為0 `paddingVertical: 0` ...
  • 參考:https://segmentfault.com/q/1010000007136263 法一:text-align-last:justify; html css 由於text-align-last的相容性問題:https://caniuse.com/#search=text-align-las ...
  • max-width:從字面意思可以看出,是規定元素本身最大寬度,元素本身寬度應小於等於最大寬度值。 min-width:從字面意思可以看出,是規定元素本身最小寬度,元素本身寬度應大於等於最小寬度值。 1、max-width 一般我們在佈局時,不想要元素的寬度限定死,並且想要它的實際寬度隨其本身內容自 ...
  • 最近做項目中遇到要把整個頁面保存為PDF文件,網上找了一下實現的方法都是 html2canvas.js+jsPdf.js 來實現。實現的過程是 先用html2canvas.js把html頁面轉成圖片,再用jsPdf.js把圖片導出為pdf。 於是做了個小案例來測試這個功能。 js寫法 1,寫完一測試 ...
  • 問題講述:用js 實現一個clone()克隆函數,該函數會把輸入進去的不同類型值Number,String,Undefined,Boolean,Function,Null,Object,Array,RegExp,克隆一份出來 一、解題代碼 直接貼代碼, 結果: 二、疑問 一開始看到這個問題的時候,就 ...
  • 地址:http://www.layui.com/laydate/ 有詳細的文檔說明,基本滿足各類需求, 不謝哦 ...
  • 迴圈語句: For for迴圈的格式 for迴圈的執行順序: ① ② 若判斷為 true 進④ 進③ 進②判斷 ……迴圈 若判斷為false 結束 while while迴圈的格式 若i<10 替換為true 則while的迴圈會一直執行。直到條件控制結束。 break結束所有迴圈 continue ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...