UI与脚本互通交互(高级)
说明
提示
- 本章节主要讲述ui.js 与 脚本或者H5,三者互通交互
- 该功能从EC 安卓 11.15.0+才能使用
如何使用
- 在idea工程中新建项目,自带的就有交互的实例
- 如果新建vue项目,可以看到脚本更新ui.js再更新到h5页面的案例
ui.js->脚本调用的流程
提示
- 脚本注册一个函数给ui.js,函数是 registeScriptFunctionToUI
- ui.callScriptRegisteFunction 调用到脚本注册的函数
ui.js 文件内容
function main() {
// 该模板是VUE+ELEMENTUI组成,你可以到 https://uc.ieasyclick.com/designer 在线拖拽UI
// 然后复制到 HTML文件中即可使用,简单方便
// 参数设置 = main.html
// 使用说明 = intr.html
// 其他 = other.html
ui.layout("参数设置", "main.html");
// 注册UI函数与脚本互相交互的例子
regFuncToScript()
}
function regFuncToScript() {
// 注册一个 uihello 函数,给脚本使用,让脚本能够调用到这里
ui.registeFunctionToScript("uihello", function (data) {
logd("我是registeFunctionToScript的打印:" + data)
// 更新到vue的模板 name的值
let up = `updateUserName('${data}')`
// ui.quickCallJs 是新增的函数,具体请看文档
ui.quickCallJs("参数设置", up)
// 调用到 vue中
return "我是UI返回的值"
})
// 在脚本运行的情况下
// 3秒后调用 scripthello 函数
// 脚本不运行 调用不到 scripthello 函数
ui.run(3000, function () {
ui.callScriptRegisteFunction("scripthello", "123")
})
}
main();
main.js脚本内容
function main() {
//开始再这里编写代码了!!
toast("Hello World");
var name = readConfigString("name");
logd("姓名: " + name);
// 注册函数给UI调用的例子
regFuncToUI();
// 调用UI uihello 函数例子
let uih = callUIRegisteFunction("uihello", "-date-" + new Date());
logd("调用 uihello 函数结果:" + uih)
home();
}
function regFuncToUI() {
// 注册一个scripthello函数,UI可以调用
registeScriptFunctionToUI("scripthello", function (data) {
logd("我是 regFuncToUI 的打印:" + data)
return "" + new Date();
})
// 在合适的时候移出注册的函数,一般不移出已不会影响
//removeAllUIToScriptFunc();
//removeAllScriptToUIFunc()
}
main();
脚本->ui.js->H5的调用流程
提示
- H5包含一段可执行的js代码,例如updateUserName函数
- ui.js 注册函数给脚本调用, 函数是 ui.registeFunctionToScript
- 脚本运行的时候,函数是 callUIRegisteFunction
main.js脚本内容
function main() {
//开始再这里编写代码了!!
toast("Hello World");
var name = readConfigString("name");
logd("姓名: " + name);
// 注册函数给UI调用的例子
regFuncToUI();
// 调用UI uihello 函数例子
let uih = callUIRegisteFunction("uihello", "-date-" + new Date());
logd("调用 uihello 函数结果:" + uih)
home();
}
function regFuncToUI() {
// 注册一个scripthello函数,UI可以调用
registeScriptFunctionToUI("scripthello", function (data) {
logd("我是 regFuncToUI 的打印:" + data)
return "" + new Date();
})
// 在合适的时候移出注册的函数,一般不移出已不会影响
//removeAllUIToScriptFunc();
//removeAllScriptToUIFunc()
}
main();
ui.js内容
function main() {
// 该模板是VUE+ELEMENTUI组成,你可以到 https://uc.ieasyclick.com/designer 在线拖拽UI
// 然后复制到 HTML文件中即可使用,简单方便
// 参数设置 = main.html
// 使用说明 = intr.html
// 其他 = other.html
ui.layout("参数设置", "main.html");
// 注册UI函数与脚本互相交互的例子
regFuncToScript()
}
function regFuncToScript() {
// 注册一个 uihello 函数,给脚本使用,让脚本能够调用到这里
ui.registeFunctionToScript("uihello", function (data) {
logd("我是registeFunctionToScript的打印:" + data)
// 更新到vue的模板 name的值
let up = `updateUserName('${data}')`
// ui.quickCallJs 是新增的函数,具体请看文档
ui.quickCallJs("参数设置", up)
// 调用到 vue中
return "我是UI返回的值"
})
// 在脚本运行的情况下
// 3秒后调用 scripthello 函数
// 脚本不运行 调用不到 scripthello 函数
ui.run(3000, function () {
ui.callScriptRegisteFunction("scripthello", "123")
})
}
main();
H5文件内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- import CSS -->
<link rel="stylesheet" href="/css/elementui.css">
</head>
<body>
<div id="app">
<el-tag type="success">这个是由elementui+vue离线版本创建的模板,仅仅作为演示使用</el-tag>
<el-form style="margin-top: 10px" :rules="rules" ref="form" :model="form" label-width="80px" size="mini">
<el-form-item label="卡密" prop="cardNo">
<el-input v-model="form.cardNo"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="form.sex" size="medium">
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" @click="submitForm">保存</el-button>
<el-button type="primary" @click="runScript">运行脚本</el-button>
</el-form-item>
</el-form>
</div>
</body>
<!-- import Vue before Element -->
<script src="/htmljs/vue2.7.16.js"></script>
<!-- import JavaScript -->
<script src="/htmljs/elementui2.15.14.js"></script>
<script src="/htmljs/form-create.min.js"></script>
<script>
// 这个可以被ui.js调用,然后更新vue的数据
function updateUserName(data) {
vueInstance.updateUserName(data);
}
let vueInstance = new Vue({
el: '#app',
data: function () {
return {
form: {
name: '',
cardNo: '',
sex: '',
},
rules: {
name: [
{required: true, message: '请输入姓名', trigger: 'blur'},
],
cardNo: [
{required: true, message: '请输入卡密', trigger: 'blur'},
],
sex: [
{required: true, message: '请选择性别', trigger: 'blur'},
],
}
}
},
created() {
this.resetValue()
},
methods: {
updateUserName(data) {
console.log("updateUserName " + data)
this.form.name = data;
},
resetValue() {
let name = window.ec.getConfig("name");
let sex = window.ec.getConfig("sex");
let cardNo = window.ec.getConfig("cardNo");
this.form.name = name
this.form.cardNo = cardNo
this.form.sex = sex
},
save() {
window.ec.saveConfig("name", this.form.name);
window.ec.saveConfig("cardNo", this.form.cardNo);
window.ec.saveConfig("sex", this.form.sex);
this.$notify.info({
title: '消息',
duration: 2000,
message: '保存参数成功'
});
},
submitForm() {
this.$refs.form.validate((valid) => {
if (valid) {
this.save();
} else {
this.$notify.error({
title: '错误',
message: '参数不完整'
});
return false;
}
});
},
runScript() {
window.ec.start()
},
}
})
</script>
</html>
ui.js可用函数
ui.registeFunctionToScript 注入函数给脚本用
- 注册一个函数,给脚本调用
- 适配EC 安卓11.15.0+
- @param funcName 函数名称
- @param callback 函数回调
- @return
{boolean}
true 代表成功,false 代表失败
// ui.js 文件
function main() {
ui.layout("参数设置", "main.html");
ui.registeFunctionToScript("uihello", function (data) {
logd("我是registeFunctionToScript的打印:" + data)
// 更新到vue的模板 name的值
let up = `updateUserName('${data}')`
// ui.quickCallJs 是新增的函数,具体请看文档
ui.quickCallJs("参数设置", up)
// 调用到 vue中
return "我是UI返回的值"
})
}
main();
ui.callScriptRegisteFunction 调用脚本注册的函数
- 调用脚本注册的函数
- 适配EC 安卓11.15.0+
- @param funcName 函数名称
- @param data 要传递的数据
- @return
{string}
返回的数据
// ui.js 文件
function main() {
// 调用脚本的注入过来的 scripthello 函数
let a = ui.callScriptRegisteFunction("scripthello", "hello")
logd(a)
}
main();
ui.quickCallJs 调用H5页面的js代码
- 调用ui中的webview的js代码
- 适配EC 安卓11.15.0+
- 这个会根据标签,自动查找页面是否是webview,然后调用
- @param name 页面标签名称,和 ui.layout的name保持一致
- @param jscode js 代码
- @return
{string}
返回的数据
// ui.js 文件
function main() {
let code = 'alert("123")';
let a = ui.quickCallJs("参数设置",code)
logd(a)
}
main();
ui.removeFunctionToScript 移出UI注入给脚本函数
- 移出UI注入给脚本函数
- @param funcName 函数名称
- 适配EC 安卓11.15.0+
- @return
{boolean}
true 代表成功,false 代表失败
// ui.js 文件
function main() {
ui.removeFunctionToScript("uihello")
}
main();
ui.removeAllScriptToUIFunc 移出UI注入给脚本函数
- 移出所有脚本注册给UI的函数
- 适配EC 11.15.0+
- @return
{boolean}
true 成功
// ui.js 文件
function main() {
ui.removeAllScriptToUIFunc()
}
main();