vue中PC端地址跳轉移動端的操作方法
需求:pc端和移動端是兩個獨立的項目,兩個項目項目中的內容基本相同,鏈接組合的方式都有規律可循,接到的需求便是在移動端訪問pc端的URL連接時,重定向至移動端對應頁面。
這個需求實現的方式比較明瞭,我的大致思路是在路由守衛處監聽每個進來的路由請求,分析該請求是否是由移動端訪問,若不是,則該路由請求直接放行;若是則分析要進入的路由路徑,提取路徑中的必要字段,組合稱新的移動端鏈接即可。
裡面涉及到瞭三個知識點:1、路由守衛,2、客戶端判斷、3、正則提取文字,接下來就分別按照這幾點講解一下,並附上整個開發過程的源碼,供大傢參考學習或批評指正。
1、路由守衛
- to:要進入的路由
- from:從哪個路由訪問
- next:路由控制參數,常用next(true),和next(false)
//所有的路由請求都會經過該路由守衛, router.beforeEach((to, from, next) => { //訪問鏈接如:http://localhost/page/detail/IUKGEQ/108/9933/32279/8 //訪問路徑為:/page/detail/IUKGEQ/108/9933/32279/8 let toUrl = to.path; //該路由請求放行 next(); });
2、判斷客戶端
navigator.userAgent:可獲取瀏覽器用於HTTP請求的用戶代理頭的值
if (typeof window !== 'undefined' && typeof window.navigator !== 'undefined') { if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { //處理移動端的業務邏輯 }else{ //處理電腦端的業務邏輯 } }
3、正則表達式(JS)
語法
/正則表達式主體/修飾符(可選)
修飾符
表達式 | 描述 |
---|---|
i | 執行對大小寫不敏感的匹配。 |
g | 執行全局匹配(查找所有匹配而非在找到第一個匹配後停止)。 |
m | 執行多行匹配。 |
search()
search() 方法 用於檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串,並返回子串的起始位置。若無則返回**-1**。
// 不區分大小寫 var index = 'Hello World!'.search(/world/i);
replace()
replace() 方法 用於在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。
var txt = 'Microsoft'.replace("Microsoft","World");
test()
test() 方法用於檢測一個字符串是否匹配某個模式,如果字符串中含有匹配的文本,則返回 true,否則返回 false
var flag = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent);
exec()
exec() 方法用於檢索字符串中的正則表達式的匹配。
該函數返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值為 null。
var matchParams = /(\d{1,3})\/(\d{4,6})\/(\d{4,6})/.exec('/page/detail/IUKGEQ/108/9933/32279/8')
正則語法參考:https://www.runoob.com/regexp/regexp-syntax.html
4、源碼:
export default ({ app }) => { app.router.beforeEach((to, from, next) => { if (typeof window !== 'undefined' && typeof window.navigator !== 'undefined') { if(!/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { //電腦端訪問,則直接放行 next(); }else{ var sCode = ''; let toUrl = to.path; //標識獲取方式1:從請求鏈接中獲取 //如:/page/detail/IUKGEQ/108/9933/32279/8 //如:/IUKGEQ //正則表達式提取連接中的 六位大寫字母的標識 let matchArr = toUrl.match('\/([A-Z]{6})'); if((sCode=='' || sCode == null || sCode == undefined) && matchArr != null){ sCode = matchArr[1]; } //標識獲取方式2:發起請求獲取Code //如:/swpu let matchArr2 = toUrl.match('\/([a-z]{3,})'); if((sCode=='' || sCode == null || sCode == undefined) && matchArr2 != null){ var param = matchArr2[1]; getSInfo2(param) .then(res => { if (res.data.code) { sCode = res.data.code; //路由跳轉 mobileRouteCombine(toUrl,sCode); } else { // 查不到code next();//放行 } }) .catch(err => { next();//放行 }); } //上面兩種種方式如果都無法取出code,則直接放行 if(sCode=='' || sCode == null || sCode == undefined){ next(); return; }else{ //路由跳轉 mobileRouteCombine(toUrl,sCode); } } } next(); }) } /** * 移動端路由重組 * @param {訪問的url地址} toUrl * @param [code] sCode */ function mobileRouteCombine(toUrl,sCode){ var wxHomeUrl = conf.weixin + '/build/index.html?scode=' + sCode + '#/'; // toUrl為 如 /IUKGEQ 形式,則直接跳轉微信首頁 if(toUrl.length <= 7){ location.href = wxHomeUrl; } //文章列表 if(toUrl.indexOf('/page/list/') != -1){ let matchParams = toUrl.match('(\\d{1,3})\/(\\d{4,6})'); let catId = matchParams[2]; let versionId = matchParams[1];//版本id var url = wxHomeUrl +'articleList?catId=' + catId; location.href = url; } //文章詳情 if(toUrl.indexOf('/page/detail/') != -1){ let matchParams = toUrl.match('(\\d{1,3})\/(\\d{4,6})\/(\\d{4,6})'); let infoId = matchParams[3]; let catId = matchParams[2]; let versionId = matchParams[1];//版本id var url = wxHomeUrl +'articleDetail?infoId=' + infoId + '&catId=' + catId; location.href = url; } }
到此這篇關於vue中PC端地址跳轉移動端的文章就介紹到這瞭,更多相關vue地址跳轉移內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript判斷是否手機瀏覽器的五種方法
- js不同客戶端顯示不同廣告(pc端+移動端+微信端)
- JavaScript 判斷瀏覽器是否是IE
- c# Selenium爬取數據時防止webdriver封爬蟲的方法
- ECMAScript 的 6 種簡單數據類型