const u = navigator.userAgent;
const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
function getIOSBridge(callback) {
return new Promise(resolve => {
if (window.WebViewJavascriptBridge) { return resolve(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(resolve); }
window.WVJBCallbacks = [resolve];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function () { document.documentElement.removeChild(WVJBIframe) }, 0)
}).then(callback)
}

function getAndroidBridge(callback) {
return new Promise(resolve => {
function initBridge() {
window.WebViewJavascriptBridge.init(function (message, responseCallback) {
console.log('JS got a message', message);
var datas = {
'Javascript Responds': '测试中文!'
};
console.log('JS responding with', datas);
responseCallback(datas);
});
}
if (window.WebViewJavascriptBridge) {
initBridge()
resolve()
} else {
document.addEventListener('WebViewJavascriptBridgeReady', function () {
initBridge()
resolve()
}, false);
}

}).then(callback)
}

async function getBridge(callback) {
if (isAndroid) {
await getAndroidBridge(callback)
} else if (isiOS) {
await getIOSBridge(callback)
}
}

;(function (window) {
function loadJSBridge(main) {
class JSBridge {
constructor() {
const self = this;
return function JSBFn(opts, cb) {
if (self[this]) {
self[this](opts, cb);
}
}
}

/**
* 获取当前定位
* @param {Object} opts
* - [String] bizType 标识当前应用类型,目前值为 'amap',如无需使用请忽略
* @param {Function} cb 回调函数
* @回调函数参数 {Object}
* - [String | null] error 标识异常信息,获取定位成功时应为 null
* - [Number] longitude 经度,保留小数点后 6 位
* - [Number] latitude 纬度,保留小数点后 6 位
*/
getCurrentLocation(opts, cb) {
// @todo
WebViewJavascriptBridge.callHandler('getCurrentLocation', "", function (response) {
if (isAndroid) {
response = JSON.parse(response);
}
// logger.info(LogTag.loader, 'getCurrentLocation result', response)
cb(response);
});
}

/**
* 开启持续定位
* @param {Object} opts
* - {Number} callbackInterval 获取定位的时间间隔
* @param {Function} cb 回调函数,开启持续定位后,应定时回调此方法
* @回调函数参数 {Object}
* - [String | null] error 标识异常信息,获取定位成功时应为 null
* - [Number] longitude 经度,保留小数点后 6 位
* - [Number] latitude 纬度,保留小数点后 6 位
*/
startContinuousLocation(opts, cb) {
// @todo
const { callbackInterval = 5000 } = opts;
this.continuousLocationTimr = window.setInterval(() => {
this.getCurrentLocation({}, cb);
}, callbackInterval);
}

/**
* 停止持续定位
* @param {Function} cb 回调函数,无需参数
*/
stopContinuousLocation(cb) {
// @todo
clearInterval(this.continuousLocationTimr);
this.continuousLocationTimr = null;

}
/**
* 获取设备号,安卓手机提供IMEI MEID,苹果手机提供IDFA,如果部分机型获取不到一律传空字符串,
* 不可以是 invalid 等标识字符串
* @param {Function} cb 回调函数
* @回调函数参数 {String} 设备号
*/
getDeviceId(cb) {
// @todo
WebViewJavascriptBridge.callHandler('getDeviceId', "", function (response) {
cb(response);
});
}

/**
* 设置导航栏标题
* @param {Object} opts
* - {String} title 导航栏标题
*/
setTitle(opts) {
// @todo
WebViewJavascriptBridge.callHandler('setTitle', opts['title'], function (response) {
cb(response);
});
}

/**
* 复制到剪切板
* @param {Object} opts
* - {String} text 需要复制的文本内容
*/
setClipboard(param) {
console.log(param)
// @todo
WebViewJavascriptBridge.callHandler('copyclipboard', param, function (response) {

});

}

/**
* 关闭当前 webview
*/
popWindow() {
// @todo
WebViewJavascriptBridge.callHandler('popWindow', '', function (response) {

});

}

/**
* 打开新的 webview
* @param {Object} opts
* - {String} url 新页面链接
* - {Object} param 参数
* - {String} defaultTitle: 新页面标题
*/
pushWindow(opts) {
// @todo
WebViewJavascriptBridge.callHandler('pushWindow', opts, function (response) {

});

}

/**
* 获取系统信息
* @param {Function} cb 回调函数
*/
getSystemInfo(cb) {
// @todo
WebViewJavascriptBridge.callHandler('getSystemInfo', "", function (response) {
if (isAndroid) {
response = JSON.parse(response);
}
cb(response);
});
}

/**
* 禁止手势返回
* @param {Object} opts
* - {Boolean} val 手势返回开启状态 true 为允许返回,false 为禁止返回
*/
setGestureBack(opts) {
// @todo
WebViewJavascriptBridge.callHandler('setGestureBack', opts['val'], function (response) {

});
}

/**
* 隐藏导航栏
*/
hideTopBar() {
// @todo
WebViewJavascriptBridge.callHandler('hideTopBar', '', function (response) {

});
}

/**
* 调起支付收银台
* @param {Object} opts
* - {String} orderStr 支付宝支付交易字符串
* @param {Function} cb 回调函数
* @回调函数参数 {Object}
* - {Number|String} resultCode 支付宝返回的 code
* - {String} memo 错误描述
*/
tradePay(opts, cb) {
// @todo
WebViewJavascriptBridge.callHandler('alipay', opts['orderStr'], function (response) {
if (isAndroid) {
response = JSON.parse(response);
}
cb(response);
});
}
}
window.JSBridge = new JSBridge();
getBridge(main)
}

window.loadJSBridge = loadJSBridge;
loadJSBridge(()=>{
console.log('加载成功')
})
})(window);

