173 lines
4.0 KiB
JavaScript
173 lines
4.0 KiB
JavaScript
|
|
|
|||
|
|
if (!Object.keys) {
|
|||
|
|
Object.keys = (function() {
|
|||
|
|
'use strict';
|
|||
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
|||
|
|
hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
|
|||
|
|
dontEnums = [
|
|||
|
|
'toString',
|
|||
|
|
'toLocaleString',
|
|||
|
|
'valueOf',
|
|||
|
|
'hasOwnProperty',
|
|||
|
|
'isPrototypeOf',
|
|||
|
|
'propertyIsEnumerable',
|
|||
|
|
'constructor'
|
|||
|
|
],
|
|||
|
|
dontEnumsLength = dontEnums.length;
|
|||
|
|
|
|||
|
|
return function(obj) {
|
|||
|
|
if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {
|
|||
|
|
throw new TypeError('Object.keys called on non-object');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var result = [], prop, i;
|
|||
|
|
|
|||
|
|
for (prop in obj) {
|
|||
|
|
if (hasOwnProperty.call(obj, prop)) {
|
|||
|
|
result.push(prop);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (hasDontEnumBug) {
|
|||
|
|
for (i = 0; i < dontEnumsLength; i++) {
|
|||
|
|
if (hasOwnProperty.call(obj, dontEnums[i])) {
|
|||
|
|
result.push(dontEnums[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
}());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!Array.prototype.reduce) {
|
|||
|
|
Object.defineProperty(Array.prototype, 'reduce', {
|
|||
|
|
value: function(callback /*, initialValue*/) {
|
|||
|
|
if (this === null) {
|
|||
|
|
throw new TypeError( 'Array.prototype.reduce ' +
|
|||
|
|
'called on null or undefined' );
|
|||
|
|
}
|
|||
|
|
if (typeof callback !== 'function') {
|
|||
|
|
throw new TypeError( callback +
|
|||
|
|
' is not a function');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var o = Object(this);
|
|||
|
|
|
|||
|
|
var len = o.length >>> 0;
|
|||
|
|
|
|||
|
|
var k = 0;
|
|||
|
|
var value;
|
|||
|
|
|
|||
|
|
if (arguments.length >= 2) {
|
|||
|
|
value = arguments[1];
|
|||
|
|
} else {
|
|||
|
|
while (k < len && !(k in o)) {
|
|||
|
|
k++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (k >= len) {
|
|||
|
|
throw new TypeError( 'Reduce of empty array ' +
|
|||
|
|
'with no initial value' );
|
|||
|
|
}
|
|||
|
|
value = o[k++];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
while (k < len) {
|
|||
|
|
if (k in o) {
|
|||
|
|
value = callback(value, o[k], k, o);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
k++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 自定义
|
|||
|
|
window.messageHandlers = ['route', 'closeWebview', 'getUserInfo', 'setLoading', 'request','modal', 'share', 'init', 'openBrowser', 'updateActivity', 'toast'];
|
|||
|
|
var EPAL = window.EPAL = {};
|
|||
|
|
var execTimeObj = {};
|
|||
|
|
window.NATIVE_CALLBACK = {};
|
|||
|
|
var originModules = window.webkit.messageHandlers;
|
|||
|
|
|
|||
|
|
function createCb (method, callbacks) {
|
|||
|
|
var cb = window.NATIVE_CALLBACK;
|
|||
|
|
var funPath = 'window.NATIVE_CALLBACK.' + method;
|
|||
|
|
|
|||
|
|
// 初始化
|
|||
|
|
var methodCb = cb[method];
|
|||
|
|
if(Object.prototype.toString.call(methodCb) !== '[object Object]') {
|
|||
|
|
window.NATIVE_CALLBACK[method] = methodCb = {};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 执行次数
|
|||
|
|
var execTime = execTimeObj[method];
|
|||
|
|
if(execTime) {
|
|||
|
|
execTime++
|
|||
|
|
} else {
|
|||
|
|
execTime = 1;
|
|||
|
|
}
|
|||
|
|
execTimeObj[method] = execTime;
|
|||
|
|
|
|||
|
|
// 遍历所有回调方法
|
|||
|
|
return Object.keys(callbacks).reduce((obj, key) => {
|
|||
|
|
var targetKey = key + execTime;
|
|||
|
|
|
|||
|
|
// 映射赋值函数
|
|||
|
|
window.NATIVE_CALLBACK[method][targetKey] = methodCb[targetKey] = function (resp) {
|
|||
|
|
callbacks[key](resp);
|
|||
|
|
}
|
|||
|
|
// 定义全局回调字符串
|
|||
|
|
obj[key] = funPath + '.' + targetKey;
|
|||
|
|
return obj
|
|||
|
|
}, {})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function nativeRun (method, args) {
|
|||
|
|
var resolve = args.success,
|
|||
|
|
reject = args.error;
|
|||
|
|
|
|||
|
|
// 支持扩展回调函数,如分享场景
|
|||
|
|
var custom = Object.keys(args).reduce((obj, key) => {
|
|||
|
|
const fun = args[key];
|
|||
|
|
if (fun != null && fun instanceof Function) {
|
|||
|
|
obj[key] = fun;
|
|||
|
|
}
|
|||
|
|
return obj;
|
|||
|
|
}, {});
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 创建初始callbacks
|
|||
|
|
var originCb = {
|
|||
|
|
success: resolve,
|
|||
|
|
error: reject,
|
|||
|
|
};
|
|||
|
|
for(var attr in custom) {
|
|||
|
|
originCb[attr] = custom[attr];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var nativeCb = createCb(method, originCb);
|
|||
|
|
for (var key in nativeCb) {
|
|||
|
|
args[key] = nativeCb[key];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(!originModules[method] || !originModules[method].postMessage) {
|
|||
|
|
throw new Error('hi man:' + method + ' was not found');
|
|||
|
|
}
|
|||
|
|
originModules[method].postMessage(JSON.stringify(args))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function hanldeModule () {
|
|||
|
|
messageHandlers.forEach(handler => {
|
|||
|
|
EPAL[handler] = function(args) {
|
|||
|
|
return nativeRun(handler, args || {});
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
hanldeModule();
|