起因

现在市场上各种跨平台开发方案百家争鸣各有千秋,个人认为最成熟的还是hybird方案,简单的说就是写H5各种嵌入,当然作为前端工程师最希望的也就是公司采用hybird方案当作技术路线。

所谓的hybird方案很多时候单独指h5嵌入app页面,本专辑讲的却比这个要广泛很多,作者想写一个基础框架嵌入所有移动端app,包括app壳子、微信公众号、微信小程序、支付宝页面、支付宝小程序等,而且是一套代码可以同时嵌入各种app,这样最大程度上节约开发成本,当然我们的框架也会注意到开发质量,如前面文章提到的移动端页面切换动画也是为了提升用户体验。

大hybird方案必须要处理的是判断当前程序运行在什么环境中,故有此篇判断浏览器类型的合集。

微信浏览器

微信公众号或微信内直接打开链接

var ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
// 在微信中打开
}

微信小程序

// html 引入
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
// js中如下判断
var ua = navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i)=="micromessenger") {
wx.miniProgram.getEnv((res)=>{
if (res.miniprogram) {
// 在微信小程序中打开
}
})
}

支付浏览器

支付宝浏览器中

var ua = navigator.userAgent.toLowerCase();
if (ua.match(/Alipay/i)=="alipay") {
// 在支付宝中打开
}

支付宝小程序中

// html 引入
<script type="text/javascript" src="https://appx/web-view.min.js"></script>
// js中如下判断
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/Alipay/i)=="alipay") {
my.getEnv((res)=>{
if (res.miniprogram) {
// 在支付宝小程序中打开
}
})
}

app壳子

在app壳子中往往使用往ua里面添加唯一标识符来做标识。

var ua = navigator.userAgent.toLowerCase();
if (ua.match(/myapp/i)=="myapp") {
// 在自家app壳子里面
}

其他的没有标识的app,最后的倔强

可以使用路径上新增参数的方式去识别,当识别到参数就在session保存起来,这样作用周期就是某一次打开,防止了数据污染。

完整版js

我习惯命名browser-env.js

// 自家app壳子的ua标识
const SELF_APP_UA_KEY = 'myapp' const browserEnv = {
enum: {
BROWSER: 0, // 浏览器访问, SELFAPP: 10, // 自己家app WX: 20, // 微信浏览器
WX_MINIPROGRAM: 21, // 微信小程序 ALI: 30, // 支付宝浏览器
ALI_MINIPROGRAM: 31,// 支付宝小程序 // ... 更多扩展
},
webType: 0,
initWebType: function (type) {
// 设置值,并且让其不可改变,防止开发随意篡改。
Object.defineProperty( this, "webType", {
value: type,
writable: false,
configurable: false
});
},
// 识别浏览器类型
identifyBrowser() {
// ua和枚举的浅层映射放这里,ua能匹配的都这么处理
let codeKey = {
'micromessenger': this.enum.WX,
'alipay': this.enum.ALI
}
// 添加自家app映射
codeKey[SELF_APP_UA_KEY] = this.enum.SELFAPP; // 获取ua
let ua = navigator.userAgent.toLowerCase();
let type = this.enum.BROWSER
for (let key in codeKey) {
let mk = `/${key}/i`;
if (ua.match(mk) == key) {
type = codeKey[key]
}
} // ua 匹配不出来的,继续匹配 // 延迟引入JSSDK往后处理,不讲究可以直接写入html
if (type == this.enum.WX) {
wx.miniProgram.getEnv((res)=>{
if (res.miniprogram) {
type = this.enum.WX_MINIPROGRAM
}
})
} else if (type == this.enum.ALI) {
my.getEnv((res)=>{
if (res.miniprogram) {
type = this.enum.ALI_MINIPROGRAM
}
})
} this.initWebType(type)
},
install(Vue) {
this.identifyBrowser() Vue.config.globalProperties.$browserEnv = browserEnv;
},
} export default browserEnv;

老规矩,全局引入

import browserEnv from '@/utils/browser-env.js'
app.use(browserEnv)

使用,个人觉得使用枚举更加清晰吧,一顿写数字其实也挺好

if (this.$browserEnv.webType == this.$browserEnv.enum.WX) {
// 在微信中
}

原创不易,转载请注明出处,欢迎留言提议。

