input
框中获取所选文本?这显然是JavaScript在Chrome和Firefox之间的工作方式的根本区别。重现:
document.addEventListener("selectionchange", () => console.log(document.getSelection().toString()))
在Chrome中,您会看到为input
元素中的所选文字引发的事件。这在使用input
字段的各种网页中是一致的。在Firefox中,会针对input
之外的选择引发事件,但是当选中框中的文本时,不会引发任何事件。
我没有在任何Mozilla文档中找到任何明确的引用差异,也没有在任何其他网页上找到它。
Firefox Web Extension “selectionchange”是一个较旧的问题,dom.select_events.enabled
配置属性现在默认为FF 56中的true
。还有第二个配置属性,dom.select_events.textcontrols.enabled
似乎是我正在寻找什么,但将该值更改为true
似乎没有任何效果。
显然,甚至没有办法在FF的文本框中获取所选文本?以下代码也不起作用:
setInterval(() => console.log(document.getSelection().toString()), 1000)
在FF中,这将永远不会返回输入字段中的选定文本。在Chrome中,它会。
这只是FF中的功能差距吗?没有其他方法可以从表单字段中提取所选文本吗?
答案 0 :(得分:0)
基于this answer,我能够创建以下内容:
window.addEventListener('mouseup', function () {
selection = getSelectedText();
});
function getSelectedText() {
let elem = document.activeElement;
let elemType = elem ? elem.tagName.toLowerCase() : 'none';
if (elemType === 'input' || elemType === 'textarea') {
return elem.value.substr(elem.selectionStart, elem.selectionEnd - elem.selectionStart);
}
if (window.getSelection) {
return window.getSelection().toString();
}
if (document.selection && document.selection.type !== 'Control') {
return document.selection.createRange().text;
}
return '';
}
到目前为止,我的测试表明,这似乎适用于Chrome和Firefox。
答案 1 :(得分:0)
对我来说,在firefox中设置dom.select_events.textcontrols.enabled不会启用textarea更改内的document.addEventListener("selectionchange"...
个事件,但启用的却是<textarea onselectionchange="...">
。
通过将两者都添加处理程序并切换该firefox标志,您应该获得在Chrome,Safari和Edge(通过documentselectchange)和Firefox(通过textarea onselectionchange)中可以使用的功能。
答案 2 :(得分:0)
我无法从 Firefox (86) 的输入或文本区域检测到 document.onselectionchange
事件,但我我能够检测到 select
事件文本区域本身 (onselect
)。
(感谢this post [俄语] 的回答)