脚本编程

js获取url中?后的参数,修复移动版无法切换到电脑版的BUG

Jager · 5月26日 · 2014年 · · 4336次已读

昨天,发布了《完美实现移动主题在 360 网站卫士缓存全开情况下的切换》一文,通过 JS 实现了主题在移动端访问时的自动切换,最后提到了可以在电脑版和移动版的 footer 里面加上手动切换链接,实现手动版本切换功能。

今早发现,电脑版切换到移动版是没问题了,但是移动版切换到电脑版,JS 将会再次工作uaredirect.js会再次做 UA 判断,然后由又跳回了电脑版! 也就是说,手机上浏览无法手动切换到电脑版,看来还得继续折腾!

于是,想到一个办法,给移动版的切换链接带上一个参数,再修改 uaredirect.js,当发现链接后面带了指定参数时,就直接 return,而不再进行 UA 判断,避免再次跳转的尴尬。。。

说干就干,在 oschina 找到如下 2 中获取 url 后面参数的方法:

//获取请求 url 中参数的值:
/*方法一:参数值中没有等于号(“=”)*/
        function getUrlRequest() {
            var url = location.search; //获取 url 中"?"符后的字串
            var theRequest = new Object();
            if (url.indexOf("?") != -1) {
                var str = url.substr(1);
                if (str.indexOf("&") != -1) {
                    strs = str.split("&");
                    for (var i = 0; i < strs.length; i++) {
                        theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
                    }
                } else {
                    theRequest[str.split("=")[0]] = unescape(str.split("=")[1]);
                }
            }
            return theRequest;
        }
/*方法二:参数值中有等于号的情况(“=”)*/
        function getUrlRequest(){
                var url = location.search; //获取 url 中"?"符后的字串
                var theRequest = new Object();
                if (url.indexOf("?") != -1) {
                    var str = url.substr(1);
                    if (str.indexOf("&") != -1) {
                        strs = str.split("&");
                        for (var i = 0; i < strs.length; i++) {
                            theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
                        }
                    } else {
                        var key = str.substring(0,str.indexOf("="));
                        var value = str.substr(str.indexOf("=")+1);
                        theRequest[key] = decodeURI(value);
                    }
                }
                return theRequest;
        }

根据个人喜好,张戈选择了第二种,然后如下修改uaredirect.js

//获取 url 后面参数
function getUrlRequest(){
                 var url = location.search;
                 var theRequest = new Object();
                 if (url.indexOf("?") != -1) {
                     var str = url.substr(1);
                     if (str.indexOf("&") != -1) {
                         strs = str.split("&");
                         for (var i = 0; i < strs.length; i++) {
                             theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
                         }
                     } else {
                         var key = str.substring(0,str.indexOf("="));
                         var value = str.substr(str.indexOf("=")+1);
                         theRequest[key] = decodeURI(value);
                     }
                 }
                 return theRequest;
         }
function uaredirect(f) {
     var canshu=getUrlRequest();
    try {
        if (canshu["type"] == "pc") { //当检测到 url 后面带了 type=pc 参数时,停止执行.
            return
        }
        var b = false;
        if (arguments[1]) {
            var e = window.location.host;
            var a = window.location.href;
            if (isSubdomain(arguments[1], e) == 1) {
                f = f + "/#m/" + a;
                b = true
            } else {
                if (isSubdomain(arguments[1], e) == 2) {
                    f = f + "/#m/" + a;
                    b = true
                } else {
                    f = a;
                    b = false
                }
            }
        } else {
            b = true
        }
        if (b) {
            var c = window.location.hash;
            if (!c.match("fromapp")) {
                if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i))) {
                    location.replace(f)
                }
            }
        }
    } catch(d) {}
}
function isSubdomain(c, d) {
    this.getdomain = function(f) {
        var e = f.indexOf("://");
        if (e > 0) {
            var h = f.substr(e + 3)
        } else {
            var h = f
        }
        var g = /^www\./;
        if (g.test(h)) {
            h = h.substr(4)
        }
        return h
    };
    if (c == d) {
        return 1
    } else {
        var c = this.getdomain(c);
        var b = this.getdomain(d);
        if (c == b) {
            return 1
        } else {
            c = c.replace(".", "\\.");
            var a = new RegExp("\\." + c + "$");
            if (b.match(a)) {
                return 2
            } else {
                return 0
            }
        }
    }
};​

