前段时间有个在android上面做网页的同事,对我说在JavaScript的里面的onKeyDown不能接收上下左右按键,当时我还觉得不好思议,这是网页的一个标准,android对接
webkit怎么可能改变原有的标准那,当时只是随口说说也没有怎么在意
结果前一段时间,客户写了一个网页包含onKeyDown处理的函数,结果在android平台上怎么也不能接收到事件,当时我突然想到以前有这么回事,看来真有这个问题阿
于是我在android的framework找到相关的webkit的代码,进行分析,在webview.java的onKeyDown函数中找到了这个问题的根源
现在我把部分的关键代码展示一下:
if (keyCode >= KeyEvent.KEYCODE_DPAD_UP
&& keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT)
{
switchOutDrawHistory();
if (nativePageShouldHandleShiftAndArrows()) {
letPageHandleNavKey(keyCode, event.getEventTime(), true, event.getMetaState());
return true;
}
if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
pageUp(true);
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
pageDown(true);
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
nativeClearCursor(); // start next trackball movement from page edge
return pinScrollTo(0, mScrollY, true, 0);
case KeyEvent.KEYCODE_DPAD_RIGHT:
nativeClearCursor(); // start next trackball movement from page edge
return pinScrollTo(mContentWidth, mScrollY, true, 0);
}
}
if (mSelectingText) {
int xRate = keyCode == KeyEvent.KEYCODE_DPAD_LEFT
? -1 : keyCode == KeyEvent.KEYCODE_DPAD_RIGHT ? 1 : 0;
int yRate = keyCode == KeyEvent.KEYCODE_DPAD_UP ?
-1 : keyCode == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : 0;
int multiplier = event.getRepeatCount() + 1;
moveSelection(xRate * multiplier, yRate * multiplier);
return true;
}
webkit怎么可能改变原有的标准那,当时只是随口说说也没有怎么在意
结果前一段时间,客户写了一个网页包含onKeyDown处理的函数,结果在android平台上怎么也不能接收到事件,当时我突然想到以前有这么回事,看来真有这个问题阿
于是我在android的framework找到相关的webkit的代码,进行分析,在webview.java的onKeyDown函数中找到了这个问题的根源
现在我把部分的关键代码展示一下:
if (keyCode >= KeyEvent.KEYCODE_DPAD_UP
&& keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT)
{
switchOutDrawHistory();
if (nativePageShouldHandleShiftAndArrows()) {
letPageHandleNavKey(keyCode, event.getEventTime(), true, event.getMetaState());
return true;
}
if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
pageUp(true);
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
pageDown(true);
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
nativeClearCursor(); // start next trackball movement from page edge
return pinScrollTo(0, mScrollY, true, 0);
case KeyEvent.KEYCODE_DPAD_RIGHT:
nativeClearCursor(); // start next trackball movement from page edge
return pinScrollTo(mContentWidth, mScrollY, true, 0);
}
}
if (mSelectingText) {
int xRate = keyCode == KeyEvent.KEYCODE_DPAD_LEFT
? -1 : keyCode == KeyEvent.KEYCODE_DPAD_RIGHT ? 1 : 0;
int yRate = keyCode == KeyEvent.KEYCODE_DPAD_UP ?
-1 : keyCode == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : 0;
int multiplier = event.getRepeatCount() + 1;
moveSelection(xRate * multiplier, yRate * multiplier);
return true;
}