NDEFRecord: toRecords() method

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.

The toRecords() method of the NDEFRecord interface converts NDEFRecord.data to a sequence of records based on NDEFRecord.recordType, and returns the result. This allows parsing the payloads of record types which may contain nested records, such as smart poster and external type records.

Syntax

js
toRecords()

Parameters

None.

Return value

A list of NDEFRecords.

Exceptions

NotSupported DOMException

Indicates that the User Agent does not know how to parse this combination of NDEFRecord.data and NDEFRecord.recordType.

Examples

Read an external record with an NDEF message as payload

The example uses external type records to create application-defined records. These records may contain an NDEFMessage as payload, with its own NDEFRecord objects, including local types that are used in the context of the application. Notice that the smart poster record type also contains an NDEF message as payload.

Because NDEF gives no guarantee on the ordering of records, using an external type record with an NDEF message as payload can be useful for encapsulating related data.

This example shows how to read an external record for social posts, which contains an NDEFMessage, containing a text record and a record with the local type "act" (action), with a definition borrowed from smart poster, but used in local application context.

js
const ndefReader = new NDEFReader();
await ndefReader.scan();
ndefReader.onreading = (event) => {
  const externalRecord = event.message.records.find(
    (record) => record.type === "example.com:smart-poster",
  );

  let action, text;

  for (const record of externalRecord.toRecords()) {
    if (record.recordType === "text") {
      const decoder = new TextDecoder(record.encoding);
      text = decoder.decode(record.data);
    } else if (record.recordType === ":act") {
      action = record.data.getUint8(0);
    }
  }

  switch (action) {
    case 0: // do the action
      console.log(`Post "${text}" to timeline`);
      break;
    case 1: // save for later
      console.log(`Save "${text}" as a draft`);
      break;
    case 2: // open for editing
      console.log(`Show editable post with "${text}"`);
      break;
  }
};

Specifications

Specification
Web NFC
# dom-ndefrecord-torecords

Browser compatibility

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
toRecords
Experimental

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support
Experimental. Expect behavior to change in the future.