gpt4 book ai didi

javascript - Chrome 扩展 "contextMenus.create"标题属性验证器?

转载 作者:行者123 更新时间:2023-12-02 15:32:14 24 4
gpt4 key购买 nike

我正在尝试根据选择显示不同的菜单文本:

manifest.js:

{
"name": "Test app",
"description": "",
"version": "1.0.1",
"icons": {"16": "icons/16.png", "48": "icons/48.png", "128": "icons/128.png"},
"permissions": ["contextMenus"],
"background": {
"scripts": ["js/test.js"],
"persistent": true
},
"manifest_version": 2
}

js/test.js

function validateSelection(number) {
if (parseInt(number) > 5) {
return "Result: x > 5; (x = " + number +")";
} else {
return "Result: x <= 5; (x = " + number +")";
}
}

var s_item = chrome.contextMenus.create({"title" : validateSelection("%s") + " => Selection: %s",
"contexts": ["selection"],
"onclick" : genericOnClick,
"enabled" : true
});

但是,无论我选择什么数字,我总是会从 else 获得输出。我的 validateSelection() 中的条款功能。传递给我的函数的是什么类型的对象,是string吗? ?否则我如何验证 selection

  1. Selected number = 4


  2. Selected number = 9

最佳答案

您传递一个文字字符串 "%s"validateSelection ,所以parseInt("%s")NaN这就是为什么 else分支总是被执行。这是一个立即执行的函数,它有效地返回 Result: x > 5; (x = %s)并且该字符串用于一次性创建菜单项。然后每次您调用菜单时,Chrome 都会简单地展开 %s当显示菜单时。它没有也不能通过这个%s再次进入validateSelection因为它不是回调,所以它是根据 JavaScript 语法立即执行的函数。

上下文菜单标题不是动态的,并且标题没有函数回调参数。

要动态更改它,请定义 content script将被注入(inject) <all_urls>selectionchanged事件监听器将在显示之前更改上下文菜单标题。

内容脚本:

document.addEventListener("selectionchange", function(e) {
chrome.runtime.sendMessage({selection: getSelection().toString()});
});

后台脚本:

chrome.contextMenus.create({id: "menuSel", title: "", contexts: ["selection"]});

chrome.contextMenus.onClicked.addListener(function(info, tab) {
.......
});

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if ("selection" in msg) {
chrome.contextMenus.update("menuSel", {title: validateSelection(msg.selection)});
}
});

陷阱是,如果您在一个选项卡中选择某些内容而不调用上下文菜单,然后切换到另一个选项卡并选择某些内容,然后切换回来并立即右键单击已选择的文本,结果将是错的。不过,这可以在 chrome.tabs.onActivated 中处理。后台脚本中的监听器(可能需要在manifest.json中"permissions: ["tabs"]):

chrome.tabs.onActivated.addListener(function(info) {
chrome.tabs.executeScript(info.tabId, {code: "getSelection().toString()"},
function(results) {
chrome.contextMenus.update("menuSel", {title: validateSelection(results[0])});
}
);
});

如果您想让它在框架/iframe 上工作,请使用 allFrames: true executeScript中的参数并确定哪个帧处于事件状态。

关于javascript - Chrome 扩展 "contextMenus.create"标题属性验证器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com