对话框
对话框是一个弹出在应用程序主内容上方的较小内容面板。对话框通常用于向用户询问信息,或通知或警告用户。对话框,与其他所有模态框一样,是所谓的“临时视图”的一部分。
对话框只能通过使用JavaScript来打开。所以让我们看看与对话框相关联的应用程序方法。
对话框应用方法
让我们看看与对话框相关的方法:
app.dialog.create(参数)- 创建对话框实例
- 参数 - 对象. 对象包含对话框参数
方法返回创建的对话框实例
app.dialog.destroy(el)- 销毁对话框实例
- el - HTMLElement或字符串(使用 CSS 选择器) 或对象. 要销毁的对话框元素或对话框实例。
app.dialog.get(el)- 通过HTML元素获取对话框实例
- el - HTMLElement或字符串(使用CSS选择器)。对话框元素。
方法返回对话框实例
app.dialog.open(el, animate)- 打开对话框
- el - HTMLElement或字符串(使用CSS选择器)。要打开的对话框元素。
- animate - 布尔值. 使用动画打开对话框。
方法返回对话框实例
app.dialog.close(el, animate)- 关闭对话框
- el - HTMLElement或字符串(使用CSS选择器)。要关闭的对话框元素。
- animate - 布尔值. 使用动画关闭对话框。
方法返回对话框实例
对话框参数
现在让我们看看创建对话框所需的可用参数列表:
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
el | HTMLElement 字符串 | 对话框元素。如果您的HTML中已经有一个对话框元素,并且您想使用这个元素创建新的实例,则很有用 | |
containerEl | HTMLElement 字符串 | 允许将对话框挂载到自定义元素,而不是应用程序根元素(app.el ) | |
背景遮罩 | 布尔值 | true | 启用对话框背景(背后的深色半透明层) |
closeByBackdropClick | 布尔值 | false | 当启用时,点击背景将关闭对话框 |
animate | 布尔值 | true | 对话框是否应该使用动画打开/关闭。可以在.open() 和.close() 方法中覆盖。 |
title | 字符串 | 对话框标题 | |
text | 字符串 | 对话框内部文本 | |
内容 | 字符串 | 自定义对话框内容,跟随对话框文本。可以接受任何HTML内容 | |
按钮 | 数组 | [] | 对话框按钮的数组,其中每个按钮都是一个对象,具有按钮参数 |
verticalButtons | 布尔值 | false | 启用垂直按钮布局 |
destroyOnClose | 布尔值 | false | 当启用时将在关闭时自动销毁对话框 |
onClick | function(dialog, index) | 点击对话框按钮后执行的回调函数。作为参数,它接收对话框实例和被点击按钮的索引号 | |
cssClass | 字符串 | 要添加的附加 CSS 类 | |
on | 对象 | 带有事件处理程序的对象。例如:
|
按钮参数
数组中的每个按钮必须表示为带有按钮参数的对象:buttons
按钮数组必须表示为具有按钮参数的对象:
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
text | 字符串 | 按钮文本的字符串(可以是 HTML 字符串) | |
strong | 布尔值 | false | 启用粗体按钮文本 |
color | 字符串 | 按钮颜色,之一默认颜色之一 | |
close | 布尔值 | true | 如果启用,则点击按钮将关闭对话框 |
cssClass | 字符串 | 额外的按钮CSS类 | |
keyCodes | 数组 | [] | 键盘键码数组,将用于触发按钮点击。例如,键码13 表示当按下Enter键时将触发按钮点击 |
onClick | function(dialog, e) | 点击此按钮后执行的回调函数 |
对话框方法和属性
所以要创建对话框,我们必须调用:
var dialog = app.dialog.create({ /* parameters */ })
之后我们就有其初始化的实例(如dialog
示例中上面的变量)以及有用的方法和属性:
属性 | |
---|---|
dialog.app | 链接到全局应用实例 |
dialog.el | 对话框HTML元素 |
dialog.$el | 包含对话框HTML元素的Dom7实例 |
dialog.backdropEl | 背景层 HTML 元素 |
dialog.$backdropEl | 包含背景层 HTML 元素的 Dom7 实例 |
dialog.params | 对话框参数 |
dialog.opened | 布尔属性指示对话框是否打开 |
方法 | |
dialog.open(animate) | 打开对话框。其中
|
dialog.close(animate) | 关闭对话框。其中
|
dialog.setProgress(进度, 持续时间) | 当使用对话框进度快捷方式时设置对话框进度
|
dialog.setTitle(title) | 设置对话框的标题
|
dialog.setText(text) | 设置对话框的文本
|
dialog.destroy() | 销毁对话框 |
dialog.on(事件上触发, 处理程序) | 添加事件处理程序 |
dialog.once(事件上触发, 处理程序) | 添加在触发后将被移除的事件处理程序 |
dialog.off(事件上触发, 处理程序) | 移除事件处理程序 |
dialog.off(事件上触发) | 移除指定事件的所有处理程序 |
dialog.emit(事件上触发, ...args) | 在实例上触发事件 |
对话框事件
对话框将在对话框元素和应用程序和对话框实例上触发以下DOM事件:
DOM 事件
事件 | Target | 描述 |
---|---|---|
dialog:open | 对话框元素<div class="dialog"> | 当对话框开始其打开动画时将触发事件 |
dialog:opened | 对话框元素<div class="dialog"> | 对话框完成其打开动画后触发事件 |
dialog:close | 对话框元素<div class="dialog"> | 当对话框开始其关闭动画时将触发事件 |
dialog:closed | 对话框元素<div class="dialog"> | 对话框完成其关闭动画后触发事件 |
dialog:beforedestroy | 对话框元素<div class="dialog"> | 在对话框实例将被销毁之前立即触发事件 |
应用和对话框实例事件
对话框实例在自身实例和应用程序实例上触发事件。应用程序实例事件具有相同名称,前缀为dialog
.
事件 | 参数 | Target | 描述 |
---|---|---|---|
open为前缀 | dialog | dialog | 当对话框开始其打开动画时触发事件。作为参数,事件处理程序接收对话框实例 |
dialogOpen | dialog | app | |
opened | dialog | dialog | 对话框完成其打开动画后触发事件。作为参数,事件处理程序接收对话框实例 |
dialogOpened | dialog | app | |
close | dialog | dialog | 当对话框开始其关闭动画时触发事件。作为参数,事件处理程序接收对话框实例 |
dialogClose | dialog | app | |
closed | dialog | dialog | 对话框完成其关闭动画后触发事件。作为参数,事件处理程序接收对话框实例 |
dialogClosed | dialog | app | |
beforeDestroy | dialog | dialog | 在对话框实例将被销毁之前触发事件。作为参数,事件处理程序接收对话框实例 |
dialogBeforeDestroy | dialog | app |
对话框快捷键
有一些快捷方式方法,它们使得创建对话框更加容易。
首先让我们检查帮助配置这些快捷方式的全局应用程序参数,这些参数也用于本地化目的。
对话框快捷键参数
以下全局对话框快捷方式参数可以在应用程序初始化时传递在dialog
派发动作
var app = new Framework7({
dialog: {
// set default title for all dialog shortcuts
title: 'My App',
// change default "OK" button text
buttonOk: 'Done',
...
}
});
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
title | 字符串 | 默认对话框快捷方式标题。如果未指定,将等于app.name | |
buttonOk | 字符串 | OK | 默认“OK”按钮文本 |
取消按钮 | 字符串 | 取消 | 默认"取消"按钮文本 |
用户名占位符 | 字符串 | 用户名 | 登录对话框中默认用户名字段占位符 |
密码占位符 | 字符串 | 密码 | 登录和密码对话框中默认密码字段占位符 |
预加载器标题 | 字符串 | 正在加载... | 预加载器对话框的默认标题 |
进度标题 | 字符串 | 正在加载... | 进度对话框的默认标题 |
销毁预定义对话框 | 布尔值 | true | 关闭时将自动销毁所有预定义对话框(警告、确认、提示等) |
键盘操作 | 布尔值 | true | 为预定义对话框(警告、确认、提示、登录、密码)的"确定"和"取消"按钮启用键盘快捷键(Enter和Esc) |
自动聚焦 | 布尔值 | true | 启用时,在对话框打开时自动聚焦对话框输入。仅适用于具有输入的预定义对话框,如提示、登录和密码 |
现在让我们看看可用的对话框快捷键
警告
要创建警告对话框,我们需要使用以下应用方法:
app.dialog.alert(text, title, 回调)- 创建警告对话框并打开它
- text - 字符串. 警告对话框文本
- title - 字符串. 警告对话框标题
- 回调 - 函数. 可选。用户点击警告按钮后执行的回调函数
方法返回创建的对话框实例
app.dialog.alert(text, 回调)- 使用默认标题创建警告对话框并打开它
方法返回创建的对话框实例
确认
确认对话框通常用于需要确认某些操作时。要打开确认模态框,我们也应该调用以下应用方法之一:
app.dialog.confirm(text, title, callbackOk, callbackCancel)- 创建确认对话框并打开它
- text - 字符串. 确认对话框文本
- title - 字符串. 确认对话框标题
- callbackOk - 函数. 可选。当用户在确认对话框中点击"确定"按钮时执行的回调函数(当用户确认操作时)
- callbackCancel - 函数. 可选。当用户在确认对话框中点击"取消"按钮时执行的回调函数(当用户取消操作时)
方法返回创建的对话框实例
app.dialog.confirm(text, callbackOk, callbackCancel)- 使用默认标题创建确认对话框并打开它
方法返回创建的对话框实例
提示
提示对话框用于需要从用户获取某些数据/答案时。要打开提示对话框,我们也应该调用以下应用方法之一:
app.dialog.prompt(text, title, callbackOk, callbackCancel, defaultValue)- 创建提示对话框并打开它
- text - 字符串. 提示对话框文本
- title - 字符串. 提示对话框标题
- callbackOk - 函数(value). 可选。当用户在提示对话框中点击"确定"按钮时执行的回调函数。作为参数,函数接收文本输入的值
- callbackCancel - 函数(value). 可选。当用户在提示对话框中点击"取消"按钮时执行的回调函数。作为参数,函数接收文本输入的值
- defaultValue - 字符串. 可选。提示输入的默认值
app.dialog.prompt(text, callbackOk, callbackCancel, defaultValue)- 使用默认标题创建提示对话框并打开它
方法返回创建的对话框实例
登录
app.dialog.login(text, title, callbackOk, callbackCancel)- 创建登录对话框并打开它
- text - 字符串. 登录对话框文本
- title - 字符串. 登录对话框标题
- callbackOk - function(username, password). 可选。当用户在登录对话框中点击"确定"按钮时执行的回调函数。作为参数,函数接收用户名和密码的值
- callbackCancel - function(username, password). 可选。当用户在登录对话框中点击"取消"按钮时执行的回调函数。作为参数,函数接收用户名和密码的值
app.dialog.login(text, callbackOk, callbackCancel)- 使用默认标题创建登录对话框并打开它
方法返回创建的对话框实例
密码
密码对话框在您需要仅请求密码的情况下很有用
app.dialog.password(text, title, callbackOk, callbackCancel)- 创建密码对话框并打开它
- text - 字符串. 密码对话框文本
- title - 字符串. 密码对话框标题
- callbackOk - function(password). 可选。当用户在密码对话框中点击"确定"按钮时执行的回调函数。作为参数,函数接收密码的值
- callbackCancel - function(password). 可选。当用户在密码对话框中点击"取消"按钮时执行的回调函数。作为参数,函数接收密码的值
app.dialog.password(text, callbackOk, callbackCancel)- 使用默认标题创建密码对话框并打开它
方法返回创建的对话框实例
预加载器
预加载器对话框用于指示某些后台活动(如Ajax请求)并在活动期间阻止任何用户操作。要打开预加载器对话框,我们也应该调用适当的应用方法:
app.dialog.preloader(title, color)- 创建预加载器对话框并打开它
- title - 字符串. 可选。预加载器对话框标题
- color - 字符串. 可选。预加载器颜色。之一默认颜色之一
方法返回创建的对话框实例
进度
与预加载器对话框相同,但带有进度条而不是预加载器。
app.dialog.progress(title, 进度, color)- 创建进度对话框并打开它
- title - 字符串. 可选。进度对话框标题
- 进度 - 数字. 可选。进度条进度(从0到100)。如果没有
number
传递,则它将具有无限进度条。 - color - 字符串. 可选。进度条颜色。之一默认颜色之一
方法返回创建的对话框实例
CSS 变量
以下是相关CSS 变量(CSS 自定义属性) 的列表。
:root {
--f7-dialog-button-text-color: var(--f7-theme-color);
--f7-dialog-button-text-align: center;
}
.ios {
--f7-dialog-width: 270px;
--f7-dialog-inner-padding: 16px;
--f7-dialog-border-radius: 13px;
--f7-dialog-text-align: center;
--f7-dialog-font-size: 14px;
--f7-dialog-title-text-color: inherit;
--f7-dialog-title-font-size: 18px;
--f7-dialog-title-font-weight: 600;
--f7-dialog-title-line-height: inherit;
--f7-dialog-button-font-size: 17px;
--f7-dialog-button-height: 44px;
--f7-dialog-button-letter-spacing: 0;
--f7-dialog-button-font-weight: 400;
--f7-dialog-button-text-transform: none;
--f7-dialog-button-strong-bg-color: transparent;
--f7-dialog-button-strong-text-color: var(--f7-theme-color);
--f7-dialog-button-strong-font-weight: 500;
--f7-dialog-input-border-radius: 4px;
--f7-dialog-input-font-size: 14px;
--f7-dialog-input-height: 32px;
--f7-dialog-input-border-width: 1px;
--f7-dialog-input-placeholder-color: #a9a9a9;
--f7-dialog-preloader-size: 34px;
--f7-dialog-input-bg-color: #fff;
--f7-dialog-bg-color: rgba(255, 255, 255, 0.95);
--f7-dialog-bg-color-rgb: 255, 255, 255;
--f7-dialog-text-color: #000;
--f7-dialog-button-pressed-bg-color: rgba(0, 0, 0, 0.1);
--f7-dialog-button-strong-pressed-bg-color: rgba(0, 0, 0, 0.1);
--f7-dialog-input-border-color: rgba(0, 0, 0, 0.3);
--f7-dialog-border-divider-color: rgba(0, 0, 0, 0.2);
}
.ios .dark,
.ios.dark {
--f7-dialog-text-color: #fff;
--f7-dialog-bg-color: rgba(45, 45, 45, 0.95);
--f7-dialog-bg-color-rgb: 45, 45, 45;
--f7-dialog-button-pressed-bg-color: rgba(0, 0, 0, 0.2);
--f7-dialog-button-strong-pressed-bg-color: rgba(0, 0, 0, 0.2);
--f7-dialog-border-divider-color: rgba(255, 255, 255, 0.15);
--f7-dialog-input-border-color: rgba(255, 255, 255, 0.15);
--f7-dialog-input-bg-color: rgba(0, 0, 0, 0.5);
}
.md {
--f7-dialog-width: 280px;
--f7-dialog-inner-padding: 24px;
--f7-dialog-border-radius: 28px;
--f7-dialog-text-align: left;
--f7-dialog-font-size: 14px;
--f7-dialog-title-font-size: 24px;
--f7-dialog-title-font-weight: 400;
--f7-dialog-title-line-height: 1.3;
--f7-dialog-button-font-size: 14px;
--f7-dialog-button-height: 40px;
--f7-dialog-button-letter-spacing: normal;
--f7-dialog-button-font-weight: 500;
--f7-dialog-button-text-transform: none;
--f7-dialog-button-strong-font-weight: 500;
--f7-dialog-input-border-radius: 0px;
--f7-dialog-input-font-size: 16px;
--f7-dialog-input-height: 36px;
--f7-dialog-input-border-color: transparent;
--f7-dialog-input-border-width: 0px;
--f7-dialog-preloader-size: 32px;
--f7-dialog-input-bg-color: transparent;
}
.md,
.md .dark,
.md [class*='color-'] {
--f7-dialog-button-pressed-bg-color: transparent;
--f7-dialog-button-strong-bg-color: var(--f7-theme-color);
--f7-dialog-button-strong-text-color: var(--f7-md-on-primary);
--f7-dialog-button-strong-pressed-bg-color: transparent;
--f7-dialog-bg-color: var(--f7-md-surface-3);
--f7-dialog-input-placeholder-color: var(--f7-md-on-surface-variant);
--f7-dialog-text-color: var(--f7-md-on-surface-variant);
--f7-dialog-title-text-color: var(--f7-md-on-surface);
}
示例
<template>
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="title">Dialog</div>
</div>
</div>
<div class="page-content">
<div class="block block-strong-ios block-outline-ios">
<p>There are 1:1 replacements of native Alert, Prompt and Confirm modals. They support callbacks, have very easy
api and can be combined with each other. Check these examples:</p>
<p class="grid grid-cols-3 grid-gap">
<button class="button button-fill" @click=${openAlert}>Alert</button>
<button class="button button-fill" @click=${openConfirm}>Confirm</button>
<button class="button button-fill" @click=${openPrompt}>Prompt</button>
</p>
<p class="grid grid-cols-2 grid-gap">
<button class="button button-fill" @click=${openLogin}>Login</button>
<button class="button button-fill" @click=${openPassword}>Password</button>
</p>
</div>
<div class="block-title">Vertical Buttons</div>
<div class="block block-strong-ios block-outline-ios">
<p>
<button class="button button-fill" @click=${openVerticalButtons}>Vertical Buttons</button>
</p>
</div>
<div class="block-title">Preloader Dialog</div>
<div class="block block-strong-ios block-outline-ios">
<p class="grid grid-cols-2 grid-gap">
<button class="button button-fill" @click=${openPreloader}>Preloader</button>
<button class="button button-fill" @click=${openCustomPreloader}>Custom Text</button>
</p>
</div>
<div class="block-title">Progress Dialog</div>
<div class="block block-strong-ios block-outline-ios">
<p class="grid grid-cols-2 grid-gap">
<button class="button button-fill" @click=${openInfiniteProgress}>Infinite</button>
<button class="button button-fill" @click=${openDeterminedProgress}>Determined</button>
</p>
</div>
<div class="block-title">Dialogs Stack</div>
<div class="block block-strong-ios block-outline-ios">
<p>This feature doesn't allow to open multiple dialogs at the same time, and will automatically open next dialog
when you close the current one. Such behavior is similar to browser native dialogs: </p>
<p>
<button class="button button-fill" @click=${openAlerts}>Open Multiple Alerts</button>
</p>
</div>
</div>
</div>
</template>
<script>
export default (props, { $f7 }) => {
const openAlert = () => {
$f7.dialog.alert('Hello!');
}
const openConfirm = () => {
$f7.dialog.confirm('Are you feel good today?', function () {
$f7.dialog.alert('Great!');
});
}
const openPrompt = () => {
$f7.dialog.prompt('What is your name?', function (name) {
$f7.dialog.confirm('Are you sure that your name is ' + name + '?', function () {
$f7.dialog.alert('Ok, your name is ' + name);
});
});
}
const openLogin = () => {
$f7.dialog.login('Enter your username and password', function (username, password) {
$f7.dialog.alert('Thank you!<br />Username:' + username + '<br />Password:' + password);
});
}
const openPassword = () => {
$f7.dialog.password('Enter your password', function (password) {
$f7.dialog.alert('Thank you!<br />Password:' + password);
});
}
const openAlerts = () => {
$f7.dialog.alert('Alert 1');
$f7.dialog.alert('Alert 2');
$f7.dialog.alert('Alert 3');
$f7.dialog.alert('Alert 4');
$f7.dialog.alert('Alert 5');
}
const openVerticalButtons = () => {
$f7.dialog.create({
title: 'Vertical Buttons',
buttons: [
{
text: 'Button 1',
},
{
text: 'Button 2',
},
{
text: 'Button 3',
},
],
verticalButtons: true,
}).open();
}
const openPreloader = () => {
$f7.dialog.preloader();
setTimeout(function () {
$f7.dialog.close();
}, 3000);
}
const openCustomPreloader = () => {
$f7.dialog.preloader('My text...');
setTimeout(function () {
$f7.dialog.close();
}, 3000);
}
const openInfiniteProgress = () => {
$f7.dialog.progress();
setTimeout(function () {
$f7.dialog.close();
}, 3000);
}
const openDeterminedProgress = () => {
var progress = 0;
var dialog = $f7.dialog.progress('Loading assets', progress);
dialog.setText('Image 1 of 10');
var interval = setInterval(function () {
progress += 10;
dialog.setProgress(progress);
dialog.setText('Image ' + ((progress) / 10) + ' of 10');
if (progress === 100) {
clearInterval(interval);
dialog.close();
}
}, 300)
}
return $render;
};
</script>