前后台徹底分離的核心文件bridge.js.


具體代碼可以在我的git上下載:https://github.com/guoyansi/bridge

這里的后台使用java寫的,如果不了解java的童鞋可以忽略下面這樣圖片.

 

bridge.js

/*
 *bridge橋梁的意思,bridge.js主要是為了架起前后端開發的橋梁.
 *bridge.js類庫旨在解決以下問題,這也是bridge.js目的及意義所在.
 * 1.靜態頁面的發送post請求,會出現500錯誤,一個項目不可能全是get請求.
 * 2.前后台徹底分離后,靜態資源的訪問有兩種
 *         2.1相對路徑:需要用../來尋找目標資源,開發難度大
 *         2.2絕對路徑.每次需要手動添加根目錄名稱,根目錄只要有變化修改的難度就會很大.
 * 3.對於一些后台項目,會有超時管理.對於頁面的零散的ajax請求怎么做到統一管理.
 *     對超時時返回的數據及時作出響應,比跳轉到登錄頁
 * 4.前后台並行開發,提高工作效率,和產品質量.
 * 5.前端開發不不依附於后端的開發工具,比如MyEclipse,Visual Studio.前端也有很多優秀的開發工具
 * 6.分工協作,前后端分離是必然的趨勢,我們不能停留在幾十年前的開發模式里,一人獨攬全棧,
 *       環境變化這么快,不進步,就是退步.
 * 7.前端各種技術日益成熟,比如代碼壓縮,模塊化開發.前后台不分離,再好的技術對我們來說只是名詞.
 * 8.徹底分離時,會造成前端請求時出現跨域的尷尬境地,前端人員對於服務器環境的生疏,寸步難行.
 * 9.每個ajax請求都有可能出錯,同樣的報錯代碼,總不能在每個ajax代碼里都寫一遍或重新調用一遍
 * =========================================================================
 * bridge.js是在jQuery的基礎上做的二次封裝.
 * 1.ajax封裝介紹(和jQuery的調用一樣):
 *     1.0.所有的請求被分為三種,因為請求方式不一樣,路徑格式也不一樣.
 *         跨域+遠程==>徹底分離時,發出的請求.
 *         只遠程==>項目整合的時候,沒有了跨域問題.
 *         只本地==>請求前端的本地資源
 *     1.1.一切post的請求都會被轉換成遠程請求.
 *     1.2.get請求即可以訪問本地資源,也可以發送遠程請求
 *     1.3.bridge.js不支持ajax的鏈式寫法,因為ajax返回的是promise對象,
 *         .done(),.fail()無法被被重寫封裝.(可惜!可惜!)
 *  1.4.若有參數cross:true,就發送遠程(+跨域)請求,未定義參數cross或cross:false發送本地請求
 *     1.4.
 *         1.4.1.既可以遠程也可以本地請求的方法.
 *             bg.ajax(opt)
 *             bg.load(url,param,callback).
 *             bg.get(url,param,callback,type).
 *             bg.getJSON(url,param,callback).
 *         
 *         1.4.2.因為無法添加參數cross:true,只能請求本地資源的方法
 *             bg.getScript(url,callback).
 *         
 *         1.4.3.本地無法發送post請求,只能發送遠程請求的方法
 *             bg.post().
 *  1.5.bg.getHttpUrl(cross,url) 返回請求路徑
 * bg.inti配置介紹:
 *         root:"",//根目錄,前后端的項目名稱(根目錄)最好相同,整合的時候比較容易
 *        view:"",//視圖.前端的所有編碼都放在一個目錄下,這個目錄就是視圖
 *        cross:true,//跨域.開發時這里是true.整合后,改為false.有跨域+遠程==>遠程
 *      hostName:"http://172.20.12.243:8080",//主機.跨域時的主機名稱
 *        checkSession:false,//是否檢測session失效的問題,有些網站不需要檢測,但是大部分登錄系統都要判斷session
 *        noSession:function(data){//sessiong失效時執行的函數
 *        console.log("session失效,跳轉頁面");
 *        }
 *        
 *    后端配置:新建一個過濾器,
 *    設置:
 *    response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8020");
 *    或:
 *    response.setHeader("Access-Control-Allow-Origin", "*");
 *  前后端整合完畢后,屏蔽這個設置,就不存在跨域以及跨域帶來的安全問題了.
 * 
 */
//////////////////////////////////////////////////////////////////




