7
votes

Dans le lien Navigateur Android n'exécute pas toujours OnClick causant la focus à la place

J'essaie de programmer un comportement JS très standard pour un lien à l'aide d'un HREF ONCLICK HANDLER, et je suis confronté à un problème étrange causé par ce que je crois être Comportement de Focus / Touch Mode sur Android.

Parfois, lorsque je clique sur le lien, au lieu d'exécuter l'action, il devient simplement sélectionné / ciblé, avec soit juste un rectangle de focus, soit même aussi avec un rectangle de mise au point rempli (sélectionné par opposition à juste concentré?).

Le pseudo-code en ce moment est maintenant xxx P> J'ai essayé de faire quelque chose comme: xxx

mais j'ai toujours le même problème pesky une partie du temps.


6 commentaires

Pour clarifier quelques dernières constatations: je peux définitivement le dire que cela ne fonctionne que lorsque l'article a le rectangle de mise au point et que je clique dessus de manière particulière. Dans ce cas, l'élément est alors "sélectionné" (brièvement complètement bleu) et cela ne fait que cela au lieu de faire l'action. Y a-t-il quelque chose comme "OnSelect"?


Comme dans, exécute automatiquement votre fonction lorsque sa focalisation?


Eh bien, il semble être déjà concentré sur ce point ... Je souhaite que l'utilisateur puisse simplement être capable de cliquer sur l'élément et de l'étendre. Il ressemble à +/- Article en expansion.


L'ensemble du lien axé sur l'ensemble de la société / sélectionnée? Ou peut-être juste une partie du texte de liaison? (Peut être un peu difficile à tester avec juste "Go".) J'aime: Si je clique sur légèrement à droite de votre nom ci-dessus, puis faites glisser les gauche, je sélectionne le texte de votre nom, lettre par lettre.


J'ai aussi ce problème - parfois Android ne veut tout simplement pas suivre des liens. Dans mon application, cependant, cela peut être réparé si je supprimais tous les gestionnaires de préventivefault () ... qui enfreint malheureusement l'application un peu, mais au moins les liens fonctionnent?


Je peux en quelque sorte contourner cela - surcharger TouchStart et toucher aux événements Simulés MouseDown / Mousep Simulés entraîne les liens pour les recevoir, et si une petite logique a été ajoutée pour toucher également un événement de clic, cela devrait fonctionner.


5 Réponses :


0
votes

Essayez de vous débarrasser de l'attribut href et voyez si cela aide. Par exemple, cela fonctionne lors de la visualisation avec le composant webview : xxx


1 commentaires

Je suis désolé, cela ne fonctionne pas pour moi - il est toujours possible de "choisir" le lien. J'ai également essayé des divs - ceux-ci sont également sélectionnables aussi longtemps qu'ils ont un attribut onClick sur eux.



0
votes

Je me demande si c'est lié au oncclick - suis-je correct de supposer que de temps en temps, en cliquant sur tout lien ne le suit pas? Pour moi, cela semble lié à la façon dont vous touchez l'écran (ou comment cela est interprété), comme peut-être en cliquant sur prochain sur le lien et en faisant glisser un peu, plutôt que de cliquer sur le lien?

(Si mon hypothèse est correcte, cela pourrait être un matériel défectueux: vous pouvez peut-être essayer un autre appareil? ou peut-être que cela ne se produit que sur un côté particulier du lien si l'écran n'est pas bien aligné, puis il pourrait y avoir Certains logiciels offset on peuvent changer?)


3 commentaires

Désolé, nous avons de nombreux téléphones ici - ce n'est pas un problème matériel. Il est en quelque sorte par le fait que vous pouvez sélectionner des éléments.


@Artem, mais cela ne se produit jamais pour des liens normaux? (Liens sans aucun onclick ?)


Il est beaucoup plus difficile de dire avec des liens normaux, car les liens normaux quittent généralement la page, alors que ce comportement nécessite de cliquer dessus plusieurs fois pour l'obtenir pour être sélectionné. Je vais continuer à tester cela.



2
votes

Essayez d'activer JavaScript sur le Webview.

Dans l'activité qui contient le webview, essayez ceci ... p>

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


0 commentaires

0
votes

Essayez d'insérer ce "pilote" dans votre code de page et faites-nous savoir si cela fonctionne. . . Il semble fonctionner sur mon site qui avait le même problème:

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

})();


2 commentaires

Solution très intéressante ... Nous avions un peu plus de chance avec tout ce qui clique en faisant simplement un rectangle coloré de couleur autour du texte ... J'aimerais essayer votre solution quand nous reviendrons à cela.


Ouais, ça marche assez bien - je devais écrire la touche -> Événements de souris de toute façon dans mon application pour obtenir des informations en temps réel sur les opérations de glisser; Je Devrait Devrait commencer avec un pilote de souris -> Touch Driver, et viens d'écrire mon application à l'aide du code tactile et allez probablement aller cette direction, mais malheureusement, je ne possède moi-même pas réellement un smartphone, alors j'ai commencé. avec code de la souris.



0
votes

Récemment, je suis tombé sur le même problème. J'utilisais l'ONCLICK sur un bouton. Parfois, il n'a pas du tout exécuté le JavaScript. La chose qui a fonctionné pour moi était que active le JavaScript avant de charger une URL B> dans la 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);


0 commentaires