在項目中遇到這樣一種情況,在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操作的時候,應該盡量保證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頁面代碼實作。