javascript - 如何用 Chrome 扩展上下文菜单替换输入字段选定的文本?

标签 javascript google-chrome-extension

我正在寻找一个简单的解决方案来使用上下文菜单触发器更改输入字段值。

假设更改为 bar 就足够了,稍后我会尝试添加一些处理。

This is how it should work

manifest.json:

{
  "manifest_version": 2,
  "background" : { "scripts": ["background.js"] },
  "permissions": [ "contextMenus", "http://*/*", "https://*/*" ],
  "name": "test plugin",
  "version": "0.1"
}

背景.js:

function getClickHandler() {
  //magic here
};

chrome.contextMenus.create({
  "title" : "change to 'bar'",
  "type" : "normal",
  "contexts" : ["editable"],
  "onclick" : getClickHandler()
});

最佳答案

基本思想是

  1. contextmenu内容脚本和记录中的事件 e.target (这是必需的,因为我们不知道 chrome 上下文菜单 api 的实际 DOM 节点,请参阅 Issue 39507 ) 我们可以直接使用 document.activeElement ,因为输入元素在点击时获得焦点
  2. 在后台页面中,当 getClickHandler 时向内容脚本发送消息被触发
  3. 在内容脚本中,将 target.value 替换为 "bar"

示例代码:

list .json

{
  "manifest_version": 2,
  "background" : { "scripts": ["background.js"] },
  "permissions": [ "contextMenus", "http://*/*", "https://*/*" ],
  "name": "test plugin",
  "version": "0.1",
  "content_scripts": [
    {
      "matches": [
        "*://*/*"
      ],
      "js": [
        "content.js"
      ],
      "all_frames": true
    }
  ]
}

内容.js

chrome.runtime.onMessage.addListener(function (request) {
    replaceSelectedText(document.activeElement, request.text);
});

function replaceSelectedText(elem, text) {
    var start = elem.selectionStart;
    var end = elem.selectionEnd;
    elem.value = elem.value.slice(0, start) + text + elem.value.substr(end);
    elem.selectionStart = start + text.length;
    elem.selectionEnd = elem.selectionStart;
}

背景.js

function getClickHandler(info, tab) {
    chrome.tabs.sendMessage(tab.id, {text: "bar"});
};

chrome.contextMenus.create({
  "title" : "change to 'bar'",
  "type" : "normal",
  "contexts" : ["editable"],
  "onclick" : getClickHandler
});

已更新

正如 @Xan 在评论中提到的,如果您只想更新 <input>字段,然后使用 input.value = xxx没问题;但是,如果您想操作任意可编辑元素,请参阅 Is there a flexible way to modify the contents of an editable element?获取更多想法。

关于javascript - 如何用 Chrome 扩展上下文菜单替换输入字段选定的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38220320/

相关文章:

javascript - 如何构建我的应用程序以在网站上运行时使用 localStorage,而在作为 Chrome 应用程序运行时使用 chrome.storage?

javascript - X 轴日期格式 dygraph

javascript - 使用 angularjs 动态改变立方体尺寸

javascript - 在angularJS中打开过滤器时如何显示或隐藏?

javascript - Chrome 扩展 - 从网页中检索全局变量

javascript - 如何在使用存储关闭 chrome 扩展弹出窗口后保留更改

javascript - 在没有 $routeProvider 和 $location 的情况下使用 angularjs?

javascript - 如何禁用 &lt;input&gt; 提交但不输入

javascript - 无法在 Node js 中设置超时

javascript - javascript(或浏览器扩展)如何检测受限功能的使用?