是否有可能在Firefox中为输入框获取类似选择事件的事件?

时间:2017-08-18 13:31:57

标签: javascript firefox

如何在Firefox中的input框中获取所选文本?

这显然是JavaScript在Chrome和Firefox之间的工作方式的根本区别。重现:

  • 导航至www.google.com
  • 打开JS控制台
  • 键入以下行:document.addEventListener("selectionchange", () => console.log(document.getSelection().toString()))
  • 输入" text"进入谷歌搜索框并执行命中输入
  • 使用鼠标选择" text"的不同部分。在搜索框中

在Chrome中,您会看到为input元素中的所选文字引发的事件。这在使用input字段的各种网页中是一致的。在Firefox中,会针对input之外的选择引发事件,但是当选中框中的文本时,不会引发任何事件。

我没有在任何Mozilla文档中找到任何明确的引用差异,也没有在任何其他网页上找到它。

相关但不同的问题

Firefox Web Extension “selectionchange”是一个较旧的问题,dom.select_events.enabled配置属性现在默认为FF 56中的true。还有第二个配置属性,dom.select_events.textcontrols.enabled似乎是我正在寻找什么,但将该值更改为true似乎没有任何效果。

其他信息(编辑1)

显然,甚至没有办法在FF的文本框中获取所选文本?以下代码也不起作用:

setInterval(() => console.log(document.getSelection().toString()), 1000)

在FF中,这将永远不会返回输入字段中的选定文本。在Chrome中,它会。

这只是FF中的功能差距吗?没有其他方法可以从表单字段中提取所选文本吗?

3 个答案:

答案 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 [俄语] 的回答)