В Android Browser ссылка не всегда выполняется onClick, вызывая фокус - PullRequest
6 голосов
/ 02 февраля 2010

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

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

Псевдокод сейчас

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

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

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

Но иногда я все еще сталкиваюсь с той же досадной проблемой.

Ответы [ 5 ]

2 голосов
/ 03 марта 2010

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

В упражнении, которое содержит веб-просмотр, попробуйте это ...

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

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

0 голосов
/ 23 сентября 2011

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

    // Enable javascript
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    // To bind javascript code to android
    mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

    mWebView.loadUrl(url);
0 голосов
/ 17 марта 2010

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

//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.Если вам нужна не jQuery-версия, вы можете просто удалить new jQuery.Event из функции mouseHandler() (другими словами, используйте исходное событие: var fixed = event;), и я считаю, что большинство браузеров будет в порядке.Я не совсем эксперт по совместимости с js.

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

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

0 голосов
/ 03 февраля 2010

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

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

0 голосов
/ 02 февраля 2010

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

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