1. 程式人生 > >靜態頁之間傳值

靜態頁之間傳值

  一般做web開發,如果是前端向服務端傳值,那是非常簡單的事情。但如果需要在兩個純HTML靜態頁之間傳值,該怎麼做呢?做法至少有4種,本文分享其中的2種,這兩種都是簡單直接的方法,並且順帶再說下一下url編碼的小知識點。

  一、通過URL傳值

  這個方法的核心就是通過JavaScript向另外一個頁面跳轉,在跳轉的同時把要傳遞的引數拼接到URL裡;於此同時,在目標頁面中,通過JavaScript獲取URL中的引數字串,然後解析這個字串即可。為了演示這個方法,我們建立2個HTML靜態頁面,一個是send.html,一個是getParam.html。

  send.html頁面非常簡單,只有一個文字框和一個按鈕,要實現的效果是,當點選按鈕時,把使用者在文字框中輸入的使用者名稱和密碼傳遞到getParam.html頁面,在瀏覽器中執行頁面如下圖:

  

  該頁面結構和JavaScript如下:

<body>
    <input type="text" value="" id="username">
    <input type="text" value="" id="pwd">
    <input type="button" value="提交" id="btn">
    <script>
        var btn = document.getElementById('btn');
        btn.onclick = function
() {//註冊點選事件 var uName = document.getElementById('username').value;//獲取輸入的使用者名稱 var pwd = document.getElementById('pwd').value; uName = encodeURI(uName);//把使用者名稱字串進行URL編碼 var url = 'get.html?uname' + '=' + uName + '&pwd=' + pwd;//把要傳遞的引數拼接入URL字串中 window.location.href
= url;//跳轉 } </script> </body>

  程式碼邏輯非常簡單,註釋已經非常清楚了。這裡url的拼寫方法,跟前端向服務端get傳參的語法是一樣的,如果要傳遞多個引數,每個引數的key=value對之間用&符號隔開就可以了。

  再來看getParam.html頁面。這個頁面負責接收從send.html頁面傳遞過來的key為uname的引數,並且渲染到實現準備好的一個div中。

<body>
    <div id="box"></div>
    <script>
        // var url = window.location.href;//獲取完整的url
        var url = window.location.search;//只獲取引數部分,帶有?號
        var box = document.getElementById('box');
        var psObj = getParams(url);
        var str = '';
        for (var key in psObj) {
            str += key + ' : ' + psObj[key] + '<br/>';
        }
        box.innerHTML = str;

        function getParams(searchUrl){            
            var index = searchUrl.indexOf('?');
            if(index == -1){
                return;
            }
            searchUrl = searchUrl.substr(index + 1);
            var obj = new Object();
            var params = searchUrl.split('&');
            for(var i = 0; i < params.length; i++){
                var item = params[i].split('=');
                obj[item[0]] = decodeURI(item[1]);
            }
            return obj;
        }
    </script>
</body>

  程式碼中定義了一個getParams()函式,該函式的作用就是從url中切割出傳遞過來的引數,並且把這些引數封裝成一個js字面量物件返回過來。

  getParam.html頁面執行結果如下圖:

  

  二、使用H5新增的localStorage傳值

  localStorage就像一個微型的本地資料庫,用這個東西記錄下來一些資料,是永久儲存在客戶端的,不管是哪個頁面都能獲取到。程式碼就不貼出來了,這個很簡單,思路說出來就夠了。與之相似的,還可以用cookie,不過cookie就麻煩一點,而且儲存資料量相比localStorage很有限。

  三、URL編碼

  這裡不想說的過於複雜。簡單點說,URL是用來描述客戶端發出的HTTP請求資源的地址,以及在發出此次HTTP請求時附帶的引數。URL傳遞的引數是以:key1=value1&key2=value2。。。這種形式來傳遞的,這些引數在傳遞時,會被瀏覽器通過ASCII字符集進行編碼,編碼的結果就是變成二進位制流。然後才會傳遞到服務端,服務端再反編譯回來,才能看到原始的字串。

  問題就出在編碼身上,ASCII字符集是一個很小的字符集,它不支援漢字。所以如果你要傳遞的引數中有超出ASCII字符集的字元,就必須先通過URL編碼,然後再來使用。比如我們要傳遞的使用者名稱,如果出現漢字,我們就應該先使用URL編碼轉換下,然後再傳輸這個引數。

  同樣道理,雖然是靜態頁面傳值,瀏覽器也會對URL裡的引數進行編碼,同樣以ASCII字符集進行編碼。所以也同樣面臨一個URL編碼的問題。

  接下來就是URL編碼如何實現的問題了。

  在JavaScript中,提供了3種編碼和解碼的方式。分別是

序號 編碼 解碼
1 escape(str) unescape(str)
2

encodeURI(str)

decodeURI(str)
3

encodeURIComponent(str)

decodeURIComponent (str)

 

 

 

 

  

  

  

 

  需要說明的是:

  1. 必須搭配使用,比如編碼時使用了escape(),那麼解碼時必須使用unescape(),否則就會解碼失敗。
  2. 第1組的api是js提供的最早的URL編碼方式,已經不推薦使用。推薦的是後2種方式
  3. 本案例使用的是第2組方式