高德打车对接loader.js文件的实现
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文件的实现的更多相关文章
- webpack学习笔记一:安装webpack、webpack-dev-server、内存加载js和html文件、loader处理非js文件
一 .webpack学习环境准备: 1:window系统 2:安装node.js 官方网址 下载好后下一步下一步安装即可 安装步骤略过....... 3:nrm的安装 打开cmd命令控制台 输入:n ...
- ExtJS4.x动态加载js文件
动态加载js文件是ext4.x的一个新特性,可以有效的减少浏览器的压力,提高渲染速度.如动态加载自定义组件 1.在js/extjs/ux目录下,建立自定义组件的js文件. 2.编写MyWindow.j ...
- Ext JS学习第十天 Ext基础之动态加载JS文件(补充)
此文用来记录学习笔记: •Ext4.x版本提供的一大亮点就是Ext.Loader这个类的动态加载机制!只要遵循路径规范,即可动态加载js文件,方便把自己扩展组件动态加载进来,并且减轻浏览器的压力. • ...
- Extjs学习----------动态载入js文件(减轻浏览器的压力)
动态载入js文件能够减轻浏览器的压力,本例使用了Ext.window.Window组件,该组件的学习地址:http://blog.csdn.net/z1137730824/article/detail ...
- webpack.config.js文件的高级配置
一.多个入口文件之前我们配置的都是 一个入口 var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.Co ...
- vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题
vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题 今天下载了一个开源项目一直运行不了,折腾了半天才找到问题所在,config ...
- .38-浅析webpack源码之读取babel-loader并转换js文件
经过非常非常长无聊的流程,只是将获取到的module信息做了一些缓存,然后生成了loaderContext对象. 这里上个图整理一下这节的流程: 这一节来看webpack是如何将babel-loade ...
- 多个JS文件性能优化
页面中引入的JS文件是阻塞式加载的,这样会影响页面性能.以下是JS文件性能优化方法: 一:将所有的<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在 ...
- 从零开始开发一个vue组件打包并发布到npm (把vue组件打包成一个可以直接引用的js文件)
自己写的组件 有的也挺好的,为了方便以后用自己再用或者给别人用,把组件打包发布到npm是最好不过了,本次打包支持 支持正常的组件调用方式,也支持Vue.use, 也可以直接引用打包好的js文件, 配合 ...
随机推荐
- Yali 19 - 8 - 6 test T2 猪国(pig) 题解
T2 猪国 题⽬描述 猪国是⼀个由 \(n\) 个城市组成的国家. 国王意识到了"要致富,先修路"这句话的重要性,它决定⼤规模修路.不巧的是,猪国的 猪们不太会⼯程,于是只能请隔壁 ...
- 【树形dp】【CF161D】distance on a tree + 【P1352】没有上司的舞会
T1题面: 输入点数为N一棵树 求树上长度恰好为K的路径个数 (n < 1e5, k < 500) 这是今天的考试题,也是一道假的紫题,因为我一个根本不会dp的蒟蒻只知道状态就一遍A掉了- ...
- sqli-labs-master less02-04
sql注入0-4关只存在注入方式的区别 第一关 ?id=1'--+ ' 第二关 ?id=1--+ 无 第三关 ?id=1')--+ ') 第四关 ?id=1")--+ ") 过程同 ...
- 生成微博授权URL及回调地址
1.创建apps/oauth模块进行oauth认证 '''2.1 在apps文件夹下新建应用: oauth''' cd syl/apps python ../manage.py startapp oa ...
- MySQL——一致性非锁定读(快照读)&MVCC
MySQL--一致性非锁定读(快照读) MySQL数据库中读分为一致性非锁定读.一致性锁定读 一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现. 一致性锁定读(当前读) ...
- 使用matpoltlib读取csv显示图表范例
import os import numpy as np import matplotlib.pyplot as plt root = os.getcwd() list_data = [os.path ...
- (十八)面向流水线的设计:CPU的一心多用
一.单指令周期 由前可知,一条CPU指令的执行有三个步骤:指令读取.指令译码.指令执行.由于这个过程受CPU时钟的控制,如果我们将这个过程安排在一个CPU时钟周期内执行,这种设计思路就叫单 ...
- 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型
Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一. P ...
- 第11.8节 Python正则表达式的重复匹配模式及元字符“?”、 “*”、 “+”功能介绍
符号"?".""."+"这三个元字符修饰符在Python中都表示重复匹配的模式,即要求匹配的字符串满足重复次数的要求,但具体重复次数要求不同 ...
- HDFS客户端操作(JAVA代码)
环境准备 windows需要配置hadoop的windows下的依赖 安装包地址: 链接:https://pan.baidu.com/s/1QtbH-x-S0QytkmaoSosdEw 提取码:2kt ...