對話框
對話方塊是一個小型內容窗格,會彈出在應用程式的主要內容上。對話方塊通常用於向使用者詢問問題,或通知或警告使用者。對話方塊與其他所有模態視窗一樣,都是所謂「暫時性視圖」的一部分。
對話方塊只能使用 JavaScript 開啟。因此,我們來看一下相關的應用程式方法來使用對話方塊。
對話方塊應用程式方法
我們來看一下相關的應用程式方法來使用對話方塊
app.dialog.create(參數)- 建立對話方塊實例
- 參數 - 物件。包含對話方塊參數的物件
方法傳回已建立的對話方塊實例
app.dialog.destroy(el)- 銷毀對話方塊實例
- el - HTMLElement 或 字串(包含 CSS 選擇器)或 物件。要銷毀的對話方塊元素或對話方塊實例。
app.dialog.get(el)- 透過 HTML 元素取得對話方塊實例
- el - HTMLElement 或 字串(包含 CSS 選擇器)。對話方塊元素。
方法傳回對話方塊實例
app.dialog.open(el, 動畫)- 開啟對話方塊
- el - HTMLElement 或 字串(包含 CSS 選擇器)。要開啟的對話方塊元素。
- 動畫 - 布林值。使用動畫開啟對話方塊。
方法傳回對話方塊實例
app.dialog.close(el, 動畫)- 關閉對話方塊
- el - HTMLElement 或 字串(包含 CSS 選擇器)。要關閉的對話方塊元素。
- 動畫 - 布林值。使用動畫關閉對話方塊。
方法傳回對話方塊實例
對話方塊參數
現在我們來看一下建立對話方塊所需的可用參數清單
參數 | 類型 | 預設值 | 說明 |
---|---|---|---|
el | HTMLElement 字串 | 對話框元素。如果您在 HTML 中已有對話框元素,而且想要使用此元素建立新執行個體,這會很有用 | |
containerEl | HTMLElement 字串 | 允許將對話框安裝到自訂元素,而不是應用程式根元素 (app.el ) | |
backdrop | 布林值 | true | 啟用對話框背景 (後方的深色半透明圖層) |
closeByBackdropClick | 布林值 | false | 啟用後,按一下背景會關閉對話框 |
animate | 布林值 | true | 對話框是否應該使用動畫開啟/關閉。可以在 .open() 和 .close() 方法中覆寫 |
title | 字串 | 對話框標題 | |
text | 字串 | 對話框內文 | |
content | 字串 | 自訂對話框內容,遵循對話框文字。可以接受任何 HTML 內容 | |
buttons | 陣列 | [] | 包含對話框按鈕的陣列,其中每個按鈕都是具有 按鈕參數 的物件 |
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 | 連結至全域 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 事件,以及在 app 和對話框實例上觸發事件
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 | 字串 | 預設對話框捷徑標題。如果未指定,將等於app.name | |
buttonOk | 字串 | 確定 | 預設「確定」按鈕文字 |
buttonCancel | 字串 | 取消 | 預設「取消」按鈕文字 |
usernamePlaceholder | 字串 | 使用者名稱 | 登入對話框中的預設使用者名稱欄位提示文字 |
passwordPlaceholder | 字串 | 密碼 | 登入和密碼對話框中的預設密碼欄位提示文字 |
preloaderTitle | 字串 | 載入中... | 預載器對話框的預設標題 |
progressTitle | 字串 | 載入中... | 進度對話框的預設標題 |
destroyPredefinedDialogs | 布林值 | true | 關閉時會自動銷毀所有預先定義的對話框(警示、確認、提示等) |
keyboardActions | 布林值 | true | 為預先定義的對話框(警示、確認、提示、登入、密碼)的「確定」和「取消」按鈕啟用鍵盤捷徑(Enter 和 Esc)鍵 |
autoFocus | 布林值 | true | 啟用時,會在對話框開啟時自動對焦對話框輸入。僅對具有輸入項目的預先定義的對話框有效,例如提示、登入和密碼 |
現在讓我們看看可用的對話框捷徑
警示
若要建立警示對話框,我們需要使用下列應用程式方法
app.dialog.alert(text, title, callback) - 建立警示對話框並開啟
- text - 字串。警示對話框文字
- title - 字串。警示對話框標題
- callback - 函式。選用。使用者按一下警示按鈕後執行的回呼函式
方法傳回已建立的對話方塊實例
app.dialog.alert(text, callback) - 建立具有預設標題的警示對話框並開啟
方法傳回已建立的對話方塊實例
確認
當需要確認某個動作時,通常會使用確認對話框。若要開啟確認模式,我們也應該呼叫下列 App 方法之一
app.dialog.confirm(text, title, callbackOk, callbackCancel) - 建立確認對話框並開啟
- text - 字串。確認對話框文字
- title - 字串。確認對話框標題
- callbackOk - 函式。選用。當使用者按一下確認對話框上的「確定」按鈕(當使用者確認動作)時執行的回呼函式
- callbackCancel - 函式。選用。當使用者按一下確認對話框上的「取消」按鈕(當使用者取消動作)時執行的回呼函式
方法傳回已建立的對話方塊實例
app.dialog.confirm(text, callbackOk, callbackCancel) - 建立具有預設標題的確認對話框並開啟
方法傳回已建立的對話方塊實例
提示
當需要從使用者取得一些資料/答案時,會使用提示對話框。若要開啟提示對話框,我們也應該呼叫下列 App 方法之一
app.dialog.prompt(text, title, callbackOk, callbackCancel, defaultValue) - 建立提示對話框並開啟
- text - 字串。提示對話框文字
- title - 字串。提示對話框標題
- callbackOk - 函式(值)。選用。當使用者按一下提示對話框上的「確定」按鈕時執行的回呼函式。函式接收文字輸入的值作為引數
- callbackCancel - 函式(值)。選用。當使用者按一下提示對話框上的「取消」按鈕時執行的回呼函式。函式接收文字輸入的值作為引數
- defaultValue - 字串。選用。提示輸入預設值
app.dialog.prompt(text, callbackOk, callbackCancel, defaultValue)- 建立提示對話框,並使用預設標題並開啟它
方法傳回已建立的對話方塊實例
登入
app.dialog.login(text, title, callbackOk, callbackCancel)- 建立登入對話框並開啟它
- text - 字串。登入對話框文字
- title - 字串。登入對話框標題
- callbackOk - 函式(username, password)。選用。當使用者按登入對話框的「確定」按鈕時,將執行的 callback 函式。函式接收使用者名稱和密碼值作為引數
- callbackCancel - 函式(username, password)。選用。當使用者按登入對話框的「取消」按鈕時,將執行的 callback 函式。函式接收使用者名稱和密碼值作為引數
app.dialog.login(text, callbackOk, callbackCancel)- 建立登入對話框,並使用預設標題並開啟它
方法傳回已建立的對話方塊實例
密碼
如果您只需要要求密碼,密碼對話框會很有用
app.dialog.password(text, title, callbackOk, callbackCancel)- 建立密碼對話框並開啟它
- text - 字串。密碼對話框文字
- title - 字串。密碼對話框標題
- callbackOk - 函式(password)。選用。當使用者按密碼對話框的「確定」按鈕時,將執行的 callback 函式。函式接收密碼值作為引數
- callbackCancel - 函式(password)。選用。當使用者按密碼對話框的「取消」按鈕時,將執行的 callback 函式。函式接收密碼值作為引數
app.dialog.password(text, callbackOk, callbackCancel)- 建立密碼對話框,並使用預設標題並開啟它
方法傳回已建立的對話方塊實例
預載器
載入前對話框用於指示某些背景活動(例如 Ajax 要求),並在活動期間封鎖任何使用者動作。若要開啟載入前對話框,我們也應該呼叫適當的 App 方法
app.dialog.preloader(title, color)- 建立 Preloader 對話框並開啟
- title - 字串. 選擇性. Preloader 對話框標題
- color - 字串. 選擇性. Preloader 顏色. 其中一個 預設顏色
方法傳回已建立的對話方塊實例
進度
與 Preloader 對話框相同,但使用 進度條 取代 preloader。
app.dialog.progress(title, progress, color)- 建立進度對話框並開啟
- title - 字串. 選擇性. 進度對話框標題
- 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>