最后,在移动版主题的 footer 里面加上如下代码:

<!--登陆-->
<a title="登陆" href="/wp-login.php">登陆</a>&nbsp;
<!--首页底部切换链接-->
<?php wp_reset_query();if ( is_home()){ ?>
<a title="电脑版" href="/?type=pc">电脑版</a>
<?php } ?>
<!--文章底部切换链接-->
<?php wp_reset_query();if ( is_single()){ ?>
<a title="电脑版" href="/<?php the_ID(); ?>.html?type=pc">电脑版</a>
<?php } ?>
<!--分类页底部切换链接-->
<?php wp_reset_query();if ( is_category()){ ?>
<a title="电脑版" href="/<?php echo the_category_slug(); ?>?type=pc">电脑版</a>
<?php } ?>
<!--页面底部切换链接-->
<?php if ( is_page()){ ?>
<a title="电脑版" href="/<?php echo the_slug(); ?>?type=pc">电脑版</a>

Ps:代码中加入登陆链接的原因,是因为WordPress Mobile Pack插件会强制转换后台样式,很不和谐!所以改成了登陆到 PC 版后台的链接,若手机主题已存在登陆链接的,删除替换即可。

最终,解决了移动版无法切换到电脑版的 BUG~!

 

最新补充:突然发现了uaredirect.js中其实已经自带了中断机制:#fromapp 

所以,只要在切换链接后面加上 #fromapp 就可以避免 js 跳转到移动版了!

冏。。。那上面的内容都是白忙活了,仅供参考,仅供参考。。。。

如果,你想换成其他中断参数,可以修改百度提供的uaredirect.js,将代码中的 fromapp 改成你要的标识即可,比如张戈就修改成了 pc,所以在手机上只要访问 https://zhang.ge#pc 就可以正常切换到电脑版了!

那么,文章最后那一大段 footer 代码,也可以将里面的?type=pc改成自定义的中断参数了,比如 #pc,自己看着办~

18 条回应
  1. 世界之最 2014-5-26 · 9:38

    太难了,现在只会复制别人的代码

    • avatar
      Jager 2014-5-26 · 9:55

      呵呵,我也是复制的,只是稍微修改了下。。

  2. 球球 2014-5-26 · 18:42

    各种字符串的分隔替换再分隔等等,有点麻烦,我是直接在网上去找的代码。 [嘻嘻]

    • avatar
      Jager 2014-5-26 · 21:26

      我也是网上找的代码 [嘻嘻]

  3. PHP二次开发 2014-5-26 · 22:20

    有空我也要弄弄我的站点了。

  4. 龙三公子 2014-5-26 · 22:30

    手机上浏览就手机主题呗,没必要再返回电脑版啊。因为手机屏幕就那么大点,如果想看电脑版就不要整手机版。个人感觉吧。

    • avatar
      Jager 2014-5-26 · 22:34

      我有些文章带的功能,必须要在PC主题上才能使用,比如下载按钮。。。手机主题上就只能显示,而不能下载。。。现在能随时切换,也是个好事啊~

  5. 创意驴 - 分享创意 2014-5-26 · 22:55

    怎么让电脑手机显示不一样的呢 正在研究哈哈哈

  6. Wings Blog 2014-5-26 · 23:01

    以前搞这个js获取搞了好久才懂

  7. 圆月博客 2014-5-27 · 9:08

    果然是技术的高手

  8. 垂直绿化 2014-5-27 · 13:58

    我的也做了,自动切换

    • avatar
      Jager 2014-5-27 · 14:08

      恩,挺好用的~是我后知后觉了。

      • wgy 2015-1-28 · 10:30

        不错不错的文章.. :evil: :evil:

  9. 夏日博客 2014-5-27 · 17:10

    直接看还真不很懂,只能拿来运行了。。

  10. leiboy 2014-5-28 · 20:36

    这个还是很实用的

  11. 网赚网 2014-6-10 · 15:17

    恩,学习了,对我做外国网赚有帮助