【问题标题】:How to change CSS of selected text using Google Chrome Extension如何使用 Google Chrome 扩展更改所选文本的 CSS
【发布时间】:2014-11-20 18:39:29
【问题描述】:

我正在为 Chrome 浏览器制作一个扩展,它使用 contextMenus 来更改所选文本的 CSS。

但我无法访问 HTML 结构,即所选文本的 parentNode,因为我可以在此示例中轻松完成。

var selection = window.getSelection();

如果在浏览器中默认使用,这将返回所选文本的 parentNode,我可以在以后使用它来更改 CSS。

如何使用 Chrome 浏览器扩展来实现这一点?

【问题讨论】:

  • 鉴于您的赏金评论,您尝试了什么?
  • 我已经在问题中提到过.. @Xan

标签: javascript css google-chrome google-chrome-extension selection


【解决方案1】:

由于 Chrome 不允许您使用上下文菜单与您单击的元素进行交互,因此您必须创建一个 content script 来存储最后一个被右键单击的元素在页面上,因此当用户右键单击任何元素时,您将能够使用它。

首先您必须创建一个save_last_element.js 内容脚本,如下所示:

var LAST_SELECTION,
    LAST_ELEMENT;

document.body.addEventListener('contextmenu', function(e) {
    LAST_SELECTION = window.getSelection();
    LAST_ELEMENT = e.target;
    // this will update your last element every time you right click on some element in the page
}, false);

然后你将它添加到你的manifest.json:

"permissions": ["*://*/*"],
"content_scripts": [
    {
        "matches": ["*://*/*"],
        "js": ["/path/to/save_last_element.js"],
        "run_at": "document_idle",
        "all_frames": true
    }
]

现在,当在页面中注入脚本时,您将能够使用 LAST_SELECTIONLAST_ELEMENT 变量来引用最后一次右键单击的元素并编辑其 CSS 或任何您想要的内容。

在您的background.js 中,您应该这样做:

function handler(info, tab) {
    // here you can inject a script inside the page to do what you want
    chrome.tabs.executeScript(tab.id, {file: '/path/to/script.js', allFrames: true});
}

chrome.runtime.onInstalled.addListener(function() {
    chrome.contextMenus.create({
        "title": "Some title",
        "contexts": ["all"],
        "documentUrlPatterns": ["*://*/*"],
        "onclick": handler
    });
});

请注意,上下文菜单是在 chrome.runtime.onInstalled 监听器中注册的,因为上下文菜单注册是持久的,只需要在安装扩展程序时完成。

最后,在您的 script.js 文件中:

if (LAST_SELECTION) {
    // do whatever you want with the information contained in the selection object
}
if (LAST_ELEMENT) {
    // do whatever you want with the element that has been right-clicked
}

【讨论】:

  • 您还可以使用消息传递在注入脚本和后台脚本之间传递数据。 developer.chrome.com/extensions/messaging
  • 那更慢。当用户单击上下文菜单项时,您可以在不发送任何消息的情况下注入脚本,它会正常工作。
  • 是的,但是如果您想传递其他参数,您可能需要消息传递,否则您需要为每种情况使用单独的脚本,不是吗?
  • Messaging只是做这种事情的另一种方式,你可以选择你最喜欢的方式。无需发送消息即可更轻松地解决 OP 的请求。
  • 没有“简单”的方法可以做到这一点。这是谷歌扩展的弱点之一
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2022-11-11
  • 2014-05-07
  • 2018-05-02
  • 2022-07-11
  • 2013-10-28
  • 2023-03-26
相关资源
最近更新 更多