7

我正在尝试使用 HREF onClick 处理程序为链接编程一个非常标准的 JS 行为,我正面临一个奇怪的问题,这是由我认为是 Android 上的焦点/触摸模式行为引起的。

有时,当我单击链接时,它并没有执行操作,而是简单地被选中/聚焦,只有一个焦点矩形,甚至还有一个填充的焦点矩形(选择而不是仅仅聚焦?)。

现在的伪代码是

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

我试过做类似的事情:

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

但有时我仍然会遇到同样令人讨厌的问题。

4

5 回答 5

2

尝试在 webview 上启用 Javascript。

在拥有 webview 的活动中,试试这个......

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

我遇到了同样的问题,但发现这是因为我没有启用 Javascript。

于 2010-03-03T07:48:15.133 回答
0

尝试摆脱该href属性,看看是否有帮助。例如,这在使用WebView组件查看时有效:

<p><a onClick="whereami()">Update Location</a></p>
于 2010-02-02T18:06:17.253 回答
0

我想知道它是否与onclick- 我是否正确地假设不时点击任何链接不会跟随它?对我来说,这似乎与您触摸屏幕的方式(或如何解释)有关,例如单击链接旁边并拖动一点,而不是单击链接

(如果我的假设是正确的,那么这可能是硬件故障:也许你可以在另一台设备上尝试?或者如果屏幕没有很好地对齐,它可能只发生在链接的特定一侧,然后可能会有一些软件偏移一个可以改变吗?)

于 2010-02-02T21:55:38.317 回答
0

尝试将此“驱动程序”插入您的页面代码,并让我们知道它是否有效。. . 它似乎在我的网站上工作,它有同样的问题:

//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.EventmouseHandler()函数中删除 (换句话说,使用原始事件:)var fixed = event;,我相信大多数浏览器都可以。不过,我并不完全是 js 兼容性专家。

PPS - 使用 Android 1.6 测试

PPPS - 必须修改脚本以允许阈值 - 实际设备在按下期间触发移动事件时遇到了一些问题。可能不理想;如果有人想以更好的方式来做这件事,我很想听听……

于 2010-03-17T16:28:46.017 回答
0

最近我遇到了完全相同的问题。我正在使用按钮上的onclick。有时它根本不执行 javascript。对我有用的是在 webview 中加载 url 之前启用 javascript

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

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

    mWebView.loadUrl(url);
于 2011-09-23T08:18:24.030 回答