//////////////////////////////////////////////////////////////
(function($,undefined) {
    if($==null){
        throw new Error("bridge出錯了:沒有找到jQuery或Zepto庫.");
    }
    
    
    /**
     * Bridge的實例對象,
     */
    var objBridge=null;
    /**
     * 根函數
     */
    function Bridge() {
        objBridge=this;
        this.hostName="";
        this.root="";
        this.view="";
        this.cross=false;
       /* this.ajaxBefore=function(){};
        this.ajaxEnd()=function(){};
        this.ajaxFail=function(){};*/
    }

/**
 *session處理模塊 
 */
    Bridge.prototype.session={
        checkSession:false,//是否檢測session
        noSession:function(data){//session失效如何處理,data為服務端返回的數據
            
        },
    };
    /*Bridge.prototype.ajaxFail=function(XMLHttpRequest, textStatus, errorThrown){
        alert("服務器請求失敗!");
    }*/
    /**
     * 初始化Bridge的各個參數
     * @param opt
     */
    Bridge.prototype.init=function(opt){
        var k,value;
        for(var key in opt){
             k=key.toLowerCase();//將鍵值轉換成小寫,防止誤傳參數,導致程序無法運行
             value=opt[key];
            if(k==="nosession"){
                objBridge.session.noSession=value;
            }
            if(k==="checksession"){
                objBridge.session.checkSession=value;
            }
           /* if(k==="ajaxfail"){
                objBridge.ajaxFail=value;
            }*/
            if(k==="cross"){
                objBridge.cross=value;
            }
            if(k==="hostname"){
                objBridge.hostName=value;
            }
            if(k==="view"){
                objBridge.view=value;
            }
            if(k==="root"){
                objBridge.root=value;
            }
            /*if(k=="ajaxbefore"){
                objBridge.ajaxBefore=value;
            }
            if(k=="ajaxend"){
                objBridge.ajaxEnd=value;
            }*/
        }
    };
    function sessionFilter(data,xhr,jqXHR){
        var type=typeof data;
        var d=data;
        if(type=="object"){
            
        }else if(type==="string"){
            d=eval("("+d+")");
        }else{
            throw new Error("返回值的參數類型判斷異常");
        }
        if(d.sessionStatus===-1){
            objBridge.session.noSession(d);
        }else{
            return data;
        }
    }
    /**
     * 三種請求,
     * 1.遠程+跨域,==>bg.init.cross:true,ajaxOpt.cross:true
     * 2.遠程不跨域,==>bg.init.cross:false,ajaxOpt.cross:true
     * 3.不跨域,不遠程(本地)==>bg.init.cross不起作用,ajaxopt.cross:false或未定義
     * 
     */
    function getAjaxHttpType(optCross){
        if(typeof optCross==="undefined"||optCross==false){
            return 3;
        }
        else if(optCross==true){//設置了局部跨域參數
            if(objBridge.cross){//遠程+跨域
                return 1;
            }else{//遠程不跨域
                return 2;
            }
        }
    }
    /**
     * 根據不同的請求,生成不同的路徑
     * @param type 請求路徑
     * @param url  當前路徑
     */
    function getAjaxUrl(type,url){
        var u="";
        if(type===1){//遠程+跨域
            u=objBridge.hostName+"/"+objBridge.root+"/";
        }else if(type===2){//遠程不跨域
            u="/"+objBridge.root+"/";
        }else if(type===3){//不跨域,不遠程(本地)
            if(objBridge.view){
                u="/"+objBridge.root+"/"+objBridge.view+"/";
            }else{
                u="/"+objBridge.root+"/";
            }
        }
        return u+url;
    }
    /**
     * 獲取請求路徑
     * @param  cross
     * @param  url
     */
    Bridge.prototype.getHttpUrl=function(cross,url){
        return getAjaxUrl(getAjaxHttpType(cross),url);
    }
    
    
    
    /**
     * 若要發送遠程跨域請求,
     * 需要添加參數data.cross=true;
     * 否則被視為本地請求
     * obj 請求對象
     * url    請求路徑
     * data    請求參數
     * callback 回調函數 可不填
     */
    Bridge.prototype.load=function(obj,url,params,callback){
        if(!(obj instanceof $)){//如果obj不是jquery對象
            throw new Error("load的第一個參數obj不是jQuery對象.");
        }
        var type,httpType,url;
        type=typeof params;
        if (type==="function") {
            callback = params;
            params = undefined;
        }
        if(type==="object"){
            params.cross=true;
            httpType=getAjaxHttpType(params.cross);
            url=getAjaxUrl(httpType,url);
        }else if(type==="undefined"){//alert(1)
            url=getAjaxUrl(3,url);
        }
         obj.load(url,params,callback);
    };
    /**
     * post請求只能請求遠程數據,
     * 本地請求會報500錯誤.
     */
    Bridge.prototype.post=function(url,params,callback,type){
        var t=typeof params;
        var httpType;
        if (t==="function") {
            type = type || callback;
            callback = params;
            params = undefined;
            t=typeof params;
        }
        url=getAjaxUrl(getAjaxHttpType(true),url);
        $.post(url,params,callback,type);
    }
    /*
     * 若要發送遠程跨域請求,
     * 需要添加參數data.cross=true;
     * 否則被視為本地請求
     */
    Bridge.prototype.get=function(url,data,callback,type){
        var httpType,url;
        var t=typeof data;
        if (t==="function") {
            type = type || callback;
            callback = data;
            data = undefined;
            t=typeof data;
        }        
        if(t==="object"){
            httpType=getAjaxHttpType(data.cross);            
        }else if(t==="undefined"){
            httpType=3;
        }else {
            throw new Error("get請求的參數判斷異常");
        }
        url=getAjaxUrl(httpType,url);
        $.get(url,data,callback,type);
    }
    /*
     * 若要發送遠程跨域請求,
     * 需要添加參數data.cross=true;
     * 否則被視為本地請求
     */
    Bridge.prototype.getJSON=function(url, data, callback){
        objBridge.get(url,data,callback,"json");
    }
    /*
     * 因為無法添加參數,所以只能發送本地請求
     */
    Bridge.prototype.getScript=function(url,callback){
        objBridge.get(url,undefined,callback,"script");
    }
    /**
     * 1.跨域請求一定要添加參數cross:true,
     * 2.本地請求可不寫cross或cross:false
     * opt,正常的$.ajax()參數但是跨域的話多一個cross:true
     */
    Bridge.prototype.ajax=function(opt){
        var success;
        if(typeof opt==="string"){//講參數轉換成對象型參數
            opt={
                type:"get",
                url:opt
            }
        }
        //session過濾
        if(objBridge.session.checkSession){
            if(typeof opt.success=="undefined"){
                opt.success=sessionFilter;
            }
            else{
                success=opt.success;
                opt.success=function(data,xhr,jqXHR){
                    if(sessionFilter(data,xhr,jqXHR)!=undefined){
                        success(data,xhr,jqXHR);
                    }
                }
            }
        }
        opt.url=getAjaxUrl(getAjaxHttpType(opt.cross),opt.url);
        $.ajax(opt);
    };
      
    /**
     * 替換所有指定的字符
     * str 字符串
     * origin 需要替換的字符
     * target 替換成這個字符
     */
    Bridge.prototype.replaceAll=function(str,origin,target){
        if(str.indexOf(origin)<0){
            return str;
        }else{
            return arguments.callee(str.replace(origin,target),origin,target);
        }
    }
    
    
    
    /**
     * 格式化時間
     * dateTime 時間(戳)
     * 返回 yyyy-mm-dd
     * 
     * 待完善
     * 1.去除時分秒
     * 
     * 
     * 
     * 
     */
    Bridge.prototype.formateDate=function(dateTime,splitf){
        
        /**
         * 2015-01-05蘋果瀏覽器不支持,改成2015/01/05,
         * dateTime+""是為了防止時間戳沒有indexOf方法,報錯.
         */
        dateTime=objBridge.replaceAll(dateTime+"","-","/");
        dateTime=new Date(dateTime);
        var currYear =dateTime.getFullYear();
        var currM=dateTime.getMonth()+1;
        var currD=dateTime.getDate();
        if(currM<10){
            currM="0"+currM;
        }
        if(currD<10){
            currD="0"+currD;
        }
        if(!splitf||splitf==1){
            return currYear+"-"+currM+"-"+currD;
        }else if(splitf==2){
            return currYear+"年"+currM+"月"+currD+"日";
        }else if(splitf==3){
            return currYear+"/"+currM+"/"+currD;
        }
    }
    /**
     * 獲取時間中的各個元素
     * dataTime  時間
     * element 元素
     * bg.getDateElement("2016-01-01","week");
     * 
     */
    
    Bridge.prototype.getDateElement=function(dateTime,element){
        var currM,currD,week;
        dateTime=new Date(dateTime);
        if(element=="yyyy"){
            return dateTime.getFullYear();
        }else if(element=="M"){
            return getM();
        }else if(element=="MM"){
            currM=getM();
            return currM<10?("0"+currM):currM;
        }else if(element=="d"){
            return getD();
        }else if(element=="dd"){
            currD=getD();
            return currD<10?("0"+currD):currD;
        }else if(element=="week"){
            return dateTime.getDay();
        }
        function getD(){
            return dateTime.getDate();
        }
        function getM(){
            return dateTime.getMonth()+1;
        }
    }
    /**
     * 查詢數組中是否存在指定元素
     * arr 數組
     * element 指定元素
     */
  Bridge.prototype.inArray=function(arr,element){
      try{
          if(!(arr instanceof Array)){
              throw new Error("請傳入數組");
          }
          for(var i in arr){
              if(arr[i]===element){
                  return true;
              }
          }
          return false;
          
      }catch(e){
          alert("inArray:>>"+e.message);
          console.error("inArray:>>"+e.message);
      }
      
  }
    
/**
* 當填寫參數h后,解析你給的參數,如果為空自動從獲取瀏覽器的地址
* 測試路徑:>>>http://127.0.0.1:8020/url/index.html?id=1.2&gys=7777777777777777777777777&name=思思博士#api/126
* name是需要獲取的值,
* h是指定href還是要自動獲取.
* 
* 
* bg.urlResolve("param")  獲取所有參數
* bg.urlResolve("param:name")  獲取參數name
*/
    Bridge.prototype.urlResolve=function(name,h){
        if(!name){
            console.error("urlResolve缺乏name參數");
            return "";
        }        
        var href=h?h:window.location.href;
        var condition;//條件
        if(name.indexOf(":")>-1){
            condition=name.split(":");
            name=condition[0];
            condition=condition[1];
        }
        
        var search=function(){
            if(h){
                return "?"+href.split("?")[1];
            }else{
                return window.location.search;
            }
        }
        var searchNoP=function(){//不帶問號的條件
            return search().substr(1);
        }
        var getPageNameAndExtName=function(){//獲取頁面名稱和擴展名稱
            var arr=href.split("?")[0].split("/");
            var len=arr.length;
            return arr[len-1];
        };
           /**
             * 填寫了key獲取指定的參數
             * 沒填寫key參數獲取所有的參數,以json格式返回
             */
         var getParam=function(key){//獲取參數                    
            var query=searchNoP();
            if(!query){
                return null;                            
            }
            var params={};
            var paramArr=query.split("&");
            var len=paramArr.length;
            var params={};
            var itemParam=[];
            for(var i=0;i<len;i++){
                itemParam=paramArr[i].split("=");
                params[itemParam[0]]=itemParam[1];
            }
            if(key){
                return params[key]?params[key]:"";
            }else{
                return params;
            }                    
        }
         
        if(name==="href"){//獲取路徑
            return href;
        }else if(name==="search"){// 查詢(參數)部分  帶問號的
            return search();
        }else if(name==="searchNo?"){//不帶問號的
            return searchNoP();
        }else if(name==="pathname"){//頁面路徑 url/index.html
            if(h){
                alert("帶完善!");                
            }else{
                return window.location.pathname;
            }
        }else if(name==="port"){//URL 的端口部分     8080
            return window.location.port;
        }else if(name==="protocol"){//URL 的協議部分返回值 http:
            return window.location.protocol
        }else if(name==="host"){//url主機部分返回值   127.0.0.1:8020
            return window.location.host;
        }else if(name==="hash"){//錨點后面的值  #api/126
            return window.location.hash;
        }else if(name==="hashNo#"){//不帶#號的錨點的值  api/126
            return window.location.hash.substr("1");
        }else if(name==="pageName"){//獲取頁面名稱
            return getPageNameAndExtName().split(".")[0];
        }else if(name==="extName"){//獲取擴展名
            return getPageNameAndExtName().split(".")[1];
        }else if(name==="param"){//獲取參數
            return getParam(condition?condition:"");
        }else{
            console.error("urlResolve未匹配到你要獲取的參數");
            return "";
        }               
    };  
    
    
    
    
    
    
    
    
    window.bg=new Bridge();
})((typeof jQuery!=="undefined")?jQuery:(typeof Zepto!=="undefined"?Zepto:null));


