Luk*_*uke 7 html javascript text dom google-chrome-extension
我正在创建一个Google Chrome扩展程序,通过内容脚本和事件页面与网页进行交互.
我有当用户点击被归类为一个元素上出现的上下文菜单选项editable由chrome.contextMenusAPI.
这些选项就像常用文本的快捷方式一样.当用户单击选项时,某些文本将放置在光标位置的元素内.如果用户突出显示文本,则会将其删除.
并非所有可编辑元素都可以以相同方式修改.
如果元素很简单textarea,则可以通过实现此解决方案来实现所需的结果:
但是,我不能假设我正常与正常人交往textarea.
可能的细微差别包括:
文本区域隐藏在一个内部Iframe,这使得查找要与之交互的元素的过程复杂化(document.activeElement可能返回Iframe,而不是实际包含文本的元素).
该<textarea>不会是一个<textarea>/ <input>所有,而是一个contentEditable <div>.该.value方法不能在这种情况下工作.
所以我正在寻找一种灵活的方法,可以优雅地处理所有边缘情况.
document.execCommand('paste')用来修改元素.然而,在尝试之后,这种方法似乎与我最初的方法具有相同的缺点.(请参阅此问题)Iframe问题,并且它不允许您使用特殊的Unicode字符.┻━┻(ヽ(`Д')ノ(┻━┻您的问题包含两个子问题:
有几个API可以帮助识别框架(使用它们的组合,选择最适合您的情况的组合):
contextMenus.onClicked事件将tab的ID(tab.id)作为tabs.top实例中的属性,并将框架的URL(frameUrl)作为单独的对象提供.chrome.tabs.executeScript方法可以直接在框架中运行脚本.frameUrl(或使用下一个方法的组合).chrome.runtime.onMessage使用侦听器插入了内容脚本,请使用chrome.tabs.sendMessage将消息发送到由frameId(自Chrome 41开始)标识的特定帧.chrome.webNavigation.getAllFrames方法获取给定的选项卡中的所有帧的列表tabId,然后frameId通过已知的过滤帧列表来获取目标帧的列表frameUrl.contextMenus.onClicked将获得frameId).好的,假设你有正确的框架,你可以简单地document.activeElement用来获取目标元素,因为输入元素会在点击时集中.
如果目标元素是<textarea>或者<input>,那么您可以简单地使用
// Assume: elem is an input or textarea element.
var YOURSTRING = 'whatever';
var start = elem.selectionStart;
var end = elem.selectionEnd;
elem.value = elem.value.slice(0, start) + YOURSTRING + elem.value.substr(end);
// Set cursor after selected text
elem.selectionStart = start + YOURSTRING.length;
elem.selectionEnd = elem.selectionStart;
Run Code Online (Sandbox Code Playgroud)
否则,您需要知道是否存在内容可编辑元素,如果存在,则删除任何选择(如果存在),最后将所需文本放在那里.
var elem = document.activeElement;
if (elem && elem.isContentEditable) {
// YOURSTRING as defined before
var newNode = document.createTextNode(YOURSTRING);
var sel = window.getSelection();
// Remove previous selection, if any.
sel.deleteFromDocument();
// If there is no range in the selection, add a new one, with the
// caret set to the end of the input element to avoid the next error:
//"Failed to execute 'getRangeAt' on 'Selection': 0 is not a valid index."
if (sel.rangeCount === 0) {
sel.addRange(document.createRange());
sel.getRangeAt(0).collapse(elem, 1);
}
// Insert new text
var range = sel.getRangeAt(0);
range.insertNode(newNode);
// Now, set the cursor to the end of your text node
sel.collapse(newNode, 1);
}
Run Code Online (Sandbox Code Playgroud)
上一个示例中使用的Web平台API的相关文档: