京东H5直接打开app的代码分析(未完待续)

    (function(){
    // 判断浏览器
        var Navigator = navigator.userAgent;
        var ifChrome = Navigator.match(/Chrome/i) != null && Navigator.match(/Version\/\d+\.\d+(\.\d+)?\sChrome\//i) == null ? true : false;  
        var ifAndroid = (Navigator.match(/(Android);?[\s\/]+([\d.]+)?/)) ? true : false;
        var ifiPad = (Navigator.match(/(iPad).*OS\s([\d_]+)/)) ? true : false;
        var ifiPhone = (!ifiPad && Navigator.match(/(iPhone\sOS)\s([\d_]+)/)) ? true : false;
        var ifSafari = (ifiPhone || ifiPad) && Navigator.match(/Safari/);
        var version = 0;
        ifSafari && (version = Navigator.match(/Version\/([\d\.]+)/));
        version = parseFloat(version[1], 10);
        
            // 是否从微信打开
        var ifWeixin = navigator.userAgent.indexOf("MicroMessenger") >= 0; // weixin
        var j = false;
        var iframe = "plugIn_downloadAppPlugIn_loadIframe";
        var t = false;
        var i = 0;
        var B = {};
        var b = {};
        var selector = null;
        var Hquery = {};
            // 判断当前使用的js框架是zepto还是jquery
        var Query = window.Zepto || window.jQuery ? true : false;
        var g = [];
            // 是否存在html5的localStorage 存储
        var v = window.localStorage ? true : false;
        var o = "mdownloadAppPlugInskip";
        var p = null;
            
        function m() { // 打印时间 例如:2016-5-18
            var M = new Date();
            var N = M.getFullYear();
            var O = M.getMonth() + 1;
            var L = M.getDate();
            strDate = N + "-" + O + "-" + L;
            return strDate
        }
            // 微信相关操作
        function r() { // weixin api
            WeixinJSBridge.invoke("getInstallState", {
                packageName: "com.jingdong.app.mall",
                packageUrl: "openApp.jdMobile://"
            }, function(M) {
                var N = M.err_msg,
                    L = 0;
                if (N.indexOf("get_install_state:yes") > -1) {
                    j = true
                }
            })
        }
           // 根据是否存在js框架进行dom和时间的绑定
        function bind(dom, event, fun) { // bind event
            if (Query) {
                selector("#" + dom).bind(event, fun)
            } else {
                selector("#" + dom).addEventListener(event, fun, !1)
            }
        }
            
        function z(L) {
            var M = (L || "mGen") + (++i);
            return M
        }
            // 微信操作
        if (ifWeixin) { // if navigitor is weixin 
            if (window.WeixinJSBridge && WeixinJSBridge.invoke) {
                r()
            } else {
                document.addEventListener("WeixinJSBridgeReady", r, !1)
            }
        }
    
            // 如果存在js框架
        if (Query) {
            selector = window.$;
            Hquery = window.$
        } else {
            selector = function(obj) {
                if (typeof obj == "object") {
                    return obj
                }
                return document.querySelector(obj);
            };
            if (!window.$) {
                window.$ = Hquery = selector
            } else {
                Hquery = window.$ 
            }
        }
        window.onblur = function() {
            for (var L = 0; L < g.length; L++) {
                clearTimeout(g[L])
            }
        };
             // 设置cookie。
        function e(N) {
            var M = document.cookie.indexOf(N + "=");
            if (M == -1) {
                return ""
            }
            M = M + N.length + 1;
            var L = document.cookie.indexOf(";", M);
            if (L == -1) {
                L = document.cookie.length
            }
            return document.cookie.substring(M, L)
        }
            // 设置cookie
        function l(N, P, L, Q, O) { 
            var R = N + "=" + escape(P);
            if (L != "") {
                var M = new Date();
                M.setTime(M.getTime() + L * 24 * 3600 * 1000);
                R += ";expires=" + M.toGMTString()
            }
            if (Q != "") {
                R += ";path=" + Q
            }
            if (O != "") {
                R += ";domain=" + O
            }
            document.cookie = R
        }
            
            // 打开的链接集合
        function F(L) {
            var url = {
                downAppURl: "http://h5.m.jd.com/active/download/download.html?channel=jd-m",
                downAppIos: "http://union.m.jd.com/download/go.action?to=http%3A%2F%2Fitunes.apple.com%2Fcn%2Fapp%2Fid414245413&client=apple&unionId=12532&subunionId=m-top&key=e4dd45c0f480d8a08c4621b4fff5de74",
                downWeixin: "http://a.app.qq.com/o/simple.jsp?pkgname=com.jingdong.app.mall&g_f=991850",
                downIpad: "https://itunes.apple.com/cn/app/jing-dong-hd/id434374726?mt=8",
                inteneUrl: "openApp.jdMobile://360buy?type=1",
                inteneUrlParams: null,
                openAppBtnId: "",
                closePanelBtnId: "",
                closePanelId: "",
                closeCallblack: null,
                closeCallblackSource: null,
                cookieFlag: null,
                noRecord: false,
                sourceType: "JSHOP_SOURCE_TYPE",
                sourceValue: "JSHOP_SOURCE_VALUE",
                openAppEventId: "MDownLoadFloat_OpenNow",
                closePanelEventId: "MDownLoadFloat_Close"
            };
            if (L) {
                for (var M in L) {
                    if (M && L[M]) {
                        url[M] = L[M]
                    }
                }
            }
            return url
        }
            // 敲黑板 重点内容。看京东是怎么解决兼容问题的。
        function openApp(N, L) { // openApp
            var R = h(N); //获取相对应的url
            var O = null;
            if (ifWeixin) { // 如果是微信端
                var M = null;
                if (j) {
                    M = R
                } else {
                    M = N.downWeixin
                }
                location.href = M; // 直接使用location.href打开
                return
            }
            if (ifiPad) { // 如果是ipad
                O = N.downIpad
            } else { 
                if (ifiPhone) { // 如果是iphone
                    O = N.downAppIos
                } else {
                    O = N.downAppURl
                }
            }
                        
            if (ifChrome) { // 如果是chrome
                if (ifAndroid) { //安卓浏览器
                    var Q = R;
                    R = y(Q);
                                    // 延后50毫秒
                    setTimeout(function() {
                        window.location.href = R 
                    }, 50)
                }
            }
            if (ifSafari && version >= 9) { // 判断safari版本 如果大于9
                setTimeout(function() {  // 必须要使用settimeout
                    var S = document.createElement("a"); //创建a元素
                    S.setAttribute("href", R), S.style.display = "none", document.body.appendChild(S);
                    var T = document.createEvent("HTMLEvents"); // 返回新创建的 Event 对象,具有指定的类型。
                    T.initEvent("click", !1, !1)// 初始化新事件对象的属性,   S.dispatchEvent(T)  // 绑定事件
                }, 0)
            } else {
                document.querySelector("#" + iframe).src = R // 将iframe增加src
            }
            var P = Date.now();
            setTimeout(function() {
                if (L) {
                    var S = setTimeout(function() {
                        x(P, O)
                    }, 1500);
                    g.push(S)
                }
            }, 100)
        }
            // x方法
        function x(N, downUrl) {
            var L = Date.now();
            if (N && (L - N) < (1500 + 200)) {
                window.location.href = downUrl
            }
        }
        
        function h(N) {
            var V = [];
            var P = N.inteneUrlParams;
            var T = {
                category: "jump",
                des: "productDetail"
            };
            if (N.sourceType && N.sourceValue) {
                T.sourceType = N.sourceType;
                T.sourceValue = N.sourceValue;
                if (P && !P.sourceType && !P.sourceValue) {
                    P.sourceType = N.sourceType;
                    P.sourceValue = N.sourceValue
                }
            }
            if (P) {
                for (var U in P) {
                    if (U && P[U]) {
                        V.push('"' + U + '":"' + P[U] + '"')
                    }
                }
            } else {
                for (var U in T) {
                    if (U && T[U]) {
                        V.push('"' + U + '":"' + T[U] + '"')
                    }
                }
            }
            try {
                var Q = MPing.EventSeries.getSeries();
                if (Q) {
                    var W = JSON.parse(Q);
                    W.jdv = encodeURIComponent(e("__jdv"));
                    W.unpl = encodeURIComponent(e("unpl"));
                    W.mt_xid = encodeURIComponent(e("mt_xid"));
                    W.mt_subsite = encodeURIComponent(e("mt_subsite"))
                }
                var S = {
                    mt_subsite: encodeURIComponent(e("mt_subsite")),
                    __jdv: encodeURIComponent(e("__jdv")),
                    unpl: encodeURIComponent(e("unpl")),
                    __jda: encodeURIComponent(e("__jda"))
                };
                Q = JSON.stringify(W);
                V.push('"m_param":' + Q);
                V.push('"SE":' + JSON.stringify(S))
            } catch (R) {
                V.push('"m_param":null')
            }
            var M = "{" + V.join(",") + "}";
            var O = N.inteneUrl.split("?");
            var L = null;
            if (O.length == 2) {
                L = O[0] + "?" + O[1] + "&params=" + M
            } else {
                L = O[0] + "?params=" + M
            }
            return L
        }
    
        function y(L) {
            return "intent://m.jd.com/#Intent;scheme=" + L + ";package=com.jingdong.app.mall;end"
        }
    
        function n(L) {
            if (L.openAppBtnId) {
                B[L.openAppBtnId] = L;
                G(L.openAppBtnId, L.openAppEventId);
                bind(L.openAppBtnId, "click", function() {
                    var P = this.getAttribute("id");
                    var M = B[P];
                    if (!t) {
                        var N = document.createElement("iframe");
                        N.id = iframe;
                        document.body.appendChild(N);
                        document.getElementById(iframe).style.display = "none";
                        document.getElementById(iframe).style.width = "0px";
                        document.getElementById(iframe).style.height = "0px";
                        t = true
                    }
                    var O = M.cookieFlag ? "downloadAppPlugIn_downCloseDate_" + M.cookieFlag : "downloadAppPlugIn_downCloseDate";
                    l(O, Date.now() + "_2592000000", 60, "/", "m.jd.com");
                    l(O, Date.now() + "_2592000000", 60, "/", "m.jd.hk");
                    openApp(M, true)
                })
            }
        }
    
        function D(M) {
            if (M.closePanelBtnId && M.closePanelId) {
                B[M.closePanelBtnId] = M;
                G(M.closePanelBtnId, M.closePanelEventId);
                var Q = M.cookieFlag ? "downloadAppPlugIn_downCloseDate_" + M.cookieFlag : "downloadAppPlugIn_downCloseDate";
                var O = e(Q);
                var P = null;
                if (O) {
                    P = O.split("_");
                    if (P.length == 2) {
                        P[0] = parseInt(P[0], 10);
                        P[1] = parseInt(P[1], 10)
                    } else {
                        P = null
                    }
                }
                var L = Date.now();
                if (Html5Plus() || (!M.noRecord && P && P.length == 2 && (L - P[0]) < P[1])) {
                    document.querySelector("#" + M.closePanelId).style.display = "none";
                    if (M.closeCallblack) {
                        var N = M.closeCallblackSource ? M.closeCallblackSource : null;
                        M.closeCallblack.call(N)
                    }
                    return
                } else {
                    document.querySelector("#" + M.closePanelId).style.display = "block"
                }
                bind(M.closePanelBtnId, "click", function() {
                    var U = this.getAttribute("id");
                    var R = B[U];
                    var T = R.cookieFlag ? "downloadAppPlugIn_downCloseDate_" + R.cookieFlag : "downloadAppPlugIn_downCloseDate";
                    if (!R.noRecord) {
                        l(T, Date.now() + "_259200000", 60, "/", "m.jd.com");
                        l(T, Date.now() + "_259200000", 60, "/", "m.jd.hk")
                    }
                    document.querySelector("#" + R.closePanelId).style.display = "none";
                    if (R.closeCallblack) {
                        var S = R.closeCallblackSource ? R.closeCallblackSource : null;
                        R.closeCallblack.call(S)
                    }
                })
            }
        }
    
        function Html5Plus() { // htmlplus
            if (Navigator.indexOf("Html5Plus") >= 0) {
                return true
            } else {
                return false
            }
        }
    
        function G(P, M) {
            try {
                var O = document.getElementById(P);
                var L = O.className;
                if (L) {
                    L = L + " J_ping"
                } else {
                    L = "J_ping"
                }
                O.className = L;
                O.setAttribute("report-eventid", M)
            } catch (N) {}
        }
    
        function C(L) {
            var M = F(L);
            n(M);
            D(M)
        }
        Hquery.downloadAppPlugIn = C;
        Hquery.downloadAppPlugInOpenApp = function(L) {
            var M = F(L);
            openApp(M);
        }
    });

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容