/*bg.init({
    root:"b",//項目名稱
    view:"",//視圖
    cross:true,//跨域
    hostName:"http://192.168.1.206:8080",//主機
    checkSession:false,
    noSession:function(data){
        console.log("session失效,跳轉頁面");
    }
});*/


/*****************************************************************************
 * 調用
 * <button onclick="app()">測試hb</button>
 ******************************************************************************
 */

/*function app(){
    console.log(bg.getHttpUrl(true,"abc"));
    return;
    bg.ajax({
        type:"get",
        url:"1.txt",
        //url:"1.json",
        //cross:true,
        //cross:false,
        data:{sessionFlag:"yes"},
        dataType:"text",
        success:function(data,textStatus,jqXHR){    
            console.log(data);
            //alert(data.name);
            $("#content").html(data);
        }
    });
    //$("#content").load("1.json",function(){});
    //bg.load($("#content"),"CROS",{});
    //bg.load($("#content"),"Jsonp2",{cross:true});
    //bg.get("1.json",{},function(data){
        console.log(data);
    //},"json");
    //bg.get("Jsonp2",{session:"no",cross:true},function(data){
      //  console.log(data);
    //},"json");
}*/
View Code

 

 =====================2016年-02-03更新=============================================

bridge.js2.0

1.支持多終端跨域