高德打车对接loader.js文件的实现的更多相关文章

  1. webpack学习笔记一:安装webpack、webpack-dev-server、内存加载js和html文件、loader处理非js文件

    一 .webpack学习环境准备: 1:window系统 2:安装node.js  官方网址 下载好后下一步下一步安装即可 安装步骤略过....... 3:nrm的安装 打开cmd命令控制台 输入:n ...

  2. ExtJS4.x动态加载js文件

    动态加载js文件是ext4.x的一个新特性,可以有效的减少浏览器的压力,提高渲染速度.如动态加载自定义组件 1.在js/extjs/ux目录下,建立自定义组件的js文件. 2.编写MyWindow.j ...

  3. Ext JS学习第十天 Ext基础之动态加载JS文件(补充)

    此文用来记录学习笔记: •Ext4.x版本提供的一大亮点就是Ext.Loader这个类的动态加载机制!只要遵循路径规范,即可动态加载js文件,方便把自己扩展组件动态加载进来,并且减轻浏览器的压力. • ...

  4. Extjs学习----------动态载入js文件(减轻浏览器的压力)

    动态载入js文件能够减轻浏览器的压力,本例使用了Ext.window.Window组件,该组件的学习地址:http://blog.csdn.net/z1137730824/article/detail ...

  5. webpack.config.js文件的高级配置

    一.多个入口文件之前我们配置的都是 一个入口 var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.Co ...

  6. vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题

    vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题 今天下载了一个开源项目一直运行不了,折腾了半天才找到问题所在,config ...

  7. .38-浅析webpack源码之读取babel-loader并转换js文件

    经过非常非常长无聊的流程,只是将获取到的module信息做了一些缓存,然后生成了loaderContext对象. 这里上个图整理一下这节的流程: 这一节来看webpack是如何将babel-loade ...

  8. 多个JS文件性能优化

    页面中引入的JS文件是阻塞式加载的,这样会影响页面性能.以下是JS文件性能优化方法: 一:将所有的<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在 ...

  9. 从零开始开发一个vue组件打包并发布到npm (把vue组件打包成一个可以直接引用的js文件)

    自己写的组件 有的也挺好的,为了方便以后用自己再用或者给别人用,把组件打包发布到npm是最好不过了,本次打包支持 支持正常的组件调用方式,也支持Vue.use, 也可以直接引用打包好的js文件, 配合 ...

随机推荐

  1. 用Python爬取英雄联盟(lol)全部皮肤

    小三:"怎么了小二?一副无精打采的样子!" 小二:"唉!别提了,还不是最近又接触了一个叫英雄联盟的游戏,游戏中很多皮肤都需要花钱买,但是我钱不够呀..." 小三 ...

  2. C++实现任意进制的相互转换

    进制转换是计算机内部时时刻刻都在进行活动,本篇文章也是进制转换的算法介绍,不过不同的是我想利用ascll编码实现2到61之间任意进制的相互转换,更大进制的表示方法只不过是十六进制表示方法的延伸:用字母 ...

  3. shiro利用过期时间,解决用户冻结踢出问题

    背景 shiro中需要冻结某个用户,但是此时此刻这个用户在线,如果冻结只是改变状态的话,只会导致用户不满,所以要改变这个办法. 在查找过程中发现都是告诉shiro写自定义过滤器,那么我如果自定义过滤器 ...

  4. python 爬取喜马拉雅节目生成RSS Feed

    记录于:2020年12月03日用了N年的手机在经历N次掉落之后终于扛不住了,后背都张嘴了,估计再摔一次电池都能飞出来.换了手机,由于之前有听喜马拉雅的习惯,但是手机里自带有播客软件,强迫症逼着我不能下 ...

  5. IdentityServer4系列 | 授权码模式

    一.前言 在上一篇关于简化模式中,通过客户端以浏览器的形式请求IdentityServer服务获取访问令牌,从而请求获取受保护的资源,但由于token携带在url中,安全性方面不能保证.因此,我们可以 ...

  6. 20200428_在centos7.2上挂载ntfs和备份文件到移动硬盘

    [root@localhost ~]# fdisk -l 磁盘 /dev/sda:2000.4 GB, 2000398934016 字节,3907029168 个扇区 - 设备 Boot Start ...

  7. 小白也能看懂的mySQL进阶【单表查询】

    目录 1.查询基础 SELECT语句基础 列的查询 为列设定别名 常数的查询 过滤表中重复数据 根据WHERE语句来选择记录 注释的书写方法 算术运算符和比较运算符 算术运算符 需要注意NULL 比较 ...

  8. lcm的和(莫比乌斯反演)

    马上开学了,加一个操作系统和数据库标签 不玩了,求1-n和1-m的lcm(i,j)和 首先想到把lcm(i,j)转化为i * j / gcd(i, j) 然后gcd,要素察觉,开始枚举d使得gcd(i ...

  9. React跳转路由传参3种方法和区别

    1.params传参 路由表配置:参数地址栏显示 路由页面:<Route path='/demo/:id' component={Demo}></Route> //配置 /:i ...

  10. [BJDCTF 2nd]xss之光

    [BJDCTF 2nd]xss之光 进入网址之后发现存在.git泄露,将源码下载下来,只有index.php文件 <?php $a = $_GET['yds_is_so_beautiful']; ...