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. PHP 获取本周、今日、本月的起始时间戳

    当前周的开始时间(周一)$begintime = mktime(0, 0, 0, date('m'), (date('d') - (date('w')>0 ? date('w') : 7) + ...

  2. Maven更换阿里源与仓库地址

    一.为什么要更换maven中的阿里源和仓库地址? 因为咱们下载安装的maven默认配置的源的服务器在国外,所以对于咱们来说,下载jar包的速度会很慢,所以咱们要把它替换为咱们国内的,可以换成好多,如华 ...

  3. python基础之条件语句

    检查相等和不等 多个检查条件 age1 = 22 age2 = 19 s1 = age1 > 21 and age2 > 19 print(s1) s2 = age1 > 21 or ...

  4. Apache HTTPD 换行解析漏洞--CVE-2017-15715

    CVE-2017-15715 一.漏洞描述 Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页.其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1 ...

  5. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  6. Pytest自动化测试 - allure报告进阶

    Allure除了具有Pytest基本状态外,其他几乎所有功能也都支持. 1.严重性 如果你想对测试用例进行严重等级划分,可以使用 @allure.severity 装饰器,它可以应用于函数,方法或整个 ...

  7. 【NOIP2017提高A组模拟9.17】组合数问题

    [NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...

  8. C#Excel导出注意事项

    Excel 导出 1.首先在服务器中安装office ,并且要注册2.在组件服务中 设置Microsoft.excel.appliction 属性中设置自定义加network service用户并交互 ...

  9. 《Machine Learning in Action》—— 浅谈线性回归的那些事

    <Machine Learning in Action>-- 浅谈线性回归的那些事 手撕机器学习算法系列文章已经肝了不少,自我感觉质量都挺不错的.目前已经更新了支持向量机SVM.决策树.K ...

  10. day6(celery原理与组件)

    1.Celery介绍 1.1 celery应用举例 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考 ...