2.去除了session過濾,交由jquery的ajax全局設置

/*
 *bridge橋梁的意思,bridge.js主要是為了架起前后端開發的橋梁.
 *bridge.js類庫旨在解決以下問題,這也是bridge.js目的及意義所在.
 * 1.靜態頁面的發送post請求,會出現500錯誤,一個項目不可能全是get請求.
 * 2.前后台徹底分離后,靜態資源的訪問有兩種
 *         2.1相對路徑:需要用../來尋找目標資源,開發難度大
 *         2.2絕對路徑.每次需要手動添加根目錄名稱,根目錄只要有變化修改的難度就會很大.
 * 3.對於一些后台項目,會有超時管理.對於頁面的零散的ajax請求怎么做到統一管理.
 *     對超時時返回的數據及時作出響應,比跳轉到登錄頁
 * 4.前后台並行開發,提高工作效率,和產品質量.
 * 5.前端開發不不依附於后端的開發工具,比如MyEclipse,Visual Studio.前端也有很多優秀的開發工具
 * 6.分工協作,前后端分離是必然的趨勢,我們不能停留在幾十年前的開發模式里,一人獨攬全棧,
 *       環境變化這么快,不進步,就是退步.
 * 7.前端各種技術日益成熟,比如代碼壓縮,模塊化開發.前后台不分離,再好的技術對我們來說只是名詞.
 * 8.徹底分離時,會造成前端請求時出現跨域的尷尬境地,前端人員對於服務器環境的生疏,寸步難行.
 * 9.每個ajax請求都有可能出錯,同樣的報錯代碼,總不能在每個ajax代碼里都寫一遍或重新調用一遍
 * =========================================================================
 * bridge.js是在jQuery的基礎上做的二次封裝.
 * 1.ajax封裝介紹(和jQuery的調用一樣):
 *     1.0.所有的請求被分為三種,因為請求方式不一樣,路徑格式也不一樣.
 *         跨域+遠程==>徹底分離時,發出的請求.
 *         只遠程==>項目整合的時候,沒有了跨域問題.
 *         只本地==>請求前端的本地資源
 *     1.1.一切post的請求都會被轉換成遠程請求.
 *     1.2.get請求即可以訪問本地資源,也可以發送遠程請求
 *     1.3.bridge.js不支持ajax的鏈式寫法,因為ajax返回的是promise對象,
 *         .done(),.fail()無法被被重寫封裝.(可惜!可惜!)
 *  1.4.若有參數cross:true,就發送遠程(+跨域)請求,未定義參數cross或cross:false發送本地請求
 *     1.4.
 *         1.4.1.既可以遠程也可以本地請求的方法.
 *             bg.ajax(opt)
 *             bg.load(url,param,callback).
 *             bg.get(url,param,callback,type).
 *             bg.getJSON(url,param,callback).
 *         
 *         1.4.2.因為無法添加參數cross:true,只能請求本地資源的方法
 *             bg.getScript(url,callback).
 *         
 *         1.4.3.本地無法發送post請求,只能發送遠程請求的方法
 *             bg.post().
 *  1.5.bg.getHttpUrl(cross,url) 返回請求路徑,打印ajax請求的路勁
 * bg.inti配置介紹:
 *         root:"",//根目錄,前后端的項目名稱(根目錄)最好相同,整合的時候比較容易
 *        view:"",//視圖.前端的所有編碼都放在一個目錄下,這個目錄就是視圖
 *        cross:true,//跨域.開發時這里是true.整合后,改為false.有跨域+遠程==>遠程
 *      hostName:"http://172.20.12.243:8080",//主機.跨域時的主機名稱
 *        checkSession:false,//是否檢測session失效的問題,有些網站不需要檢測,但是大部分登錄系統都要判斷session
 *        noSession:function(data){//sessiong失效時執行的函數
 *        console.log("session失效,跳轉頁面");
 *        }
 *        
 *    后端配置:新建一個過濾器,
 *    設置:
 *    response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8020");
 *    或:
 *    response.setHeader("Access-Control-Allow-Origin", "*");
 *  前后端整合完畢后,屏蔽這個設置,就不存在跨域以及跨域帶來的安全問題了.
 * 
 */