js判断移动端浏览器类型,微信浏览器、支付宝小程序、微信小程序等的更多相关文章

  1. 判断网页打开浏览器类型,PC 手机端,微信浏览器,,,

    //判断网页打开浏览器类型,PC 手机端,微信浏览器,,, <script type="text/javascript"> var browser = { versio ...

  2. JS判断移动端还是PC端(改造自腾讯网) 仅用于宣传动画,下载页等

    JS判断移动端还是PC端(改造自腾讯网 http://www.qq.com/) 本脚本仅用于宣传动画,下载页( ipad 也算pc端)等,  ionic 用 ionic.platform 即可( io ...

  3. js判断移动端是否安装某款app的多种方法

    本文实例讲解了js判断移动端是否安装某款app的多种方法,分享给大家供大家参考,具体内容如下 第一种方法: 一:判断是那种设备 ? || u.indexOf(; //android终端或者uc浏览器 ...

  4. js 判断pc端或手机端

    <script> (function () { var navUA = navigator.userAgent; var defIncludeStr = "iPhone|Andr ...

  5. JS 判断移动端与PC端

    js判断移动端与pc端   这里介绍下使用device.js插件来判断移动端设备 地址:https://github.com/matthewhudson/device.js 示例: 1 2 3 4 5 ...

  6. js判断安卓客户端或者是ios客户端,是否是微信浏览器

      代码: function xaizai() {  var u = navigator.userAgent, app = navigator.appVersion;  var isAndroid = ...

  7. js判断浏览器类型以及浏览器版本

    判断浏览器类型:   if navigator.userAgent.indexOf(”MSIE”)>0) {} //判断是否IE浏览器 if(isFirefox=navigator.userAg ...

  8. js判断移动端和PC端跳转不同页面

    方法一: /* * * 判断PC端与WAP端 */ var mobile_bs = { versions: function() { var u = navigator.userAgent; retu ...

  9. js判断移动端是否安装某软软件,安装直接打开相应的链接,否则跳转到下载商店方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

随机推荐

  1. shp的基本操作

    本节将介绍如何利用python完成对shp的基本操作 1.读取shp四至 import shapefile sf = shapefile.Reader(r"E:\shp\1.shp" ...

  2. Ordering the Soldiers 题解

    CodeChef:ORDERS 简化题意: \(n\) 个人排队,给定每个人需要向左移动几个,求最终排列. 即还原逆序对. 错误想法 既然知道每个人向左移动 \(a_i\) 个,那就相当于让他的排名 ...

  3. NOIP模拟51

    樱花满地集于我心,楪舞纷飞祈愿相随 前言 太菜了,人手切掉两个题,我竟然一道都不会.. 改 T3 的时候整个人的心态都崩掉了,一部分原因可能是语文素养不高导致我看不懂题解. 另一部分可能就是系太不太好 ...

  4. String底层使用是char数组还是byte数组

    结论:jdk1.8及以前String底层使用是char[],1.9开始使用byte[] jdk1.8 jdk13

  5. 测试开发【提测平台】分享10-Element UI抽屉和表单校验&增改接口合并实现应用管理

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 开篇说个小讨论,一个群里聊天聊到关于更新篇章的长度,是小篇幅多次,还是每次按照一个小完整的功能,我个人的是按照后种来的,主要的思考就是希望 ...

  6. 大学四年的Python学习笔记分享之一,内容整理的比较多与仔细

    翻到以前在大学坚持记录的Python学习笔记,花了一天的时间整理出来,整理时不经回忆起大学的时光,一眨眼几年就过去了,现在还在上学的你们,一定要珍惜现在,有个充实的校园生活.希望这次的分享对于你们有学 ...

  7. 对象赋值在PHP中到底是不是引用?

    之前的文章中,我们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,直接就是引用赋值.那么到底真实情况是怎样呢? 之前变量赋值的文章 PHP的变量赋值 对象引用测试 在继续深入的学习PHP ...

  8. js 命令模式 组合模式

    * 基本宏命令 var closeDoorCommand = { execute: function() { console.log("Closing the door..."); ...

  9. adb devices如何连逍遥模拟器的设备

    adb device连接真机,上一篇已经讲过了,这篇讲如何连接模拟器.这里我用的模拟器逍遥模拟器.我先插上手机,另外启动了一个模拟器,直接在cmd中输入adb devices,按理应该有2个设备id, ...

  10. pyqt5 GUI教程

    from PyQt5 import QtCore, QtGui, QtWidgets import sys import qtawesome class MainUi(QtWidgets.QMainW ...