Javascript WebView错误-替换ContentEditable中的选定文本

Javascript WebView错误-替换ContentEditable中的选定文本,javascript,android,webview,contenteditable,Javascript,Android,Webview,Contenteditable,事情是这样的。我有一个显示contenteditable div的WebView。现在,当我选择文本时,一切都很好,通过javascript界面我可以看到该文档。getSelection()返回它应该返回的内容。但是,当我键入某个内容时,而不是替换当前节点中的选定文本,它似乎会替换第一个节点中相应偏移处的文本。例如,如果我有 Blah1 Blah2 Blah3 Blah4 然后我选择“ah4”并键入“q”,我的结果是 Blq Blah2 Blah3 Blah4 而不是 Blah1 Blah2

事情是这样的。我有一个显示contenteditable div的WebView。现在,当我选择文本时,一切都很好,通过javascript界面我可以看到该文档。getSelection()返回它应该返回的内容。但是,当我键入某个内容时,而不是替换当前节点中的选定文本,它似乎会替换第一个节点中相应偏移处的文本。例如,如果我有

Blah1
Blah2
Blah3
Blah4
然后我选择“ah4”并键入“q”,我的结果是

Blq
Blah2
Blah3
Blah4
而不是

Blah1
Blah2
Blah3
Blq
我注意到,如果我在模拟器上用硬件键盘而不是软键盘运行它,它工作得很好

我试图截获事件以手动执行操作,但无论是
onkeylister
还是javascript
onKeyDown
还是
onKeyPress
在替换文本时都没有注册事件。Javascript
onInput
寄存器,但仅在发生替换之后

有没有办法绕过这个问题


进一步资料:


事实证明,当选中文本并按下软键盘上的某个键时,该按键不会通过活动的dispatchKeyEvent方法。我假设这种差异是小故障发生的根本原因。有人知道为什么会发生这种情况,以及为什么会导致故障吗?我要去看看我是否能追踪代码执行的路径。

哈!找到了解决办法!在android源代码中进行了太多的修改之后,我最终尝试了以下方法:将WebView子类化,并覆盖以下方法:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    return new BaseInputConnection(this, false);
}

就这样!诚然,选择(蓝色条纹)在您键入后会在视觉上停留,但它至少会替换您期望的文本,并且条纹不会影响任何内容。而且,它以前也这样做过。我希望也有一种相当简单的方法来消除它。

如果在活动中重写
dispatchKeyEvent
方法,它将接收关键事件。至于您的实际问题,这可能是webview中的一个bug。然而,我不知道如何避免这种情况。@Randy-Hmm,实际上,这是一件值得尝试的事情-当选择文本时,软键盘上的下一次按键不会通过
dispatchKeyEvent
,并产生故障行为。这很奇怪,也很好知道。我有一个应用程序已经实现了对键盘“楔子”的支持,这将打破它:/好吧,只有在contenteditable div中特别选择文本时才会发生,但我不知道。