В ссылке Android Browser не всегда выполняется onClick, вызывающий фокус вместо

Я пытаюсь запрограммировать очень стандартное поведение JS для ссылки, используя обработчик HREF onClick, и я столкнулся с какой-то странной проблемой, вызванной тем, что, как я считаю, является режимом фокусировки / сенсорного режима на Android.

Иногда, когда я нажимаю ссылку, вместо того, чтобы выполнять действие, он просто становится выбранным / сфокусированным, либо с прямоугольником фокуса, либо даже с заполненным прямоугольником фокуса (выбранным, а не только сфокусированным?).

Псевдокод прямо сейчас

<a href="#" onClick="toggleDivBelowToShowHide(); return false;">go</a> 

Я попытался сделать что-то вроде:

 <a href="#" onTouchStart="toggleDivBelowToShowHide(); return false;">go</a> 

Но я все еще получаю такую ​​же отвратительную проблему некоторое время.

Попробуйте включить Javascript в веб-просмотре.

В деятельности, которая хранит веб-просмотр, попробуйте это …

 WebView wv = (WebView) findViewById(R.id.webview); wv.getSettings().setJavaScriptEnabled(true); 

У меня была такая же проблема, но я понял, что это не потому, что я не включил Javascript.

Попытайтесь избавиться от атрибута href и посмотрите, поможет ли это. Например, это работает при просмотре с WebView компонента WebView :

 <p><a onClick="whereami()">Update Location</a></p> 

Интересно, связано ли это с onclick Правильно ли я предполагаю, что каждый раз щелкнуть любую ссылку не следует за ней? Для меня это похоже на то, как вы касаетесь экрана (или как это интерпретируется), например, возможно, щелкнув рядом со ссылкой и немного перетащив, а не щелкнув по ссылке?

(Если мое предположение верно, то это может быть неисправное оборудование: возможно, вы можете попробовать другое устройство? Или, возможно, это происходит только на определенной стороне ссылки, если экран не выровнен хорошо, а затем может быть какое-то смещение программного обеспечения Можно изменить?)

Попробуйте вставить этот «драйвер» в свой код страницы и сообщите нам, если он будет работать. , , Кажется, он работает на моем сайте, у которого была такая же проблема:

 //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); })(); 

Теперь это не 100% полный скрипт – мультитач, вероятно, будет немного неудобным, и если вы построите интерфейс в зависимости от сенсорных команд, он не будет генерировать те, что в этой версии. Но проблема была решена.

Erm – ps – используется jQuery. Если вам нужна версия, new jQuery.Event от jQuery, вы можете просто удалить new jQuery.Event из функции mouseHandler() (другими словами, использовать исходное событие: var fixed = event; ), и я считаю, что большинство браузеров будут в порядке , Однако я не совсем эксперт по совместимости с js.

PPS – протестирован с Android 1.6

PPPS – Придется модифицировать скрипт, чтобы разрешить порог – у реальных устройств возникли проблемы с событием перемещения, которое было запущено во время печати. Наверное, не идеальный; Если кто-то захочет сделать лучший способ для этого, мне будет интересно услышать …

Недавно я столкнулся с той же проблемой. Я использовал кнопку onclick на кнопке. Иногда он вообще не выполнял javascript. Вещь, которая работала для меня, заключалась в том, чтобы включить javascript перед загрузкой url в webview

  // Enable javascript WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); // To bind javascript code to android mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); mWebView.loadUrl(url); 
Intereting Posts
Как правильно выпустить Android MediaPlayer Как установить текущую дату в DatePicker? Почему приложение на Android не должно быть написано на C / C ++, потому что вы просто предпочитаете программировать на C / C ++? Как перенаправить пользователя в пусковую установку по умолчанию в приложении для Android? Проблема с запросом Facebook в Android Почему очистка базы данных SQLite при очистке данных приложения от управления приложениями? Ошибка при записи файлов с Android Storage Access на Lollipop Как я могу заставить свой эмулятор Android использовать VPN-интерфейс моего компьютера? Android AlarmManager: как избежать уйти от прошлых аварийных сигналов Как выдать сообщение подтверждения (да / нет) задачи Android? В ОС Android или Java, какая разница между символьной последовательностью и строкой? Уведомления Android DBite Android Полноэкранный диалог DialogFragment перекрывается с StatusBar Установить аудио атрибуты в классе SoundPool.Builder для API 21 Простой Xml – порядок элементов не сохранился?