上下文菜单数组?

Context Menu array?

我为公司网站编写了一个简单的扩展程序,它可以读取项目数组,并在我将鼠标悬停在项目标题上时提醒它。这非常有效,但这不是我要找的:

let projects = document.getElementsByClassName("project-name");


extract_data = function() {
    let title = this.getElementsByClassName("project-name ng-binding")[0].getAttribute("title")
    alert(title);
};

 for (var i = 0; i < projects.length; i++) {
    projects[i].addEventListener('mouseover', extract_data, false);
}

我想稍微修改我的代码,而不是在鼠标悬停时发出警报,而是将警报作为选项添加到 Chrome 上下文菜单中。类似于:

 chrome.contextMenus.create({
     title: "Alert Project Title",
     contexts:["selection"],  // ContextType
     onclick: extract_data // A callback function
 });

这不太正确,因为我需要将上下文菜单更改为依赖于项目行,正如现在所写的那样,上下文菜单没有对 projects 的引用。

有什么简单的方法可以改变我的 mouseover 成为 contextMenu 的值吗?

如果您希望菜单显示带有所选项目标题的项目,我认为您运气不好。我不相信有办法做到这一点。

但是如果你想让菜单显示你选择的项目,试试这个。

 chrome.contextMenus.create({
    "id": "1",
     title: "Do you want to alert '%s' project title",
    "contexts": ["selection"],
    "documentUrlPatterns": [...],
     onclick: extract_data // A callback function
 })

也许是我操之过急

如果您希望菜单显示带有所选项目标题的项目(不是所选文本) 如果您想将 ALERT 作为单个上下文菜单项 onclick 事件移动 我认为你有机会!

但是您必须声明性地

注入内容脚本
/* in manifest.json */
...
"content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["cs.js"],
    "run_at": "document_idle"
}]
...


/* in content script "cs.js" */
function extract_data() {
    var title = this.getElementsByClassName("project-name ng-binding")[0].getAttribute("title");
    chrome.runtime.sendMessage({'title': title}, resp =>
        console.log('backgroung script has received the message and send back this message: ' + resp.msg)
    )    
}
var projects = document.getElementsByClassName("project-name");
for (var i = 0; i < projects.length; i++)
    projects[i].addEventListener('mouseover', extract_data, false)


/* in background script */
function createMenu() {
    chrome.contextMenus.create({
        'id': '1',
        'title': 'Alert Project Title',
        'contexts': ["selection"],
        'documentUrlPatterns': ["<all_urls>"],
        'enabled': false
    }, _ => {
        if (chrome.runtime.lastError) {} else {}
    })
}
function handleInstalled(details) {
    createMenu()
}
chrome.runtime.onInstalled.addListener(handleInstalled);
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
    chrome.contextMenus.update(
        '1',
        {
            "title": "Do you want to alert " + msg.title + " project title",
            'contexts': ["selection"],
            'documentUrlPatterns': ["<all_urls>"],
            "enabled": true,
            "onclick": _ => alert(msg.title)
        },
        _ => {
            sendResponse( {'msg': chrome.runtime.lastError ? 'Some error...' : 'Fine!' } )
        }
    )
    return true
})