//////////////////////////////////////////////////////////////////




//////////////////////////////////////////////////////////////
(function($,undefined) {
    if($==null){
        throw new Error("bridge出錯了:沒有找到jQuery或Zepto庫.");
    }
    
    
    /**
     * Bridge的實例對象,
     */
    var objBridge=null;
    var config={
        servers:{}
    }
    /**
     * 根函數
     */
    function Bridge() {
        objBridge=this;
        this.getConfig=function(){
            return config;
        }
    }

/**
 *session處理模塊 
 */
    /*Bridge.prototype.session={
        checkSession:false,//是否檢測session
        noSession:function(data){//session失效如何處理,data為服務端返回的數據
            
        },
    };*/
    /**
     * 初始化Bridge的各個參數
     * @param opt
     */
    Bridge.prototype.init=function(opt){
       $.extend(config, opt);
       var hostName=window.location.protocol+"//"+window.location.host;
       config.servers["local"]={hostName:hostName,cross:false,root:config.root};
    };
    
    
    /**
     * 對於傳遞過來的server參數進行統一格式
     * @param server 可能是字符串也可能是對象
     */
    function resolveParamServer(server){
        var type=typeof server;
        if(type=="object"){
            
        }else if(type=="string"&&server){
            server=config.servers[server];
        }else{
            server=config.servers["local"];
        }
        return server;
    }
    
    
    
    /**
     * 三種請求,
     * 1.遠程+跨域,==>bg.init.cross:true,ajaxOpt.cross:true
     * 2.遠程不跨域,==>bg.init.cross:false,ajaxOpt.cross:true
     * 3.不跨域,不遠程(本地)==>bg.init.cross不起作用,ajaxopt.cross:false或未定義
     * 
     */
    function getAjaxHttpType(server,clientCross){
        server=resolveParamServer(server);
        var serverCross=server.cross;
        if(typeof clientCross=="undefined"||clientCross==false){//本地請求
            return 3;
        }
        else if(clientCross==true){//設置了局部跨域參數
            if(serverCross==true){//遠程+跨域
                return 1;
            }else{//遠程不跨域
                return 2;
            }
        }
    }
    /**
     * 根據不同的請求,生成不同的路徑
     * @param type 請求路徑
     * @param url  當前路徑
     */
    function getAjaxUrl(type,url,server){
        server=resolveParamServer(server);
        var u="";
        if(type===1){//遠程+跨域
            u=server.hostName+"/"+server.root+"/";
        }else if(type===2){//遠程不跨域
            u="/"+server.root+"/";
        }else if(type===3){//不跨域,不遠程(本地)
            if(config.view){
                u="/"+config.root+"/"+config.view+"/";
            }else{
                u="/"+config.root+"/";
            }
        }
        return u+url;
    }
    /**
     * 獲取請求路徑  測試請求的路勁
     * @param  server {hostName:"http:127.0.0.1:8080",cross:true,root:"itemName"}
     * @param  param {url:}    usr/getData
     * @return http:127.0.0.1:8080/itemName/usr/getData
     */
    Bridge.prototype.getHttpUrl=function(server,url,cross){
        var type=getAjaxHttpType(server,cross);
        return getAjaxUrl(type,url,server);
    }
    /**
     * 若要發送遠程跨域請求,
     * 需要添加參數data.cross=true;
     * 否則被視為本地請求
     * obj 請求對象
     * url    請求路徑
     * data    請求參數
     * callback 回調函數 可不填
     */
    Bridge.prototype.load=function(obj,url,params,callback){
        if(!(obj instanceof $)){//如果obj不是jquery對象
            throw new Error("load的第一個參數obj不是jQuery對象.");
        }
        var type,httpType,url;
        type=typeof params;
        if (type==="function") {
            callback = params;
            params = undefined;
        }
        if(type==="object"){
            params.cross=true;
            httpType=getAjaxHttpType(params.server,true);
            url=getAjaxUrl(httpType,url,params.server);
        }else if(type==="undefined"){//alert(1)
            url=getAjaxUrl(3,url,params.server);
        }
         obj.load(url,params,callback);
    };
    /**
     * post請求只能請求遠程數據,
     * 本地請求會報500錯誤.
     */
    Bridge.prototype.post=function(url,params,callback,type){
        var t=typeof params;
        var httpType;
        if (t==="function") {
            type = type || callback;
            callback = params;
            params = {};
           //t=typeof params;
        }
        params.cross=true;
        url=getAjaxUrl(getAjaxHttpType(params.server,true),url,params.server);
        $.post(url,params,callback,type);
    }
    /*
     * 若要發送遠程跨域請求,
     * 需要添加參數data.cross=true;
     * 否則被視為本地請求
     */
    Bridge.prototype.get=function(url,data,callback,type){
        var httpType,url;
        var t=typeof data;
        var server="";
        if (t==="function") {
            type = type || callback;
            callback = data;
            data = undefined;
            t=typeof data;
        }        
        if(t==="object"){
            httpType=getAjaxHttpType(data.server,data.cross);
            server=data.server;
        }else if(t==="undefined"){
            httpType=3;
        }else {
            throw new Error("get請求的參數判斷異常");
        }
        url=getAjaxUrl(httpType,url,server);
        $.get(url,data,callback,type);
    }
    /*
     * 若要發送遠程跨域請求,
     * 需要添加參數data.cross=true;
     * 否則被視為本地請求
     */
    Bridge.prototype.getJSON=function(url, data, callback){
        objBridge.get(url,data,callback,"json");
    }
    /*
     * 因為無法添加參數,所以只能發送本地請求
     */
    Bridge.prototype.getScript=function(url,callback){
        objBridge.get(url,undefined,callback,"script");
    }
    /**
     * 1.跨域請求一定要添加參數cross:true,
     * 2.本地請求可不寫cross或cross:false
     * opt,正常的$.ajax()參數但是跨域的話多一個cross:true
     */
    Bridge.prototype.ajax=function(opt){
        var success;
        if(typeof opt==="string"){//將參數轉換成對象型參數
            opt={
                type:"get",
                url:opt
            }
        }
        opt.url=getAjaxUrl(getAjaxHttpType(opt.server,opt.cross),opt.url,opt.server);
        $.ajax(opt);
    };
      
    /**
     * 替換所有指定的字符
     * str 字符串
     * origin 需要替換的字符
     * target 替換成這個字符
     */
    Bridge.prototype.replaceAll=function(str,origin,target){
        if(str.indexOf(origin)<0){
            return str;
        }else{
            return arguments.callee(str.replace(origin,target),origin,target);
        }
    }
    
    
    
    /**
     * 格式化時間
     * dateTime 時間(戳)
     * 返回 yyyy-mm-dd
     * 
     * 待完善
     * 1.去除時分秒
     * 
     * 
     * 
     * 
     */
    Bridge.prototype.formateDate=function(dateTime,splitf){
        
        /**
         * 2015-01-05蘋果瀏覽器不支持,改成2015/01/05,
         * dateTime+""是為了防止時間戳沒有indexOf方法,報錯.
         */
        dateTime=objBridge.replaceAll(dateTime+"","-","/");
        dateTime=new Date(dateTime);
        var currYear =dateTime.getFullYear();
        var currM=dateTime.getMonth()+1;
        var currD=dateTime.getDate();
        if(currM<10){
            currM="0"+currM;
        }
        if(currD<10){
            currD="0"+currD;
        }
        if(!splitf||splitf==1){
            return currYear+"-"+currM+"-"+currD;
        }else if(splitf==2){
            return currYear+"年"+currM+"月"+currD+"日";
        }else if(splitf==3){
            return currYear+"/"+currM+"/"+currD;
        }
    }
    /**
     * 獲取時間中的各個元素
     * dataTime  時間
     * element 元素
     * bg.getDateElement("2016-01-01","week");
     * 
     */
    
    Bridge.prototype.getDateElement=function(dateTime,element){
        var currM,currD,week;
        dateTime=new Date(dateTime);
        if(element=="yyyy"){
            return dateTime.getFullYear();
        }else if(element=="M"){
            return getM();
        }else if(element=="MM"){
            currM=getM();
            return currM<10?("0"+currM):currM;
        }else if(element=="d"){
            return getD();
        }else if(element=="dd"){
            currD=getD();
            return currD<10?("0"+currD):currD;
        }else if(element=="week"){
            return dateTime.getDay();
        }
        function getD(){
            return dateTime.getDate();
        }
        function getM(){
            return dateTime.getMonth()+1;
        }
    }
    /**
     * 查詢數組中是否存在指定元素
     * arr 數組
     * element 指定元素
     */
  Bridge.prototype.inArray=function(arr,element){
      try{
          if(!(arr instanceof Array)){
              throw new Error("請傳入數組");
          }
          for(var i in arr){
              if(arr[i]===element){
                  return true;
              }
          }
          return false;
          
      }catch(e){
          alert("inArray:>>"+e.message);
          console.error("inArray:>>"+e.message);
      }
      
  }
    
/**
* 當填寫參數h后,解析你給的參數,如果為空自動從獲取瀏覽器的地址
* 測試路徑:>>>http://127.0.0.1:8020/url/index.html?id=1.2&gys=7777777777777777777777777&name=思思博士#api/126
* name是需要獲取的值,
* h是指定href還是要自動獲取.
* 
* 
* bg.urlResolve("param")  獲取所有參數
* bg.urlResolve("param:name")  獲取參數name
*/
    Bridge.prototype.urlResolve=function(name,h){
        if(!name){
            console.error("urlResolve缺乏name參數");
            return "";
        }        
        var href=h?h:window.location.href;
        var condition;//條件
        if(name.indexOf(":")>-1){
            condition=name.split(":");
            name=condition[0];
            condition=condition[1];
        }
        
        var search=function(){
            if(h){
                return "?"+href.split("?")[1];
            }else{
                return window.location.search;
            }
        }
        var searchNoP=function(){//不帶問號的條件
            return search().substr(1);
        }
        var getPageNameAndExtName=function(){//獲取頁面名稱和擴展名稱
            var arr=href.split("?")[0].split("/");
            var len=arr.length;
            return arr[len-1];
        };
           /**
             * 填寫了key獲取指定的參數
             * 沒填寫key參數獲取所有的參數,以json格式返回
             */
         var getParam=function(key){//獲取參數                    
            var query=searchNoP();
            if(!query){
                return null;                            
            }
            var params={};
            var paramArr=query.split("&");
            var len=paramArr.length;
            var params={};
            var itemParam=[];
            for(var i=0;i<len;i++){
                itemParam=paramArr[i].split("=");
                params[itemParam[0]]=itemParam[1];
            }
            if(key){
                return params[key]?params[key]:"";
            }else{
                return params;
            }                    
        }
         
        if(name==="href"){//獲取路徑
            return href;
        }else if(name==="search"){// 查詢(參數)部分  帶問號的
            return search();
        }else if(name==="searchNo?"){//不帶問號的
            return searchNoP();
        }else if(name==="pathname"){//頁面路徑 url/index.html
            if(h){
                alert("帶完善!");                
            }else{
                return window.location.pathname;
            }
        }else if(name==="port"){//URL 的端口部分     8080
            return window.location.port;
        }else if(name==="protocol"){//URL 的協議部分返回值 http:
            return window.location.protocol;
        }else if(name==="host"){//url主機部分返回值   127.0.0.1:8020
            return window.location.host;
        }else if(name==="hash"){//錨點后面的值  #api/126
            return window.location.hash;
        }else if(name==="hashNo#"){//不帶#號的錨點的值  api/126
            return window.location.hash.substr("1");
        }else if(name==="pageName"){//獲取頁面名稱
            return getPageNameAndExtName().split(".")[0];
        }else if(name==="extName"){//獲取擴展名
            return getPageNameAndExtName().split(".")[1];
        }else if(name==="param"){//獲取參數
            return getParam(condition?condition:"");
        }else{
            console.error("urlResolve未匹配到你要獲取的參數");
            return "";
        }               
    };  
    window.bg=new Bridge();
})((typeof jQuery!=="undefined")?jQuery:(typeof Zepto!=="undefined"?Zepto:null));


