Dialogs

稳定性: 稳定

dialogs 模块提供了简单的对话框支持,可以通过对话框和用户进行交互。最简单的例子如下:

1alert("您好");

这段代码会弹出一个消息提示框显示"您好",并在用户点击"确定"后继续运行。稍微复杂一点的例子如下:

1var clear = confirm("要清除所有缓存吗?");
2if (clear) {
3    alert("清除成功!");
4}

confirm()会弹出一个对话框并让用户选择"是"或"否",如果选择"是"则返回 true。

需要特别注意的是,对话框在 ui 模式下不能像通常那样使用,应该使用回调函数或者Promise的形式。理解这一点可能稍有困难。举个例子:

1"ui";
2//回调形式
3confirm("要清除所有缓存吗?", function (clear) {
4    if (clear) {
5        alert("清除成功!");
6    }
7});
8//Promise形式
9confirm("要清除所有缓存吗?").then((clear) => {
10    if (clear) {
11        alert("清除成功!");
12    }
13});

dialogs.alert(title[, content, callback])

  • title {string} 对话框的标题。
  • content {string} 可选,对话框的内容。默认为空。
  • callback {Function} 回调函数,可选。当用户点击确定时被调用,一般用于 ui 模式。

显示一个只包含“确定”按钮的提示对话框。直至用户点击确定脚本才继续运行。

该函数也可以作为全局函数使用。

