NDEFReader:write() 方法

可用性有限

此功能不是基线,因为它不适用于某些使用最广泛的浏览器。

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在支持的浏览器中部分或全部可用。

实验性:这是一个实验性技术
在生产环境中使用此功能之前,请仔细查看浏览器兼容性表

NDEFReader 接口的 write() 方法尝试将 NDEF 消息写入标签,并返回一个Promise,该 Promise 在消息写入标签后解析,或在遇到硬件或权限错误时拒绝。如果之前没有授予“nfc”权限,此方法将触发权限提示。

语法

js
write(message)
write(message, options)

参数

message

要写入的消息,可以是字符串、ArrayBufferTypedArrayDataView 或记录数组。记录具有以下成员

data 可选

包含要传输的数据,可以是字符串、ArrayBufferTypedArrayDataView 或嵌套记录数组

encoding 可选

指定记录编码的字符串。

id 可选

开发人员为记录定义的标识符。

lang 可选

根据RFC 5646:标识语言的标签(也称为 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 在消息写入标签后解析,或在遇到硬件或权限错误时拒绝。

异常

此方法不会抛出异常;而是拒绝返回的 promise,并传递一个DOMException,其 name 是以下值之一

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 ctlr = new AbortController();
    ctlr.signal.onabort = () => reject("Time is up, bailing out!");
    setTimeout(() => ctlr.abort(), timeout);

    ndef.addEventListener(
      "reading",
      (event) => {
        ndef.write(data, { signal: ctlr.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 API
# dom-ndefreader-write

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。