NDEFReader: write() 方法

可用性有限

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

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

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

NDEFReader 介面的 write() 方法嘗試將 NDEF 訊息寫入標籤,並返回一個 Promise。該 Promise 在訊息成功寫入標籤後解析,或者在遇到硬體或許可權錯誤時拒絕。如果尚未授予“nfc”許可權,此方法會觸發一個許可權提示。

語法

js
write(message)
write(message, options)

引數

message

要寫入的訊息,可以是字串、ArrayBufferTypedArrayDataView,或記錄陣列。記錄包含以下成員:

data 可選

包含要傳輸的資料,可以是字串、ArrayBufferTypedArrayDataView,或巢狀記錄的陣列。

encoding 可選

指定記錄編碼的字串。

id 可選

為記錄定義的識別符號。

lang 可選

有效的 BCP 47 語言標籤

mediaType 可選

有效的 MIME 型別

recordType

指示 data 中儲存的資料型別的字串。它必須是以下值之一:

"absolute-url"

資料的絕對 URL。

"empty"

NDEFRecord 為空。

"mime"

有效的 MIME 型別

"smart-poster"

根據 NDEF-SMARTPOSTER 規範定義的智慧海報。

"text"

根據 NDEF-TEXT 規範定義的文字。

"unknown"(未知)

記錄型別未知。

"URL"

根據 NDEF-URI 規範定義的 URL。

options 可選

具有以下屬性的物件:

overwrite

一個布林值,指定是否應覆蓋現有記錄(如果存在)。

signal 可選

一個 AbortSignal,允許取消當前的寫入操作。

返回值

一個 Promise,在訊息成功寫入標籤後解析,或者在遇到硬體或許可權錯誤時拒絕。

異常

此方法不丟擲異常;相反,它會拒絕返回的 Promise,並傳遞一個 name 為以下之一的 DOMException

AbortError

options 引數中傳遞的 AbortSignal 中止了掃描操作。

NotAllowedError

此操作的許可權被拒絕,或者 overwritefalse 且標籤上已存在記錄。

NotSupportedError

沒有與 Web NFC 相容的 NFC 介面卡,或者可用的 NFC 介面卡不支援訊息推送,或者無法建立連線。

NotReadableError

UA 未被允許訪問底層 NFC 介面卡(例如,由於使用者偏好)。

NetworkError

傳輸在開始後失敗(例如,標籤已從讀卡器移除)。

示例

寫入文字字串

以下示例展示瞭如何將字串寫入 NFC 標籤並處理髮生的任何錯誤。

js
const ndef = new NDEFReader();
ndef
  .write("Hello World")
  .then(() => {
    console.log("Message written.");
  })
  .catch((error) => {
    console.log(`Write failed :-( try again: ${error}.`);
  });

寫入 URL

以下示例展示瞭如何將記錄物件(如上所述)寫入 NFC 標籤並處理髮生的任何錯誤。

js
const ndef = new NDEFReader();
try {
  await ndef.write({
    records: [{ recordType: "url", data: "http://example.com/" }],
  });
} catch {
  console.log("Write failed :-( try again.");
}

安排帶有超時的寫入

有時為寫入操作設定時間限制很有用。例如,您要求使用者觸控一個標籤,但在一定時間內未找到任何標籤,然後您將超時。

js
const ndef = new NDEFReader();
ndef.onreading = (event) => console.log("We read a tag!");

function write(data, { timeout } = {}) {
  return new Promise((resolve, reject) => {
    const controller = new AbortController();
    controller.signal.onabort = () =>
      reject(new Error("Time is up, bailing out!"));
    setTimeout(() => controller.abort(), timeout);

    ndef.addEventListener(
      "reading",
      (event) => {
        ndef.write(data, { signal: controller.signal }).then(resolve, reject);
      },
      { once: true },
    );
  });
}

await ndef.scan();
try {
  // Let's wait for 5 seconds only.
  await write("Hello World", { timeout: 5_000 });
} catch (err) {
  console.error("Something went wrong", err);
} finally {
  console.log("We wrote to a tag!");
}

規範

規範
Web NFC
# dom-ndefreader-write

瀏覽器相容性