文件:ariaNotify() 方法

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

非標準:此特性未標準化。我們不建議在生產環境中使用非標準特性,因為它們瀏覽器支援有限,並且可能會更改或被移除。但是,在沒有標準選項的特定情況下,它們可以是合適的替代方案。

Document 介面的 ariaNotify() 方法指定一段給定的文字字串應由螢幕閱讀器朗讀(如果螢幕閱讀器可用且已啟用)。

語法

js
ariaNotify(announcement)
ariaNotify(announcement, options)

引數

通知

指定要朗讀的文字字串。

options 可選

一個包含以下屬性的選項物件

優先順序

一個列舉值,指定通知的優先順序。可能的值為

normal

該通知具有正常優先順序。它將在螢幕閱讀器當前進行的任何通知之後朗讀。

high

該通知具有高優先順序。它將立即朗讀,中斷螢幕閱讀器當前進行的任何通知。

返回值

無(undefined)。

描述

ariaNotify() 方法可用於以程式設計方式觸發螢幕閱讀器通知。此方法提供與ARIA 即時區域類似的功能,並具有一些優勢:

  • 即時區域只能在 DOM 更改後進行通知,而 ariaNotify() 通知可以隨時進行。
  • 即時區域通知涉及朗讀已更改的 DOM 節點的更新內容,而 ariaNotify() 通知內容可以獨立於 DOM 內容定義。

開發人員通常透過使用設定了即時區域的隱藏 DOM 節點來規避即時區域的限制,這些節點的​​內容會隨著要通知的內容而更新。這效率低下且容易出錯,而 ariaNotify() 提供了一種避免此類問題的方法。

一些螢幕閱讀器會按順序朗讀多個 ariaNotify() 通知,但這不能在所有螢幕閱讀器和平臺上得到保證。通常,只朗讀最新的通知。將多個通知合併為一個更可靠。

例如,以下呼叫

js
document.ariaNotify("Hello there.");
document.ariaNotify("The time is now 8 o'clock.");

最好合並

js
document.ariaNotify("Hello there. The time is now 8 o'clock.");

ariaNotify() 通知不需要瞬時啟用;您應該注意不要用過多的通知來騷擾螢幕閱讀器使用者,因為這可能會造成糟糕的使用者體驗。

通知優先順序

設定了 priority: highariaNotify() 通知會在設定了 priority: normalariaNotify() 通知之前朗讀。

ariaNotify() 通知大致相當於 ARIA 即時區域通知,如下所示:

  • ariaNotify() priority: higharia-live="assertive"
  • ariaNotify() priority: normalaria-live="polite"

但是,aria-live 通知將優先於 ariaNotify() 通知。

語言選擇

螢幕閱讀器根據 <html> 元素的 lang 屬性中指定的語言,或如果未設定 lang 屬性,則根據使用者代理的預設語言,選擇合適的語音(在口音、發音等方面)來朗讀 ariaNotify() 通知。

許可權策略整合

文件或 <iframe>ariaNotify() 的使用可以透過 aria-notify 許可權策略進行控制。

具體來說,如果定義的策略阻止了使用,則任何使用 ariaNotify() 建立的公告都將靜默失敗(它們將不會被髮送)。

示例

基本的 ariaNotify() 用法

此示例包含一個 <button>,單擊時會觸發螢幕閱讀器通知。

html
<button>Press</button>
js
document.querySelector("button").addEventListener("click", () => {
  document.ariaNotify("Hi there, I'm Ed Winchester.");
});

結果

輸出如下:

嘗試啟用螢幕閱讀器,然後按下按鈕。您應該會聽到螢幕閱讀器朗讀“你好,我是埃德·溫徹斯特。”

無障礙購物清單示例

此示例是一個購物清單,您可以新增和刪除商品,並跟蹤所有商品的總成本。當新增或刪除商品時,螢幕閱讀器會朗讀通知,告知新增/刪除了什麼商品,以及更新後的總價是多少。

HTML

我們的 HTML 包含一個 <form>,其中包含兩個 <input> 元素——一個 text 輸入用於輸入商品名稱,一個 number 輸入用於輸入價格。兩個輸入都是 required,並且 number 輸入的 step 值為 0.01,以防止輸入非價格值(如大小數)。

在表單下方,我們有一個無序列表用於渲染新增的商品,以及一個 <p> 元素用於顯示總成本。

html
<h1><code>ariaNotify</code> demo: shopping list</h1>

<form>
  <div>
    <label for="item">Enter item name</label>
    <input type="text" name="item" id="item" required />
  </div>
  <div>
    <label for="price">Enter item price</label>
    <input type="number" name="price" id="price" step="0.01" required />
  </div>
  <div>
    <button>Submit</button>
  </div>
</form>

<hr />

<ul></ul>

<p>Total: £0.00</p>

JavaScript

我們的指令碼從幾個常量定義開始,用於儲存對 <form>、我們的兩個 <input> 元素以及我們的 <ul><p> 元素的引用。我們還包含一個 total 變數來儲存所有商品的總價。

js
const form = document.querySelector("form");
const item = document.querySelector("input[type='text']");
const price = document.querySelector("input[type='number']");
const priceList = document.querySelector("ul");
const totalOutput = document.querySelector("p");

let total = 0;

在我們的下一個程式碼塊中,我們定義了一個名為 updateTotal() 的函式,它只有一個作用——它更新 <p> 元素中顯示的價格,使其等於 total 變數的當前值。

js
function updateTotal() {
  totalOutput.textContent = `Total: £${Number(total).toFixed(2)}`;
}

接下來,我們定義一個名為 addItemToList() 的函式。在函式體內部,我們首先建立一個 <li> 元素來儲存新新增的商品。我們將商品名稱和價格儲存在元素上的 data-* 屬性中,並將其文字內容設定為包含商品和價格的字串。我們還建立一個 <button> 元素,文字為“Remove <item-name>”,然後將列表項附加到無序列表,並將按鈕附加到列表項。

函式體的第二個主要部分是按鈕上的 click 事件監聽器定義。當按鈕被點選時,我們首先獲取按鈕父節點(即它所在的列表項)的引用。然後,我們將列表項的 data-price 屬性中包含的數字從 total 變數中減去,呼叫 updateTotal() 函式更新顯示的總價,然後呼叫 ariaNotify() 宣佈已刪除的商品以及新的總價。最後,我們從 DOM 中刪除列表項。

js
function addItemToList(item, price) {
  const listItem = document.createElement("li");
  listItem.setAttribute("data-item", item);
  listItem.setAttribute("data-price", price);
  listItem.textContent = `${item}: £${Number(price).toFixed(2)}`;
  const btn = document.createElement("button");
  btn.textContent = `Remove ${item}`;

  priceList.appendChild(listItem);
  listItem.appendChild(btn);

  btn.addEventListener("click", (e) => {
    const listItem = e.target.parentNode;
    total -= Number(listItem.getAttribute("data-price"));
    updateTotal();
    document.ariaNotify(
      `${listItem.getAttribute(
        "data-item",
      )} removed. Total is now £${total.toFixed(2)}.`,
      {
        priority: "high",
      },
    );
    listItem.remove();
  });
}

我們的最後一個程式碼塊向 <form> 添加了一個 submit 事件監聽器。在處理函式內部,我們首先在事件物件上呼叫 preventDefault() 以阻止表單提交。然後,我們呼叫 addItemToList() 在列表中顯示新商品及其價格,將價格新增到 total 變數,呼叫 updateTotal() 更新顯示的總價,然後呼叫 ariaNotify() 宣佈已新增的商品以及新的總價。最後,我們清空當前輸入欄位值,以便新增下一個商品。

js
form.addEventListener("submit", (e) => {
  e.preventDefault();

  addItemToList(item.value, price.value);
  total += Number(price.value);
  updateTotal();

  document.ariaNotify(
    `Item ${item.value}, price £${
      price.value
    }, added to list. Total is now £${total.toFixed(2)}.`,
    {
      priority: "high",
    },
  );

  item.value = "";
  price.value = "";
});

結果

輸出如下:

嘗試啟用螢幕閱讀器,然後新增和刪除一些專案。您應該會聽到螢幕閱讀器朗讀它們。

規範

此特性似乎未在任何規範中定義。

瀏覽器相容性

另見