Chrome扩展程序替换当前textarea中的单词
我正在尝试制作一个chrome扩展名,用于替换当前键入的最后一个单词,当用户发出某个
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扩展程序中执行此操作。
有任何想法吗?
谢谢。
问题
您没有正确注入脚本。 很容易说,因为这个简单的线路
chrome.tabs.executeScript(null, {file: "content_script.js"});
在你的background.js
中,只会在当前标签中注入一次脚本(因为没有指定tabId)。 因此,在您打开的第一个标签中,您的脚本只会针对Google Chrome的每个会话运行一次 。
看一下chrome.tabs.executeScript
的文档 。
解决
要解决此问题,您有两个选择:
- 在
manifest.json
声明"content_scripts"
字段,以便将其注入到与模式匹配的任何页面中。 - 使用
chrome.tabs.onUpdated.addListener
方法添加侦听器,并在选项卡上注入脚本。
选项1
在manifest.json
声明"content_scripts"
字段,如下所示:
... "content_scripts": [ { "matches": [""], "js": ["content_script.js"], "run_at": "document_idle", "all_frames": true } ], ...
现在,您的内容脚本将被注入每个页面(因为"
将匹配所有页面)和页面的所有帧。 您可以在此处找到有关"content_scripts"
有用信息。
选项2
在manifest.json
请求chrome.tabs
API和所需URL的权限:
... "permissions": [ "activeTab", "tabs", "" ] ...
在你的background.js
,为chrome.tabs.onUpdated
添加一个监听器,它将在每个选项卡更新(即url update)上触发,并使用chrome.tabs.executeScript
注入你的脚本,如下所示:
chrome.tabs.onUpdated.addListener(function(tabID, info, tab) { chrome.tabs.executeScript(tabID, {file: "content_script.js"}); });
请参阅chrome.tabs.onUpdated
的文档 。