Javascript WebView错误-替换ContentEditable中的选定文本
事情是这样的。我有一个显示contenteditable div的WebView。现在,当我选择文本时,一切都很好,通过javascript界面我可以看到该文档。getSelection()返回它应该返回的内容。但是,当我键入某个内容时,而不是替换当前节点中的选定文本,它似乎会替换第一个节点中相应偏移处的文本。例如,如果我有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
Blah1
Blah2
Blah3
Blah4
然后我选择“ah4”并键入“q”,我的结果是
Blq
Blah2
Blah3
Blah4
而不是
Blah1
Blah2
Blah3
Blq
我注意到,如果我在模拟器上用硬件键盘而不是软键盘运行它,它工作得很好
我试图截获事件以手动执行操作,但无论是onkeylister
还是javascriptonKeyDown
还是onKeyPress
在替换文本时都没有注册事件。JavascriptonInput
寄存器,但仅在发生替换之后
有没有办法绕过这个问题
进一步资料:
事实证明,当选中文本并按下软键盘上的某个键时,该按键不会通过活动的dispatchKeyEvent方法。我假设这种差异是小故障发生的根本原因。有人知道为什么会发生这种情况,以及为什么会导致故障吗?我要去看看我是否能追踪代码执行的路径。哈!找到了解决办法!在android源代码中进行了太多的修改之后,我最终尝试了以下方法:将WebView子类化,并覆盖以下方法:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new BaseInputConnection(this, false);
}
就这样!诚然,选择(蓝色条纹)在您键入后会在视觉上停留,但它至少会替换您期望的文本,并且条纹不会影响任何内容。而且,它以前也这样做过。我希望也有一种相当简单的方法来消除它。如果在活动中重写
dispatchKeyEvent
方法,它将接收关键事件。至于您的实际问题,这可能是webview中的一个bug。然而,我不知道如何避免这种情况。@Randy-Hmm,实际上,这是一件值得尝试的事情-当选择文本时,软键盘上的下一次按键不会通过dispatchKeyEvent
,并产生故障行为。这很奇怪,也很好知道。我有一个应用程序已经实现了对键盘“楔子”的支持,这将打破它:/好吧,只有在contenteditable div中特别选择文本时才会发生,但我不知道。