对话框

对话框是一个弹出在应用程序主内容上方的较小内容面板。对话框通常用于向用户询问信息,或通知或警告用户。对话框,与其他所有模态框一样,是所谓的“临时视图”的一部分。

对话框只能通过使用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 - 布尔值. 使用动画关闭对话框。

方法返回对话框实例

对话框参数

现在让我们看看创建对话框所需的可用参数列表:

参数类型默认描述
elHTMLElement
字符串
对话框元素。如果您的HTML中已经有一个对话框元素,并且您想使用这个元素创建新的实例,则很有用
containerElHTMLElement
字符串
允许将对话框挂载到自定义元素,而不是应用程序根元素(app.el)
背景遮罩布尔值true启用对话框背景(背后的深色半透明层)
closeByBackdropClick布尔值false当启用时,点击背景将关闭对话框
animate布尔值true对话框是否应该使用动画打开/关闭。可以在.open().close()方法中覆盖。
title字符串对话框标题
text字符串对话框内部文本
内容字符串自定义对话框内容,跟随对话框文本。可以接受任何HTML内容
按钮数组[]对话框按钮的数组,其中每个按钮都是一个对象,具有按钮参数
verticalButtons布尔值false启用垂直按钮布局
destroyOnClose布尔值false当启用时将在关闭时自动销毁对话框
onClickfunction(dialog, index)点击对话框按钮后执行的回调函数。作为参数,它接收对话框实例和被点击按钮的索引号
cssClass字符串要添加的附加 CSS 类
on对象

带有事件处理程序的对象。例如:

var dialog = app.dialog.create({
  text: 'Hello World',
  on: {
    opened: function () {
      console.log('Dialog opened')
    }
  }
})

按钮参数

数组中的每个按钮必须表示为带有按钮参数的对象:buttons按钮数组必须表示为具有按钮参数的对象:

参数类型默认描述
text字符串按钮文本的字符串(可以是 HTML 字符串)
strong布尔值false启用粗体按钮文本
color字符串按钮颜色,之一默认颜色之一
close布尔值true如果启用,则点击按钮将关闭对话框
cssClass字符串额外的按钮CSS类
keyCodes数组[]键盘键码数组,将用于触发按钮点击。例如,键码13表示当按下Enter键时将触发按钮点击
onClickfunction(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)打开对话框。其中
  • animate - 布尔值(默认true) - 定义是否应使用动画打开
dialog.close(animate)关闭对话框。其中
  • animate - 布尔值(默认true) - 定义是否应使用动画关闭
dialog.setProgress(进度, 持续时间)当使用对话框进度快捷方式时设置对话框进度
  • 进度 - 数字- 进度条进度(从0到100)
  • 持续时间 - 数字(毫秒) - 进度条进度变化持续时间
dialog.setTitle(title)设置对话框的标题
  • title - 字符串- 新的对话框标题
dialog.setText(text)设置对话框的文本
  • 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为前缀dialogdialog当对话框开始其打开动画时触发事件。作为参数,事件处理程序接收对话框实例
dialogOpendialogapp
openeddialogdialog对话框完成其打开动画后触发事件。作为参数,事件处理程序接收对话框实例
dialogOpeneddialogapp
closedialogdialog当对话框开始其关闭动画时触发事件。作为参数,事件处理程序接收对话框实例
dialogClosedialogapp
closeddialogdialog对话框完成其关闭动画后触发事件。作为参数,事件处理程序接收对话框实例
dialogCloseddialogapp
beforeDestroydialogdialog在对话框实例将被销毁之前触发事件。作为参数,事件处理程序接收对话框实例
dialogBeforeDestroydialogapp

对话框快捷键

有一些快捷方式方法,它们使得创建对话框更加容易。

首先让我们检查帮助配置这些快捷方式的全局应用程序参数,这些参数也用于本地化目的。

对话框快捷键参数

以下全局对话框快捷方式参数可以在应用程序初始化时传递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);
}

示例

dialog.html
<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>