gpt4 book ai didi

javascript - Chrome 扩展替换当前文本区域中的单词

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:56 26 4
gpt4 key购买 nike

我正在尝试制作一个 chrome 扩展来替换当前 <textarea> 中输入的最后一个词当用户做出某个 keydown事件火灾。所以我已经尝试过了,但它并没有真正起作用。

这是我的扩展的文件:

我的分机的 manifest.json :

{
"name": "Test",
"description": "test",
"version": "0.0.1",
"permissions": [
"activeTab"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"browser_action": {
"default_title": "replace test"
},
"manifest_version": 2
}

它的 background.js :

chrome.tabs.executeScript(null, {file: "content_script.js"});

及其content_script.js :

    document.onkeydown = replacePrevWord;  

// Azerty: Ctrl + ²
// Qwerty: Ctrl + '
function KeyPress(e) {
var evtobj = window.event? event : e
if (evtobj.keyCode == 222 && evtobj.ctrlKey)
return true;
}


function getCaretPosition(ctrl) {
var CaretPos = 0; // IE Support
if (document.selection) {
ctrl.focus();
var Sel = document.selection.createRange();
Sel.moveStart('character', -ctrl.value.length);
CaretPos = Sel.text.length;
}
// Firefox support
else if (ctrl.selectionStart || ctrl.selectionStart == '0')
CaretPos = ctrl.selectionStart;
return (CaretPos);
}


function returnWord(text, caretPos) {
var index = text.indexOf(caretPos);
var preText = text.substring(0, caretPos);
if (preText.indexOf(" ") > 0) {
var words = preText.split(" ");
return words[words.length - 1]; //return last word
}
else {
return preText;
}
}


function replacePrevWord() {
if(KeyPress()){
var text = document.activeElement;
var caretPos = getCaretPosition(text)
var word = returnWord(text.value, caretPos);
if (word != null) {
text.value = text.value.replace(word,"replaced");
}
}
}

这在 JSFiddle ( http://jsfiddle.net/cyo646cr/3/ ) 上运行良好,但我不知道如何在 Chrome 扩展程序中执行此操作。

有什么想法吗?

谢谢。

最佳答案

注意:自 2021 年 1 月起,使用 Manifest V3 chrome.scripting.executeScript() scripting许可并移动 <all_urls>host_permissions而不是使用已弃用的 chrome.tabs.executeScript()tabs许可。

问题

您没有正确注入(inject)脚本。说起来容易,因为调用这条简单的线

chrome.tabs.executeScript(null, {file: "content_script.js"});

在你的background.js将导致仅在当前选项卡中一次注入(inject)脚本(因为未指定 tabId)。因此,您的脚本只会在您打开的第一个标签页中针对 Google Chrome 的每个 session 运行一次。

看看the documentation for chrome.tabs.executeScript .

解决方法

要解决这个问题,您有两个选择:

  1. 声明"content_scripts"在你的字段 manifest.json因此它将被注入(inject)任何匹配模式的页面。
  2. 使用 chrome.tabs.onUpdated.addListener 添加监听器方法并将脚本注入(inject)选项卡。

选项1

声明 "content_scripts"在你的字段 manifest.json像这样:

...
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content_script.js"],
"run_at": "document_idle",
"all_frames": true
}
],
...

现在您的内容脚本将被注入(inject)每个页面(因为 "<all_urls>" 将匹配所有页面)和页面的所有框架。您可以找到有关 "content_scripts" 的有用信息here .

选项 2

请求 chrome.tabs 的权限API 和您想要在 manifest.json 中的 URL :

...
"permissions": [
"activeTab",
"tabs",
"<all_urls>"
]
...

在你的background.js , 添加监听器 chrome.tabs.onUpdated ,它将在每个选项卡更新(即 url 更新)时触发,并使用 chrome.tabs.executeScript 注入(inject)您的脚本,像这样:

chrome.tabs.onUpdated.addListener(function(tabID, info, tab) {
chrome.tabs.executeScript(tabID, {file: "content_script.js"});
});

参见 the documentation for chrome.tabs.onUpdated .

关于javascript - Chrome 扩展替换当前文本区域中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26335530/

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