[英]How to replace input field selected text with Chrome extension context menu?
我正在尋找一種使用上下文菜單觸發器更改輸入字段值的簡單解決方案。
假設更改為bar
就足夠了,稍后我將嘗試添加一些處理。
manifest.json:
{
"manifest_version": 2,
"background" : { "scripts": ["background.js"] },
"permissions": [ "contextMenus", "http://*/*", "https://*/*" ],
"name": "test plugin",
"version": "0.1"
}
background.js:
function getClickHandler() {
//magic here
};
chrome.contextMenus.create({
"title" : "change to 'bar'",
"type" : "normal",
"contexts" : ["editable"],
"onclick" : getClickHandler()
});
基本思想是
contextmenu
事件並記錄e.target
(這是必需的,因為我們不知道chrome上下文菜單api的實際DOM節點,請參見問題39507 ) document.activeElement
,因為輸入元素專注於單擊 getClickHandler
時向內容腳本發送消息 "bar"
樣例代碼:
manifest.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
}
]
}
content.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;
}
background.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
; 但是,如果您想操縱任意可編輯元素,請參見是否有靈活的方法來修改可編輯元素的內容? 了解更多想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.