From 190aa052a781c122fae777637bf2a4abe4e26c8d Mon Sep 17 00:00:00 2001 From: shylinux Date: Fri, 23 Oct 2020 11:23:12 +0800 Subject: [PATCH] add user.agent --- frame.js | 2 +- lib/user.js | 26 +++++++++++++++++++++++++- pane/Header.js | 26 ++++++++++++++++++++++++++ plugin/input.js | 8 ++++---- plugin/local/wiki/feel.js | 5 +++++ plugin/local/wiki/word.js | 8 +++++++- plugin/table.js | 29 +++++++++++++++++++++-------- 7 files changed, 89 insertions(+), 15 deletions(-) diff --git a/frame.js b/frame.js index e84d4612..f13473b3 100644 --- a/frame.js +++ b/frame.js @@ -343,7 +343,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, typeof cb == "function" && cb(msg) if (silent) { return } - var display = (msg.Option("_display")||meta.feature.display||"table.js") + var display = meta.feature.display || "table.js" display.indexOf("/") == 0 || (display = "/plugin/"+display) display.endsWith(".js") || (display += ".js") diff --git a/lib/user.js b/lib/user.js index a14a7608..ddb75463 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,9 +1,33 @@ -var user = Volcanos("user", {help: "用户模块", +var user = Volcanos("user", {help: "用户模块", agent: { + getLocation: function(cb) { + typeof cb == "function" && cb({name: "some"}) + }, + openLocation: function(msg) { + window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option("text"))+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option("text"))) + }, + scanQRCode: function(cb) { + typeof cb == "function" && cb({name: "some"}) + }, + chooseImage: function(cb) { + typeof cb == "function" && cb([]) + }, + }, alert: function(text) {alert(JSON.stringify(text))}, confirm: function(text) {return confirm(JSON.stringify(text))}, prompt: function(text, cb, def, silent) {(text = silent? def: prompt(text, def||"")) != undefined && typeof cb == "function" && cb(text); return text}, reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()}, title: function(text) {return text && (document.title = text), document.title}, + scan: function(str) { + try { var value = JSON.parse(str) } catch(e) { try { + var value = {"type": "url", "text": str} + var ls = str.split("?"); if (ls.length > 1) { ls = ls[1].split("&") + for (var i = 0; i < ls.length; i++) { var vs = ls[i].split("=") + value[vs[0]] = decodeURIComponent(vs[1]) + } + } + } catch(e) { } } + return value + }, copy: function(can, text) { var input = can.page.Append(can, document.body, [{type: "input", value: text}]).first diff --git a/pane/Header.js b/pane/Header.js index 03ce9310..173c5e36 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -1,4 +1,30 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { + can.user.isWeiXin && can.onimport.weixin(can) + }, + weixin: function(can) { can.run({}, ["action", "wx"], function(msg) { + can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) { + can.user.agent = { __proto__: can.user.agent, + getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { + typeof cb == "function" && cb({latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) }) + } }) }, + openLocation: function(msg) { wx.openLocation({ + latitude: parseInt(msg.Option("latitude"))/100000, + longitude: parseInt(msg.Option("longitude"))/100000, + name: msg.Option("name"), address: msg.Option("text"), + scale: msg.Option("scale")||14, infoUrl: msg.Option("link"), + }) }, + scanQRCode: function(cb) { wx.scanQRCode({ needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { + typeof cb == "function" && cb(can.user.scan(res.resultStr)) + } }) }, + chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) { + typeof cb == "function" && cb(res.localIds) + } }) }, + } + wx.config({debug: msg.Option("debug") == "true", jsApiList: can.core.Item(can.user.agent), + nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"), + appId: msg.Option("appid"), signature: msg.Option("signature"), + }) + }) }) }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { diff --git a/plugin/input.js b/plugin/input.js index 26e4565c..ee65c0a0 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -20,14 +20,14 @@ Volcanos("onaction", {help: "控件交互", list: [], if (event.target.tagName == "SELECT") { can.run(event) } }, ondblclick: function(event, can) { - if (can.Conf("type") == "textarea") { event.target.setSelectionRange(0, -1) } if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) } + if (can.Conf("type") == "textarea") { event.target.setSelectionRange(0, -1) } }, onclick: function(event, can) { var msg = can.sup.request(event) // 插件回调 - var name = can.Conf("name") + var name = can.Conf("name"), action = can.Conf("action") var sub = can.sup._outputs && can.sup._outputs[can.sup._outputs.length-1] - var cb = sub && sub.onaction && sub.onaction[name] + var cb = sub && sub.onaction && (sub.onaction[action] || sub.onaction[name]) if (typeof cb == "function") { return cb(event, sub, name) } // 交互回调 @@ -39,7 +39,7 @@ Volcanos("onaction", {help: "控件交互", list: [], } // 控件回调 - var cb = can.onaction[name] + var cb = can.onaction[action] || can.onaction[name] if (typeof cb == "function") { return cb(event, can, name) } // 通用回调 diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index f7b22e52..6920c87a 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -84,6 +84,11 @@ Volcanos("onaction", {help: "组件菜单", list: [ ["高度", 100, 200, 400, 600, 800], ["倍速", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], ], + chooseImage: function(event, can) { var msg = can.request(event) + can.user.agent.chooseImage(function(list) { can.core.List(list, function(item) { + can.page.Append(can, can._output, [{img: item, height: 200}]) + }) }) + }, upload: function(event, can) { can.user.upload(event, can) }, "上一页": function(event, can, key, value) { can.begin > 0 && (can.begin -= can.limit, can.onimport._page(can, can.list, can.begin, can.limit)) diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 24105b0c..335159b8 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,6 +1,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { target.innerHTML = "" if (msg.Option("_display") == "table") { - return can.onappend.table(can, msg, target, "table") + return can.onappend.table(can, msg, target, "table", function(value, key) { + return {text: [value, "td"], onclick: function(event) { + can.sup.onaction.change(event, can.sup, key, value, function(msg) { + can.run(event) + }) + }} + }) } target.innerHTML = msg.Result() can.page.Select(can, target, ".story", function(item) { var data = item.dataset diff --git a/plugin/table.js b/plugin/table.js index f98ce834..b014b5cf 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -94,14 +94,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, _table: function(can, value, key, index, line, array) { return {type: "td", inner: value, click: function(event) { var target = event.target - if (target.tagName == "INPUT" && target.type == "button") { var msg = can.sup.request(event) - msg.Option(can.Option()); if (key == "value") { - can.core.List(array, function(item, index) { - msg.Option(item.key, item.value) - }) - } else { - msg.Option(line) - } + if (target.tagName == "INPUT" && target.type == "button") { var msg = can.sup.request(event); msg.Option(can.Option()) + key == "value"? can.core.List(array, function(item, index) { msg.Option(item.key, item.value) }): msg.Option(line) var cb = can.onaction[target.name]; return typeof cb == "function"? cb(event, can, target.name): can.sup.onaction.input(event, can.sup, target.name, function(msg) { @@ -206,6 +200,25 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, }) Volcanos("onaction", {help: "控件交互", list: [], + getLocation: function(event, can, cmd) { var msg = can.request(can) + can.user.agent.getLocation(function(res) { + var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) + can.run(event, ["action", cmd].concat(arg)) + }) + }, + openLocation: function(event, can) { var msg = can.request(can) + can.user.agent.openLocation(msg) + }, + scanQRCode0: function(event, can) { var msg = can.request(can) + can.user.agent.scanQRCode() + }, + scanQRCode: function(event, can, cmd) { var msg = can.request(can) + can.user.agent.scanQRCode(function(res) { + var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) + can.run(event, ["action", cmd].concat(arg)) + }) + }, + "清空": function(event, can, name) { can._output.innerHTML = "" }, "结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) { can.run({})