天天看點

頁面跳轉傳參:參數過長(cookie,url , AngularJs controller 傳參實作)

       在項目中遇到這樣一種情況,在home頁面選中資源并鍵入查詢關鍵字,然後跳轉到另一個頁面result展示查詢結果;這就需要将home頁面選中的資源資訊和關鍵字傳遞到result頁面,在result頁面加載是調用背景服務擷取查詢結果。

    這裡遇到一個難點:選中資源資訊包括分類id和資源id,當選中的資源比較多時(可能幾百個)這個資訊比較大。

 一:url傳參

        最開始我是直接在http url中将參數傳到result頁面的(由于要在原頁面完成跳轉,是以不能用windows.open(url , property)來實作);

        首先我将所有資源資訊,以一定的規律拼成一個字元串(url隻能攜帶字元串類型參數),然後在result頁面再做一次解碼操作。當選中資源比較少時,這種方法當然是很有效的。但是當資源量比較大時就不可行了,會出現url 超長錯誤,這是因為http  url長度是有限制的。

微軟官方有說明:
Firefox (Browser)
對于Firefox浏覽器URL的長度限制為65,536個字元,但當我測試時,最大隻能處理8182個字元,這是因為url的長度除了浏覽器限制外,還會受Web伺服器的限制,而我本機使用的是ubuntu apache伺服器,最大處理能力為8192個字元(相差10個字元,不知道是什麼原因),一旦超過這個長度,伺服器就傳回如下錯誤資訊。
Safari (Browser)
URL最大長度限制為 80,000個字元。
Opera (Browser)
URL最大長度限制為190,000個字元。
Google (chrome)
url長度一旦超過8182個字元時,出現如下伺服器錯誤:
寫道
Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.
Apache/2.2.12 (Ubuntu) Server at 127.0.1.1 Port 80
Apache (Server)
能接受最大url長度為8,192個字元,但我的測試資料是8,182,10個字元,差别不在,資料具體符合。
Microsoft Internet Information Server(IIS)
能接受最大url的長度為16,384個字元。

           

通過上面的資料可知,為了讓所有的使用者都能正常浏覽,我們的URL最好不要超過IE的最大長度限制(2038個字元)

二:cookie儲存參數

     由于url長度限制問題,我又開始尋找下一種實作方法。我嘗試用cookie。

     JavaScript是運作在用戶端的腳本,是以一般是不能夠設定Session的,因為Session是運作在伺服器端的。 而cookie是運作在用戶端的,是以可以用JS來設定cookie.兩個頁面需要用到同一個變量,這種情況也是比較适合用到cookie的。cookie也常用來存放系統使用者登入資訊。

    cookie的結構,簡單地說:cookie是以鍵值對的形式儲存的,即key=value的格式。各個cookie之間一般是以“;”分隔。

   1. js 對 cookie的操作有如下:

    JS設定cookie:

//将使用者id存入cookie
    document.cookie="userid="+data.result.id;
 
           

    JS讀取cookie:

function getCookie($name){
  var strCookie=document.cookie.split(";");
  var userid;
  for(var o in strCookie){
if(strCookie[o].indexOf($name)!=-1){
userid=strCookie[o].replace($name,"").replace("=","").trim();
}
  }
}
           

    删除cookies:

設定過期時間來使cookie過期以間接達到清除的目的或者将其内容設定為空

//删除cookie中指定變量函數    
function delCookie($name){    
var myDate=new Date();    
myDate.setTime(-1000);//設定時間    
document.cookie=$name+":''; expires="+myDate.toGMTString();                
}
           

通過cookie實作了傳參,但偶爾會出現參數資訊變少,或是cookie參數值修改後而沒有改變等問題。查詢才知:cookie存在了url同樣的問題,cookie也有大小限制。是以cookie隻适合比較‘小’的資料參數儲存。

2.各浏覽器對Cookie有一定的限制

頁面跳轉傳參:參數過長(cookie,url , AngularJs controller 傳參實作)

 總之,在進行頁面cookie操作的時候,應該盡量保證cookie個數小于20個,總大小 小于4KB

三:angularJs controller傳參

      我們項目頁面用的AngularJS架構,這是我就想通過controller來實作傳參應該是可行的,将home頁面選中的參數資訊傳到父controller然後result再去取父controller的參數值就可以了。

先簡單介紹下AngularJs中事件廣播:

$on(name,handler)注冊一個事件處理函數,該函數在特定的事件被目前作用域收到(從父級或者子級作用域)時将被調用。

$emit(name,args)向目前父作用域發送一個事件,直至根作用域。

$broadcast(name,args)向目前作用域下的子作用域發送一個事件。

name表示事件名稱

args表示事件傳播的資料

handler表示在接受到傳遞時要執行的回調,該回調中有event參數,表示事件

在home頁面

将改變值後的參數發送到父容器。

$scope.selected_infomations=concatIds;
      $scope.$emit("change", $scope.selected_infomations);
//頁面跳轉
 window.location.href="#/telantSearch_jq.html?searchKeywords=" target="_blank" rel="external nofollow" +$scope.searchKeywords+"&homonymFlag="+$scope.homonymFlag+"&synonymFlag="+$scope.synonymFlag;
           

在父controller中

接收子容器推過來的參數,并且将參數廣播到所有子容器

$scope.selected_infomations='';
  $scope.$on('change', function(event,data){
  $scope.selected_infomations=data;
     console.log(data);
});
           

在result頁面

if($scope.selected_infomations=='')
 $scope.selected_infomations=window.parent.name
 var concatIds=$scope.selected_infomations;
 
           

還存在一個問題(頁面重新整理參數保留),就是result頁面重新整理就會清空參數,這時可以先用window.parent.name儲存參數,重新整理後再取出即可,如result頁面代碼實作。