~~~
(function (window, undefined) {
// 調用 schema 的封裝
function _invoke(action, data, callback) {
// 拼裝 schema 協議
var schema = 'myapp://utils/' + action;
// 拼接參數
schema += '?a=a';
var key;
for (key in data) {
if (data.hasOwnProperty(key)) {
schema += '&' + key + data[key]
}
}
// 處理 callback
var callbackName = '';
if (typeof callback === 'string') {
callbackName = callback
} else {
callbackName = action + Date.now();
window[callbackName] = callback
}
schema += 'callback=callbackName';
// 觸發
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = schema ; // 重要!
var body = document.body;
body.appendChild(iframe);
setTimeout(function () {
body.removeChild(iframe);
iframe = null
})
}
// 暴露到全局變量
window.invoke = {
share: function (data, callback) {
_invoke('share', data, callback)
},
scan: function (data, callback) {
_invoke('scan', data, callback)
},
login: function (data, callback) {
_invoke('login', data, callback)
}
}
})(window);
~~~
~~~
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
<title>Document</title>
</head>
<body>
<button id="btn1">掃一掃</button>
<button id="btn2">分享</button>
<script type="text/javascript" src="./invoke.js"></script>
<script type="text/javascript">
// function invokeScan() {
// window['_invoke_scan_callback_'] = function (result) {
// alert(result)
// }
// var iframe = document.createElement('iframe')
// iframe.style.display = 'none'
// // iframe.src = 'weixin://dl/scan' // 重要!
// iframe.src = 'weixin://dl/scan?k1=v1&k2=v2&k3=v3&callback=_invoke_scan_callback_'
// var body = document.body
// body.appendChild(iframe)
// setTimeout(function () {
// body.removeChild(iframe)
// iframe = null
// })
// }
document.getElementById('btn1').addEventListener('click', function () {
// invokeScan()
window.invoke.scan({}, function () {})
})
document.getElementById('btn2').addEventListener('click', function () {
window.invoke.share({
title: 'xxx',
content: 'yyy'
}, function (result) {
if (result.errno === 0) {
alert('分享成功')
} else {
alert(result.message)
}
})
})
</script>
</body>
</html>
~~~
- 空白目錄
- 第1章 課程介紹
- 1-2 架構
- 第2章 ES6 語法
- 2-1 開始
- 2-2 模塊化 - 語法
- 2-3 模塊化 - babel-new-part1
- 2-4 模塊化 - babel-new-part2
- 2-5 模塊化 - webpack
- 2-6 模塊化 - rollup介紹
- 2-7 模塊化 - rollup安裝
- 2-8 模塊化 - 總結
- 2-9 class - JS構造函數
- 2-10 class - 基本語法
- 2-11 class - 繼承
- 2-12 class - 總結
- 2-13 promise-callback-hell
- 2-14 promise - 語法
- 2-15 promise - 總結
- 2-16 常用功能演示
- 2-17 常用功能 - 代碼演示
- 2-18 常用功能 - 總結
- 第3章 原型
- 第4章 異步
- 4-1 開始
- 4-2 單線程 - 介紹-1
- 4-3 單線程 - 介紹-2
- 4-4 單線程 - 異步-1
- 4-5 單線程 - 異步-2
- 4-6 單線程 - 總結
- 4-7 event-loop - 演示
- 4-8 event-loop - 代碼演示
- 4-9 event-loop - 總結
- 4-10 jquery-deferred - 介紹
- 4-11 jquery-deferred -
- 4-12 jquery-deferred - 應用-1
- 4-13 jquery-deferred - 應用-2
- 4-14 jquery-deferred - 應用3
- 4-15 jquery-deferred - 應用4
- 4-16 jquery-deferred - 總結
- 4-17 promise - 語法回顧
- 4-18 promise - 捕獲異常-1
- 4-19 promise - 捕獲異常-2
- 4-20 promise - 串聯
- 4-21 promise-all-race
- 4-22 promise - 標準總結
- 4-23 promise - 總結
- 4-24 async-await-1
- 4-25 async-await-2
- 4-26 async-await - 總結
- 4-27 總結
- 第5章 虛擬 DOM
- 第6章 MVVM 和 vue
- 第7章 組件化和 React
- 第8章 hybrid
- 8-1 開始
- 8-2 hybrid是什么 - 開始
- 8-3 hybrid是什么 - webview
- 8-4 hybrid是什么 - file協議
- 8-5 hybrid是什么 - 具體實現和總結
- 8-6 hybrid更新流程
- 8-7 hybrid 和 h5 的比較
- 8-8 JS和客戶端通訊 - 開始
- 8-9 JS和客戶端通訊 - schema協議-1
- 8-10 JS和客戶端通訊 - schema協議-2
- 8-11 JS和客戶端通訊 - schema封裝-1
- 8-12 JS和客戶端通訊 - schema封裝-2
- 8-13 JS和客戶端通訊 - 總結
- 8-14 總結
- 第9章 課程總結