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. DNS系列—DNS简介

    DNS是什么? 如果了解互联网主机之间是用IP地址来进行通信的话,有了这个认识的前提,我们来聊一下什么是DNS.一个IP地址有十几个字符那么长,和手机号码长度差不多,我们怎么记住这些我们想要访问的主机 ...

  2. Meetings S 题解

    题目描述 题目链接 有两个牛棚位于一维数轴上的点 \(0\) 和 \(L\) 处.同时有 \(N\) 头奶牛位于数轴上不同的位置(将牛棚和奶牛看作点).每头奶牛 \(i\) 初始时位于某个位置 \(x ...

  3. Contest 1445

    A \(a\) 中第 \(i\) 小的配 \(b\) 中第 \(i\) 大的. 限制相同,这样配最平均. 时间复杂度 \(O\left(tn\log n\right)\). B 最终的一百名至少是第一 ...

  4. 2017年第八届蓝桥杯【C++省赛B组】B、C、D、H 题解

    可能因为我使用暴力思维比较少,这场感觉难度不低. B. 等差素数列 #暴力 #枚举 题意 类似:\(7,37,67,97,127,157\) 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列 ...

  5. 网络篇:朋友面试之TCP/IP,回去等通知吧

    前言 最近和一同学聊天,他想换工作,然后去面了一家大厂.当时,他在简历上写着精通TCP/IP,本着对TCP协议稍有了解,面试官也不会深问的想法,就写了精通二字.没想到,大意了 关注公众号,一起交流,微 ...

  6. CentOS下设置ipmi

    1.载入支持 ipmi 功能的系统模块 modprobe ipmi_msghandler modprobe ipmi_devintf modprobe ipmi_poweroff modprobe i ...

  7. 「考试」noip模拟9,11,13

    9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...

  8. 第一次个人编程作业:我的分数我做主 - 软件工程与 UML

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE ...

  9. 老猿学5G:3GPP 5G规范中的URI资源概念

    ☞ ░ 前往老猿Python博文目录 ░ 说明: 本文参考3GPP29.501<Principles and Guidelines for Services Definition>结合笔者 ...

  10. 第8.20节 Python中限制动态定义实例属性的白名单:__slots__

    一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...