对话框
对话框是一个小型内容窗格,会弹出显示在应用程序的主要内容之上。对话框通常用于向用户提问,或通知或警告用户。对话框与所有其他模态框一样,都属于所谓的“临时视图”。
对话框只能使用 JavaScript 打开。所以让我们看看与对话框相关的应用程序方法。
对话框应用程序方法
让我们看看与对话框相关的应用程序方法
app.dialog.create(parameters)- 创建对话框实例
- parameters - object。包含对话框参数的对象
方法返回创建的对话框实例
app.dialog.destroy(el)- 销毁对话框实例
- el - HTMLElement 或 string (带有 CSS 选择器) 或 object。要销毁的对话框元素或对话框实例。
app.dialog.get(el)- 通过 HTML 元素获取对话框实例
- el - HTMLElement 或 string (带有 CSS 选择器)。对话框元素。
方法返回对话框实例
app.dialog.open(el, animate)- 打开对话框
- el - HTMLElement 或 string (带有 CSS 选择器)。要打开的对话框元素。
- animate - boolean。使用动画打开对话框。
方法返回对话框实例
app.dialog.close(el, animate)- 关闭对话框
- el - HTMLElement 或 string (带有 CSS 选择器)。要关闭的对话框元素。
- animate - boolean。使用动画关闭对话框。
方法返回对话框实例
对话框参数
现在让我们看看创建对话框所需的可用参数列表
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
el | HTMLElement string | 对话框元素。如果您已经在 HTML 中拥有对话框元素并希望使用此元素创建新实例,则此选项非常有用 | |
containerEl | HTMLElement string | 允许将对话框挂载到自定义元素而不是应用程序根元素 (app.el ) | |
backdrop | boolean | true | 启用对话框背景(后面的深色半透明层) |
closeByBackdropClick | boolean | false | 启用后,单击背景将关闭对话框 |
animate | boolean | true | 对话框是否应使用动画打开/关闭。可以在 .open() 和 .close() 方法中覆盖 |
title | string | 对话框标题 | |
text | string | 对话框内部文本 | |
content | string | 对话框文本后面的自定义对话框内容。可以接受任何 HTML 内容 | |
buttons | array | [] | 带有对话框按钮的数组,其中每个按钮都是一个带有 按钮参数 的对象 |
verticalButtons | boolean | false | 启用垂直按钮布局 |
destroyOnClose | boolean | false | 启用后将在关闭时自动销毁对话框 |
onClick | function(dialog, index) | 单击对话框按钮后将执行的回调函数。作为参数,它接收对话框实例和单击的按钮索引号 | |
cssClass | string | 要添加的额外 CSS 类 | |
on | 对象 | 带有事件处理程序的对象。 例如
|
按钮参数
buttons
数组中的每个按钮都必须表示为带有按钮参数的对象
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
text | string | 带有按钮文本的字符串(可以是 HTML 字符串) | |
strong | boolean | false | 启用粗体按钮文本 |
color | string | 按钮颜色,默认颜色 之一 | |
close | boolean | true | 如果启用,则单击按钮将关闭对话框 |
cssClass | string | 附加按钮 CSS 类 | |
keyCodes | array | [] | 用于触发按钮单击的键盘键码数组。 例如,键码 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(progress, duration) | 在使用对话框进度快捷方式时设置对话框进度
|
dialog.setTitle(title) | 设置对话框的标题
|
dialog.setText(text) | 设置对话框的文本
|
dialog.destroy() | 销毁对话框 |
dialog.on(event, handler) | 添加事件处理程序 |
dialog.once(event, handler) | 添加在触发后将被删除的事件处理程序 |
dialog.off(event, handler) | 删除事件处理程序 |
dialog.off(event) | 删除指定事件的所有处理程序 |
dialog.emit(event, ...args) | 在实例上触发事件 |
对话框事件
对话框将在对话框元素上触发以下 DOM 事件,并在应用程序和对话框实例上触发事件
DOM 事件
事件 | 目标 | 描述 |
---|---|---|
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
为前缀。
事件 | 参数 | 目标 | 描述 |
---|---|---|---|
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 | string | 默认对话框快捷方式标题。如果未指定,则等于 app.name | |
buttonOk | string | 确定 | 默认“确定”按钮文本 |
buttonCancel | string | 取消 | 默认“取消”按钮文本 |
usernamePlaceholder | string | 用户名 | 登录对话框中默认用户名字段占位符 |
passwordPlaceholder | string | 密码 | 登录和密码对话框中默认密码字段占位符 |
preloaderTitle | string | 加载中... | 预加载器对话框的默认标题 |
progressTitle | string | 加载中... | 进度对话框的默认标题 |
destroyPredefinedDialogs | boolean | true | 将在关闭时自动销毁所有预定义的对话框(警报、确认、提示等) |
keyboardActions | boolean | true | 为预定义对话框(警报、确认、提示、登录、密码)的“确定”和“取消”按钮启用键盘快捷键(回车键和 Esc 键)。 |
自动对焦 | boolean | true | 启用后,它将在对话框打开时自动对焦对话框输入。仅对具有输入的预定义对话框有效,如提示、登录和密码。 |
现在让我们看看可用的对话框快捷方式。
警报
要创建警报对话框,我们需要使用以下应用程序方法。
app.dialog.alert(text, title, callback)- 创建警报对话框并打开它。
- text - string。警报对话框文本。
- title - string。警报对话框标题。
- callback - function。可选。用户点击警报按钮后将执行的回调函数。
方法返回创建的对话框实例
app.dialog.alert(text, callback)- 创建带有默认标题的警报对话框并打开它。
方法返回创建的对话框实例
确认
确认对话框通常在需要确认某些操作时使用。要打开确认模态框,我们还应该调用以下 App 方法之一。
app.dialog.confirm(text, title, callbackOk, callbackCancel)- 创建确认对话框并打开它。
- text - string。确认对话框文本。
- title - string。确认对话框标题。
- callbackOk - function。可选。用户点击确认对话框上的“确定”按钮时将执行的回调函数(当用户确认操作时)。
- callbackCancel - function。可选。用户点击确认对话框上的“取消”按钮时将执行的回调函数(当用户取消操作时)。
方法返回创建的对话框实例
app.dialog.confirm(text, callbackOk, callbackCancel)- 创建带有默认标题的确认对话框并打开它。
方法返回创建的对话框实例
提示
提示对话框在需要从用户那里获取一些数据/答案时使用。要打开提示对话框,我们还应该调用以下 App 方法之一。
app.dialog.prompt(text, title, callbackOk, callbackCancel, defaultValue)- 创建提示对话框并打开它。
- text - string。提示对话框文本。
- title - string。提示对话框标题。
- callbackOk - function(value)。可选。用户点击提示对话框上的“确定”按钮时将执行的回调函数。作为参数,函数接收文本输入的值。
- callbackCancel - function(value)。可选。用户点击提示对话框上的“取消”按钮时将执行的回调函数。作为参数,函数接收文本输入的值。
- defaultValue - string(字符串)。可选。提示输入默认值
app.dialog.prompt(text, callbackOk, callbackCancel, defaultValue)- 创建带有默认标题的提示对话框并将其打开
方法返回创建的对话框实例
登录
app.dialog.login(text, title, callbackOk, callbackCancel)- 创建登录对话框并将其打开
- text - string(字符串)。登录对话框文本
- title - string(字符串)。登录对话框标题
- callbackOk - function(username, password)。可选。当用户点击登录对话框上的“确定”按钮时,将执行的回调函数。作为参数,函数接收用户名和密码值
- callbackCancel - function(username, password)。可选。当用户点击登录对话框上的“取消”按钮时,将执行的回调函数。作为参数,函数接收用户名和密码值
app.dialog.login(text, callbackOk, callbackCancel)- 创建带有默认标题的登录对话框并将其打开
方法返回创建的对话框实例
密码
当您只需要请求密码时,密码对话框非常有用
app.dialog.password(text, title, callbackOk, callbackCancel)- 创建密码对话框并将其打开
- text - string(字符串)。密码对话框文本
- title - string(字符串)。密码对话框标题
- callbackOk - function(password)。可选。当用户点击密码对话框上的“确定”按钮时,将执行的回调函数。作为参数,函数接收密码值
- callbackCancel - function(password)。可选。当用户点击密码对话框上的“取消”按钮时,将执行的回调函数。作为参数,函数接收密码值
app.dialog.password(text, callbackOk, callbackCancel)- 创建带有默认标题的密码对话框并将其打开
方法返回创建的对话框实例
预加载器
预加载器对话框用于指示某些后台活动(如 Ajax 请求),并在该活动期间阻止任何用户操作。要打开预加载器对话框,我们还应该调用相应的 App 方法
app.dialog.preloader(title, color)- 创建预加载器对话框并将其打开
- title - string(字符串)。可选。预加载器对话框标题
- color - string(字符串)。可选。预加载器颜色。一种默认颜色
方法返回创建的对话框实例
进度
与预加载器对话框相同,但使用进度条代替预加载器。
app.dialog.progress(title, progress, color)- 创建进度对话框并将其打开
- title - string(字符串)。可选。进度对话框标题
- progress - 数字。可选。进度条进度 (0 到 100)。如果没有传递
数字
,则它将显示为无限进度条。 - 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>