menus.update()

更新先前建立的選單項。

為了與其他瀏覽器相容,Firefox 將此方法同時透過 contextMenusmenus 名稱空間提供。

這是一個非同步函式,返回一個 Promise

語法

js
let updating = browser.menus.update(
  id,               // integer or string
  updateProperties // object
)

引數

id

integerstring。要更新的項的 ID。

updateProperties

object。要更新的屬性。與傳遞給 menus.create()createProperties 物件相同,但 id 不能設定。此外,icons 只能針對選單命令進行更改,而不能針對頂級上下文選單進行更改。頂級圖示會匹配擴充套件在擴充套件清單檔案中宣告的主要圖示。

checked 可選

boolean。複選框或單選按鈕項的初始狀態:選中為 true,未選中為 false。在給定的單選按鈕組中,一次只能選中一個單選按鈕項。

command 可選

string。描述使用者單擊該項時應執行的操作的字串。可識別的值有:

  • "_execute_browser_action":模擬單擊擴充套件的瀏覽器操作,如果它有彈出視窗則開啟它(僅限 Manifest V2)
  • "_execute_action":模擬單擊擴充套件的操作,如果它有彈出視窗則開啟它(僅限 Manifest V3)
  • "_execute_page_action":模擬單擊擴充套件的頁面操作,如果它有彈出視窗則開啟它
  • "_execute_sidebar_action":開啟擴充套件的側邊欄

有關詳細資訊,請參閱清單檔案 commands 中特殊快捷方式的文件。

當指定了可識別的值之一時,單擊該項不會觸發 menus.onClicked 事件;而是觸發預設操作,例如開啟彈出視窗。否則,單擊該項將觸發 menus.onClicked,然後可以使用該事件來實現備用行為。

contexts 可選

array of menus.ContextType。此選單項將顯示的上下文陣列。如果省略此選項

  • 如果項的父項設定了上下文,則此項將繼承其父項的上下文
  • 否則,該項將獲得一個上下文陣列 ["page"]。
documentUrlPatterns 可選

array of string。允許您限制該項僅應用於 URL 與給定 匹配模式之一匹配的文件。這也適用於框架。

enabled 可選

boolean。此選單項是否啟用或停用。預設為 true

icons 可選

object。一個或多個要顯示在該項旁邊的自定義圖示。自定義圖示只能為出現在子選單中的項設定。此屬性是一個物件,其中為每個提供的圖示都有一個屬性:屬性的名稱應包含圖示的畫素大小,而 path 相對於擴充套件根目錄的圖示。瀏覽器會嘗試為正常顯示選擇一個 16x16 畫素的圖示,或為高密度顯示選擇一個 32x32 畫素的圖示。為避免任何縮放,您可以這樣指定圖示

js
browser.menus.create({
  icons: {
    16: "path/to/geo-16.png",
    32: "path/to/geo-32.png",
  },
});

或者,您可以指定一個單一的 SVG 圖示,它將被適當地縮放

js
browser.menus.create({
  icons: {
    16: "path/to/geo.svg",
  },
});

注意: 頂級選單項使用清單中指定的 圖示,而不是此鍵指定的圖示。

id 可選

string。要為此項分配的唯一 ID。對於事件頁面是必需的。不能與此擴充套件的另一個 ID 相同。

onclick 可選

function。單擊選單項時呼叫的函式。事件頁面不能使用此函式:它們應該註冊一個 menus.onClicked 的監聽器。

parentId 可選

integerstring。父選單項的 ID;這使得該項成為先前新增項的子項。注意:如果您建立了多個選單項,這些項將放置在子選單中。子選單的父項將以擴充套件的名稱標記。

targetUrlPatterns 可選

array of string。與 documentUrlPatterns 類似,但允許您基於 anchor 標籤的 href 以及 img/audio/video 標籤的 src 屬性進行過濾。此引數支援任何 URL 方案,即使是通常不允許在匹配模式中使用的方案。

title 可選

string。要在該項中顯示的文字。除非 type 是 "separator",否則是必需的。

您可以在字串中使用 %s。如果您在選單項中使用此功能,並且當選單顯示時頁面上選擇了一些文字,那麼選中的文字將被插入到標題中。例如,如果 title 是 "Translate '%s' to Pig Latin",使用者選擇了單詞 "cool" 然後激活了選單,那麼選單項的標題將是:"Translate 'cool' to Pig Latin"。

如果標題包含一個 ampersand "&",則下一個字元將用作該項的訪問鍵,ampersand 不會顯示。例外情況是

  • 如果下一個字元也是一個 ampersand:則會顯示一個 ampersand,並且不會設定訪問鍵。實際上,"&&" 用於顯示一個 ampersand。
  • 如果下一個字元是插值指令 "%s":則 ampersand 不會顯示,也不會設定訪問鍵。
  • 如果 ampersand 是標題中的最後一個字元:則 ampersand 不會顯示,也不會設定訪問鍵。

只有第一個 ampersand 將用於設定訪問鍵:後續的 ampersands 不會顯示,但也不會設定鍵。因此 "&A and &B" 將顯示為 "A and B" 並將 "A" 設定為訪問鍵。

type 可選

menus.ItemType。選單項的型別:"normal"(普通)、"checkbox"(複選框)、"radio"(單選按鈕)、"separator"(分隔符)。預設為 "normal"。

viewTypes 可選

extension.ViewType。選單項將顯示在該檢視型別列表。預設為任何檢視,包括沒有 viewType 的檢視。

visible 可選

boolean。該項是否顯示在選單中。預設為 true

返回值

一個 Promise,如果更新成功,它將以無引數的形式 fulfilled;如果更新失敗,它將以錯誤訊息的形式 rejected。

示例

此示例建立了一個選單項,然後在使用者單擊它時更新其標題

js
function onUpdated() {
  console.log("item updated successfully");
}

function onError() {
  console.log("error updating item:", browser.runtime.lastError);
}

browser.menus.create({
  id: "do-not-click-me",
  title: "Do not click this button",
  contexts: ["all"],
});

browser.menus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "do-not-click-me") {
    let updating = browser.menus.update(info.menuItemId, {
      title: "Do not click this button again",
    });
    updating.then(onUpdated, onError);
  }
});

擴充套件程式示例

瀏覽器相容性

注意: 此 API 基於 Chromium 的 chrome.contextMenus API。本文件摘自 Chromium 程式碼中的 context_menus.json