WindowSharedStorage: selectURL() 方法

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

WindowSharedStorage 接口的 selectURL() 方法会执行一个 URL 选择操作,该操作在当前源的 SharedStorageWorklet 中添加的模块中注册。

注意: URL 选择输出门用于根据共享存储数据,从提供的列表中选择一个 URL 展示给用户。

语法

js
selectURL(name, urls)
selectURL(name, urls, options)

参数

name

一个字符串,表示在共享存储 worklet 模块中注册的操作名称。它必须与使用 SharedStorageWorkletGlobalScope.register() 注册操作时给定的名称匹配。

URLs

一个对象数组,表示 URL 选择操作可在其中选择的 URL。每个对象包含两个属性:

url

一个字符串,表示 URL。

reportingMetadata 可选

一个对象,其中属性名是事件类型,属性值是指向报告目的地的 URL,例如 "click" : "my-reports/report1.html"。这些 URL 用作类型为 "shared-storage-select-url" 的报告的目的地,通常通过 Fence.reportEvent()Fence.setReportEventDataForAutomaticBeacons() 方法调用提交。

options 可选

一个选项对象,可以包含以下属性:

data 可选

一个对象,表示执行操作所需的任何数据。

keepAlive 可选

一个布尔值。如果设置为 true,则会保留关联 worklet 的 SharedStorageWorkletGlobalScope,并且可以再次运行该操作。因此,您需要为每个非最后一次使用的操作设置 keepAlivetrue。默认值 false 表示在运行操作后 SharedStorageWorkletGlobalScope 将被终止,且无法再次运行。

resolveToConfig 可选

一个布尔值。如果设置为 true,则 run() 返回的 Promise 的 fulfilled 值将是一个 FencedFrameConfig 对象,可用于通过其 config 属性将内容加载到 <fencedframe> 中。默认值 false 表示 fulfilled 值将是一个可用于将内容加载到 <iframe> 中的 URL。

返回值

一个 Promise,根据 resolveToConfig 选项的值,它会以 FencedFrameConfig 对象或表示 URL 的字符串进行 fulfilled。

异常

TypeError

在以下情况下抛出

  • 尚未通过 addModule() 添加 worklet 模块。
  • urls 为空或超出了允许的最大长度(具体取决于浏览器)。
  • 某个对象的 url 属性包含一个无效的 URL。
  • 共享存储已被禁用(例如,通过浏览器设置)。
  • 调用站点未在成功的 隐私沙盒注册流程中包含共享存储 API。

示例

基本 A/B 测试

js
// Randomly assigns a user to a group 0 or 1
function getExperimentGroup() {
  return Math.round(Math.random());
}

async function injectContent() {
  // Add the module to the shared storage worklet
  await window.sharedStorage.worklet.addModule("ab-testing-worklet.js");

  // Assign user to a random group (0 or 1) and store it in shared storage
  window.sharedStorage.set("ab-testing-group", getExperimentGroup(), {
    ignoreIfPresent: true,
  });

  // Run the URL selection operation
  const fencedFrameConfig = await window.sharedStorage.selectURL(
    "ab-testing",
    [
      { url: `https://your-server.example/content/default-content.html` },
      { url: `https://your-server.example/content/experiment-content-a.html` },
    ],
    {
      resolveToConfig: true,
    },
  );

  // Render the chosen URL into a fenced frame
  document.getElementById("content-slot").config = fencedFrameConfig;
}

injectContent();

有关此示例的详细介绍以及其他示例的链接,请参阅 共享存储 API 登录页。

规范

此特性似乎未在任何规范中定义。

浏览器兼容性

另见