起因

现在市场上各种跨平台开发方案百家争鸣各有千秋,个人认为最成熟的还是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. “ShardingCore”是如何针对分表下的分页进行优化的

    分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...

  2. Sentry-CLI 使用详解(2021 Sentry v21.8.x)

    内容源于:https://docs.sentry.io/platforms/javascript/guides/vue/ 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创 ...

  3. GDAL 矢量裁剪栅格

    本节将介绍如何在Python中用GDAL实现根据矢量边界裁剪栅格数据. from osgeo import gdal, gdal_array import shapefile import numpy ...

  4. appnium显式等待机制

    强制等待: sleep不推荐全局隐式等待 全局隐式等待: 在服务端等待 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); ...

  5. 创建 Spring容器的三种方式

    一.src路径下打包完在war包的classes层级下 1.Spring容器创建的三种方式 创建Bean容器之后创建对象: 其中第三种使用的是BeanFactory对象 2.spring通过配置文件用 ...

  6. Linux内核下包过滤框架——iptables&netfilter

    iptables & netfilter 1.简介 netfilter/iptables(下文中简称为iptables)组成Linux内核下的包过滤防火墙,完成封包过滤.封包重定向和网络地址转 ...

  7. 尚硅谷Java高级笔记

    尚硅谷Java高级笔记 idea的使用: 一些小区别: 其他细节参考idea配置pdf 多线程: 基本概念: 多线程的优点: 何时需要多线程: 线程的创建和使用: 创建多线程的第一种方式: /** * ...

  8. 获取office版本

    /// <summary>         /// office版本         /// </summary>         public enum OfficeVers ...

  9. webgl 图像处理 加速计算

    webgl 图像处理 webgl 不仅仅可以用来进行图形可视化, 它还能进行图像处理 图像处理1---数据传输 webgl 进行图形处理的第一步: 传输数据到 GPU 下图为传输点数据到 GPU 并进 ...

  10. CTFd+ubuntu service搭建等待更新

    CTFd是一款基于Apache2.0的协议的开源CTF平台,最新版本目前为1.20.该平台功能强大,基本上能够满足目前的CTF竞赛需求,同时,该平台提供了强大的插件功能,可以自己进行插件开发实现自己的 ...