1alert("出现错误~", "出现未知错误,请联系脚本作者”);

在 ui 模式下该函数返回一个Promise。例如:

1"ui";
2alert("嘿嘿嘿").then(() => {
3    //当点击确定后会执行这里
4});

dialogs.confirm(title[, content, callback])

  • title {string} 对话框的标题。
  • content {string} 可选,对话框的内容。默认为空。
  • callback {Function} 回调函数,可选。当用户点击确定时被调用,一般用于 ui 模式。

显示一个包含“确定”和“取消”按钮的提示对话框。如果用户点击“确定”则返回 true ,否则返回 false

该函数也可以作为全局函数使用。

在 ui 模式下该函数返回一个Promise。例如:

1"ui";
2confirm("确定吗").then((value) => {
3    //当点击确定后会执行这里, value为true或false, 表示点击"确定"或"取消"
4});

dialogs.rawInput(title[, prefill, callback])

  • title {string} 对话框的标题。
  • prefill {string} 输入框的初始内容,可选,默认为空。
  • callback {Function} 回调函数,可选。当用户点击确定时被调用,一般用于 ui 模式。

显示一个包含输入框的对话框,等待用户输入内容,并在用户点击确定时将输入的字符串返回。如果用户取消了输入,返回 null。

该函数也可以作为全局函数使用。

1var name = rawInput("请输入您的名字", "小明");
2alert("您的名字是" + name);

在 ui 模式下该函数返回一个Promise。例如:

1"ui";
2rawInput("请输入您的名字", "小明").then((name) => {
3    alert("您的名字是" + name);
4});

当然也可以使用回调函数,例如:

1rawInput("请输入您的名字", "小明", (name) => {
2    alert("您的名字是" + name);
3});

dialogs.input(title[, prefill, callback])

等效于 eval(dialogs.rawInput(title, prefill, callback)), 该函数和 rawInput 的区别在于,会把输入的字符串用 eval 计算一遍再返回,返回的可能不是字符串。

可以用该函数输入数字、数组等。例如:

1var age = dialogs.input("请输入您的年龄", "18");
2// new Date().getYear() + 1900 可获取当前年份
3var year = new Date().getYear() + 1900 - age;
4alert("您的出生年份是" + year);

在 ui 模式下该函数返回一个Promise。例如:

1"ui";
2dialogs.input("请输入您的年龄", "18").then((age) => {
3    var year = new Date().getYear() + 1900 - age;
4    alert("您的出生年份是" + year);
5});

dialogs.prompt(title[, prefill, callback])

相当于 dialogs.rawInput();

dialogs.select(title, items, callback)

  • title {string} 对话框的标题。
  • items {Array} 对话框的选项列表,是一个字符串数组。
  • callback {Function} 回调函数,可选。当用户点击确定时被调用,一般用于 ui 模式。

显示一个带有选项列表的对话框,等待用户选择,返回用户选择的选项索引(0 ~ item.length - 1)。如果用户取消了选择,返回-1。

1var options = ["选项A", "选项B", "选项C", "选项D"];
2var i = dialogs.select("请选择一个选项", options);
3if (i >= 0) {
4    toast("您选择的是" + options[i]);
5} else {
6    toast("您取消了选择");
7}

在 ui 模式下该函数返回一个Promise。例如:

1"ui";
2dialogs.select("请选择一个选项", ["选项A", "选项B", "选项C", "选项D"]).then((i) => {
3    toast(i);
4});

dialogs.singleChoice(title, items[, index, callback])

  • title {string} 对话框的标题。
  • items {Array} 对话框的选项列表,是一个字符串数组。
  • index {number} 对话框的初始选项的位置,默认为 0。
  • callback {Function} 回调函数,可选。当用户点击确定时被调用,一般用于 ui 模式。

显示一个单选列表对话框,等待用户选择,返回用户选择的选项索引(0 ~ item.length - 1)。如果用户取消了选择,返回-1。

在 ui 模式下该函数返回一个Promise

dialogs.multiChoice(title, items[, indices, callback])

  • title {string} 对话框的标题。
  • items {Array} 对话框的选项列表,是一个字符串数组。
  • indices {Array} 选项列表中初始选中的项目索引的数组,默认为空数组。
  • callback {Function} 回调函数,可选。当用户点击确定时被调用,一般用于 ui 模式。

显示一个多选列表对话框,等待用户选择,返回用户选择的选项索引的数组。如果用户取消了选择,返回[]

在 ui 模式下该函数返回一个Promise

dialogs.build(properties)

  • properties {Object} 对话框属性,用于配置对话框。
  • 返回 {Dialog}

创建一个可自定义的对话框,例如:

1dialogs
2    .build({
3        //对话框标题
4        title: "发现新版本",
5        //对话框内容
6        content: "更新日志: 新增了若干了BUG",
7        //确定键内容
8        positive: "下载",
9        //取消键内容
10        negative: "取消",
11        //中性键内容
12        neutral: "到浏览器下载",
13        //勾选框内容
14        checkBoxPrompt: "不再提示",
15    })
16    .on("positive", () => {
17        //监听确定键
18        toast("开始下载....");
19    })
20    .on("neutral", () => {
21        //监听中性键
22        app.openUrl("https://www.autojs.org");
23    })
24    .on("check", (checked) => {
25        //监听勾选框
26        log(checked);
27    })
28    .show();

选项 properties 可供配置的项目为:

  • title {string} 对话框标题
  • titleColor {string} | {number} 对话框标题的颜色
  • buttonRippleColor {string} | {number} 对话框按钮的波纹效果颜色
  • icon {string} | {Image} 对话框的图标,是一个 URL 或者图片对象
  • content {string} 对话框文字内容
  • contentColor{string} | {number} 对话框文字内容的颜色
  • contentLineSpacing{number} 对话框文字内容的行高倍数,1.0 为一倍行高
  • items {Array} 对话框列表的选项
  • itemsColor {string} | {number} 对话框列表的选项的文字颜色
  • itemsSelectMode {string} 对话框列表的选项选择模式,可以为:
    • select 普通选择模式
    • single 单选模式
    • multi 多选模式
  • itemsSelectedIndex {number} | {Array} 对话框列表中预先选中的项目索引,如果是单选模式为一个索引;多选模式则为数组
  • positive {string} 对话框确定按钮的文字内容(最右边按钮)
  • positiveColor {string} | {number} 对话框确定按钮的文字颜色(最右边按钮)
  • neutral {string} 对话框中立按钮的文字内容(最左边按钮)
  • neutralColor {string} | {number} 对话框中立按钮的文字颜色(最左边按钮)
  • negative {string} 对话框取消按钮的文字内容(确定按钮左边的按钮)
  • negativeColor {string} | {number} 对话框取消按钮的文字颜色(确定按钮左边的按钮)
  • checkBoxPrompt {string} 勾选框文字内容
  • checkBoxChecked {boolean} 勾选框是否勾选
  • progress {Object} 配置对话框进度条的对象:
    • max {number} 进度条的最大值,如果为-1 则为无限循环的进度条
    • horizontal {boolean} 如果为 true, 则对话框无限循环的进度条为水平进度条
    • showMinMax {boolean} 是否显示进度条的最大值和最小值
  • cancelable {boolean} 对话框是否可取消,如果为 false,则对话框只能用代码手动取消
  • canceledOnTouchOutside {boolean} 对话框是否在点击对话框以外区域时自动取消,默认为 true
  • inputHint {string} 对话框的输入框的输入提示
  • inputPrefill {string} 对话框输入框的默认输入内容

通过这些选项可以自定义一个对话框,并通过监听返回的 Dialog 对象的按键、输入事件来实现交互。下面是一些例子。

模拟 alert 对话框:

1dialogs
2    .build({
3        title: "你好",
4        content: "今天也要元气满满哦",
5        positive: "好的",
6    })
7    .show();

模拟 confirm 对话框:

1dialogs
2    .build({
3        title: "你好",
4        content: "请问你是笨蛋吗?",
5        positive: "是的",
6        negative: "我是大笨蛋",
7    })
8    .on("positive", () => {
9        alert("哈哈哈笨蛋");
10    })
11    .on("negative", () => {
12        alert("哈哈哈大笨蛋");
13    })
14    .show();

模拟单选框:

1dialogs
2    .build({
3        title: "单选",
4        items: ["选项1", "选项2", "选项3", "选项4"],
5        itemsSelectMode: "single",
6        itemsSelectedIndex: 3,
7    })
8    .on("single_choice", (index, item) => {
9        toast("您选择的是" + item);
10    })
11    .show();

"处理中"对话框:

1var d = dialogs
2    .build({
3        title: "下载中...",
4        progress: {
5            max: -1,
6        },
7        cancelable: false,
8    })
9    .show();
10
11setTimeout(() => {
12    d.dismiss();
13}, 3000);

输入对话框:

1dialogs
2    .build({
3        title: "请输入您的年龄",
4        inputPrefill: "18",
5    })
6    .on("input", (input) => {
7        var age = parseInt(input);
8        toastLog(age);
9    })
10    .show();

使用这个函数来构造对话框,一个明显的不同是需要使用回调函数而不能像 dialogs 其他函数一样同步地返回结果;但也可以通过 threads 模块的方法来实现。例如显示一个输入框并获取输入结果为:

1var input = threads.disposable();
2dialogas
3    .build({
4        title: "请输入您的年龄",
5        inputPrefill: "18",
6    })
7    .on("input", (text) => {
8        input.setAndNotify(text);
9    })
10    .show();
11var age = parseInt(input.blockedGet());
12tosatLog(age);