/*bg.init({
    root:"b",//項目名稱
    view:"",//視圖
    cross:true,//跨域
    hostName:"http://192.168.1.206:8080",//主機
    checkSession:false,
    noSession:function(data){
        console.log("session失效,跳轉頁面");
    }
});*/


/*****************************************************************************
 * 調用
 * <button onclick="app()">測試hb</button>
 ******************************************************************************
 */

/*bg.init({
                root:"bridge",
                view:"",
                servers:{
                    "s1":{hostName:"http://192.168.6.130:8080",root:"bridge",cross:true},
                    "s2":{hostName:"http://192.168.6.130:8080",root:"bridge2",cross:true}
                }
            });
            
            function app(){
                //打印配置信息
                console.log(bg.getConfig());
                bg.ajax({
                    type:"get",
                    url:"Jsonp2",
                    dataType:"text",
                    server:"s1",
                    cross:true,
                    success:function(data){
                        console.log(data);
                    }
                });
                bg.ajax({
                    type:"get",
                    url:"jsonp",
                    dataType:"text",
                    server:"s2",
                    cross:true,
                    success:function(data){
                        console.log(data);
                    }
                });
                bg.get("1.txt",function(data){
                    console.log("get1結果:>>")
                    console.log(data);
                },"text");
                bg.get("1.txt",{},function(data){
                    console.log("get2結果:>>")
                    console.log(data);
                },"text");
                //500錯誤
                bg.post("1.txt",function(data){
                    console.log("post結果:>>")
                    console.log(data);
                },"text");
                //500錯誤
                bg.load($("#msg"),"1.txt",function(data){
                    console.log("load結果:>>")
                    console.log(data);
                });
                
                //打印上面ajax請求的最終的請求路勁(用於測試,和調試)
                console.log(bg.getHttpUrl({hostName:"http://192.168.6.130:8080",cross:true,root:"bridge"},"Jsonp2",true));
                console.log(bg.getHttpUrl({hostName:"http://192.168.6.130:8080",cross:true,root:"bridge2"},"jsonp",true));
            }*/
View Code

 


免責聲明!

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



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