Я пробую к программе a очень стандартное поведение JS для ссылки с помощью обработчика HREF onClick, и я сталкиваюсь со странной проблемой, вызванной тем, чему я верю, чтобы быть поведением режима фокуса/касания на Android.
Иногда то, когда я нажимаю на ссылку, вместо того, чтобы выполнить действие, это просто становится, выбирало/фокусировало, или только с прямоугольником фокусировки или с даже также с заполненным прямоугольником фокусировки (выбранный в противоположность просто сфокусированному?).
Псевдокод прямо сейчас
<a href="#" onClick="toggleDivBelowToShowHide(); return false;">go</a>
Я попытался делать что-то как:
<a href="#" onTouchStart="toggleDivBelowToShowHide(); return false;">go</a>
Но я все еще получаю ту же противную проблему часть времени.
Попробуйте избавиться от атрибута href
и посмотрите, поможет ли это. Например, это работает при просмотре с компонентом WebView
:
<p><a onClick="whereami()">Update Location</a></p>
Интересно, связано ли это с нажатием на кнопку
-- правильно ли я предполагаю, что время от времени нажатие на любую ссылку не следует за ней? Мне кажется, что это связано с тем, как вы прикасаетесь к экрану (или как это интерпретируется), например, нажатием после на ссылку и немного перетаскиванием, вместо того, чтобы нажимать на на ссылку?
(Если мое предположение верно, то это может быть неисправное аппаратное обеспечение: может быть, вы можете попробовать на другом устройстве? Или, может быть, это происходит только на определенной стороне ссылки, если экран выровнен не очень хорошо, и тогда может быть какое-то программное смещение, которое можно изменить?)
(Если мое предположение верно, то это может быть неисправным оборудованием: может быть, Вы можете попробовать на другом устройстве?Попробуйте включить Javascript в веб-просмотре.
В действии, содержащем веб-просмотр, попробуйте это ...
WebView wv = (WebView) findViewById(R.id.webview);
wv.getSettings().setJavaScriptEnabled(true);
У меня была такая же проблема, но я понял, что это потому, что я не включил Javascript.
Попробуйте вставить этот «драйвер» в код своей страницы и сообщите нам, работает ли он. . . Похоже, он работает на моем сайте, на котором была та же проблема:
//Mouse & Touch -> Consistent Click / Mouse Commands -> Useful driver
(function() {
var isTouch = false;
var simulated_flag = 'handler_simulated';
var touch_click_array = {};
const clickMoveThreshold = 20; //Pixels
function mouseHandler(event) {
if (isTouch) {
if (!event.hasOwnProperty(simulated_flag)) {
//Unreliable mouse commands - In my opinion
var fixed = new jQuery.Event(event);
fixed.preventDefault();
fixed.stopPropagation();
}
}
else {
//Mouse commands are consistent
//TODO: generate corresponding touches
}
}
function mouseFromTouch(type, touch) {
var event = document.createEvent("MouseEvent");
event.initMouseEvent(type, true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY
, false, false, false, false, 0, null);
event[simulated_flag] = true;
touch.target.dispatchEvent(event);
};
function touchHandler(event) {
var touches = event.changedTouches
,first = touches[0]
,type = ""
;
if (!event.hasOwnProperty(simulated_flag)) {
isTouch = true;
//Simulate mouse commands
switch (event.type) {
case "touchstart":
for (var i = 0; i < touches.length; i++) {
var touch = touches[i];
touch_click_array[touch.identifier] = { x: touch.screenX, y: touch.screenY };
}
mouseFromTouch("mousedown", first);
break;
case "touchmove":
for (var i = 0; i < touches.length; i++) {
var touch = touches[i];
var id = touch.identifier;
var data = touch_click_array[id];
if (data !== undefined) {
if (Math.abs(data.x - touch.screenX) + Math.abs(data.y - touch.screenY) > clickMoveThreshold) {
delete touch_click_array[id];
}
}
}
mouseFromTouch("mousemove", first);
break;
case "touchcancel":
//Not sure what should happen here . . .
break;
case "touchend":
mouseFromTouch("mouseup", first);
for (var i = 0; i < touches.length; i++) {
var touch = touches[i];
if (touch_click_array.hasOwnProperty(touch.identifier)) {
mouseFromTouch("click", touch);
delete touch_click_array[touch.identifier];
}
}
break;
}
}
}
document.addEventListener("mousedown", mouseHandler, true);
document.addEventListener("mousemove", mouseHandler, true);
document.addEventListener("mouseup", mouseHandler, true);
document.addEventListener("click", mouseHandler, true);
document.addEventListener("touchstart", touchHandler, true);
document.addEventListener("touchmove", touchHandler, true);
document.addEventListener("touchcancel", touchHandler, true);
document.addEventListener("touchend", touchHandler, true);
})();
Теперь это не полностью готовый сценарий - мультитач, вероятно, будет немного неудобным, и если вы построите интерфейс, зависящий от сенсорных команд, он не генерирует их в этой версии. Но это устранило мою проблему с переходом по ссылке.
Erm - ps - он использует jQuery. Если вам нужна версия, отличная от jQuery, вы, вероятно, можете просто удалить new jQuery.Event
из функции mouseHandler ()
(другими словами, используйте исходное событие: var fixed = event;
), и я считаю, что с большинством браузеров все подойдет. Однако я не совсем специалист по совместимости с js.
PPS - Протестировано на Android 1.6.
PPPS - Пришлось изменить сценарий, чтобы разрешить пороговое значение - у реальных устройств были некоторые проблемы с запуском события перемещения во время печати. Наверное, не идеально; если кто-то захочет узнать, как это сделать лучше, мне было бы интересно услышать ...