En el enlace del navegador de Android no siempre ejecuta ONCLICK CAUSE FOCUS -- android campo con webkit campo con focus campo con onclick campo con webview camp Relacionados El problema

In Android Browser link does not always execute onClick causing focus instead


7
vote

problema

Español

Estoy tratando de programar un comportamiento JS muy estándar para un enlace con un HREF OnClick Handler, y estoy enfrentando un problema extraño causado por lo que creo que es el comportamiento del modo Focus / Touch en Android.

A veces, cuando hago clic en el enlace, en lugar de ejecutar la acción, simplemente se selecciona / enfocó, con solo un rectángulo de enfoque o incluso con un rectángulo de enfoque lleno (seleccionado en lugar de enfocado).

El pseudo-código ahora mismo es

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

He intentado hacer algo como:

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

Pero todavía tengo el mismo problema molesto que parte del tiempo.

Original en ingles

I am trying to program a very standard JS behavior for a link using an HREF onClick handler, and I am facing a strange problem caused by what I believe to be focus/touch mode behavior on Android.

Sometimes when I click on the link, instead of executing the action, it simply becomes selected/focused, with either just a focus rectangle or even also with a filled focus rectangle (selected as opposed to just focused?).

The pseudo-code right now is

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

I have tried doing something like:

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

But I still get the same pesky problem some of the time.

</div
              
         
         

Lista de respuestas

2
 
vote

Intenta habilitar JavaScript en WebView.

En la actividad que contiene WebView, prueba esto ...

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

Estaba teniendo el mismo problema, pero descubrió que fue porque no había habilitado Javascript.

 

Try enabling Javascript on the webview.

In the activity that holds the webview, try this...

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

I was having he same problem, but figured out it was because I did not enabled Javascript.

</div
 
 
0
 
vote

Intente deshacerse del atributo WebView5 y vea si eso ayuda. Por ejemplo, esto funciona cuando se ve con el componente WebView6 :

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

Try getting rid of the href attribute and see if that helps. For example, this works when viewed with the WebView component:

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

Me pregunto si está relacionado con el onclick - ¿Soy correcto para asumir que de vez en cuando, haga clic en enlace no lo sigue? Para mí, esto parece relacionado con la forma en que toca la pantalla (o cómo se interpreta esto), como tal vez haciendo clic en Siguiente al enlace y arrastrando un bit, en lugar de hacer clic en en el enlace?

(Si mi suposición es correcta, entonces esto podría ser un hardware defectuoso: ¿tal vez puede intentarlo en otro dispositivo? O tal vez solo suceda en un lado particular del enlace si la pantalla no está alineada bien, y luego podría haber algún software compensado uno puede cambiar?)

 

I wonder if it's related to the onclick -- am I correct to assume that every now and then clicking any link does not follow it? To me, this seems related to the way you touch the screen (or how this is interpreted), like maybe by clicking next to the link and dragging a bit, rather than clicking on the link?

(If my assumption is correct, then this might be faulty hardware: maybe you can try on another device? Or maybe it only happens on a particular side of the link if the screen is not aligned well, and then there might be some software offset one can change?)

</div
 
 
     
     
0
 
vote

Intente insertar este "controlador" en su código de página y háganoslo saber si funciona. . . Parece estar trabajando en mi sitio que tenía el mismo problema:

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

Ahora no es un script 100% completo: el multitumento probablemente sería un poco de Wonky, y si construyó una interfaz dependiendo de los comandos táctiles, no genera aquellos en esta versión. Pero, solucionó mi problema de clic enlace.

ERM - PS - está usando jQuery. Si necesita una versión que no necesita jquery, probablemente puede simplemente eliminar el WebView10 de la función ########UPDATE111111 (en otras palabras, use el evento original: 99887776612 ), y creo que la mayoría de los navegadores estarían bien. Sin embargo, no soy exactamente un experto en compatibilidad de JS.

PPS - probado con Android 1.6

PPP: tuvo que modificar la secuencia de comandos para permitir un umbral: los dispositivos reales tenían algunos problemas con un evento de movimiento que se estaba disparando durante la prensa. Probablemente no sea ideal; Si alguien quiere cargar con una mejor manera de hacerlo, me interesaría escuchar ...

 

Try inserting this "driver" into your page code, and let us know if it works . . . It seems to be working on my site which had the same problem:

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

Now it isn't a 100% complete script - multi-touch would probably be a little wonky, and if you built an interface depending on touch commands, it doesn't generate those in this version. But, it fixed my link-clicking problem.

Erm - ps - it's using jQuery. If you need a non-jQuery version, you can probably just remove the new jQuery.Event from the mouseHandler() function (in other words, use the original event: var fixed = event;), and I believe most browsers would be ok. I am not exactly a js compatibility expert though.

PPS - Tested with Android 1.6

PPPS - Had to modify script to allow a threshold - actual devices were having some problems with a move event being fired during the press. Probably not ideal; if anyone wants to chime in on a better way for doing that, I'd be interested in hearing...

</div
 
 
   
   
0
 
vote

Recientemente me encontré con exactamente el mismo problema. Estaba usando el ONCLICK en un botón. A veces no ejecutó el JavaScript en absoluto. Lo que funcionó para mí fue que habilita el JavaScript antes de cargar una URL en WebView

  ########UPDATE3  
 

Recently I came across exactly the same problem. I was using the onclick on a button. Sometimes it did not execute the javascript at all. The thing that worked for me was that enable the javascript before loading a url in the 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); 
</div
 
 

Relacionados problema

4  Cookies compartidas entre webview y httpclient?  ( Shared cookies between webview and httpclient ) 
Una aplicación de Android I AM. La construcción requiere autenticación web para que los usuarios realicen llamadas de datos. En Adobe Air y posteriormente el ...

7  En el enlace del navegador de Android no siempre ejecuta ONCLICK CAUSE FOCUS  ( In android browser link does not always execute onclick causing focus instead ) 
Estoy tratando de programar un comportamiento JS muy estándar para un enlace con un HREF OnClick Handler, y estoy enfrentando un problema extraño causado por ...

1  Mostrar superposición DIV en Android Webview  ( Show overlay div on android webview ) 
Estoy tratando de mostrar un DIV de superposición como un indicador de progreso en un WebView de Android. El lado JS de la ecuación es $('.show_loading').o...

1  incrustar un webview con videos de YouTube  ( Embedding a webview with youtube videos ) 
Estoy tratando de construir una aplicación con un WebView en él que le permita la reproducción de YouTube. En este momento, el sitio de YouTube está cargando ...

125  Webview y html5 <video>  ( Webview and html5 video ) 
Estoy juntando una aplicación de cheapo que, entre otras cosas, "marcos" algunos de nuestros sitios web ... bastante simple con el WebViewClient . hasta que ...

3  Problemas para usar el webview de Titanium para disparar un evento API  ( Trouble using titaniums webview to fire an api event ) 
Estoy tratando de disparar un evento de una página HTML externa abierta dentro de WebView de Titanium. app.js Archivo ... to111 JS Extripto de la p...

0  no se pudo jugar youtube.com en webview  ( Couldnt play youtube com in webview ) 
Me preguntaba por qué no puedo jugar YouTube.com en mi webview después de que actualice la versión del sistema operativo de 2.3.6 a 4.0.3, el brote es mi códi...

0  El fragmento de Android no muestra nada  ( Android fragment does not show anything ) 
Estoy seguro de que estoy haciendo esto mal. Este es mi primer intento de usar un fragmento para cualquier cosa. Tengo una aplicación muy simple. Nada aparece...

0  Cargando Spinner para WebView Fragment  ( Loading spinner for webview fragment ) 
El siguiente es el código en mi PuntuaciónFragment.Java que muestra un webview. IMPORT BLAH BLAH public class ScoreFragment extends Fragment { public Scor...

5  Android phonegap con controles nativos  ( Android phonegap with native controls ) 
Estoy tratando de construir una aplicación Android con phonegap. Necesito poder usar el WebView de PhoneGap (Super.AppView) y toda su magia de JavaScript, p...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos