Foros del Web » Programando para Internet » Javascript »

Evento onfocus solo una vez

Estas en el tema de Evento onfocus solo una vez en el foro de Javascript en Foros del Web. Hola a todos, tengo en un textbox un evento onfocus que llama a una funcion de ajax. Mi pregunta es si hay alguna forma de ...
  #1 (permalink)  
Antiguo 21/11/2014, 13:18
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Evento onfocus solo una vez

Hola a todos, tengo en un textbox un evento onfocus que llama a una funcion de ajax. Mi pregunta es si hay alguna forma de que ese evento solo se ejecute una vez, para que si el usuario vuelve a hacer clic en el textbox no se ejecute mas el evento.

Gracias a todos
  #2 (permalink)  
Antiguo 22/11/2014, 02:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Evento onfocus solo una vez

Utiliza el método removeEventListener para desligar al evento del elemento en cuestión.

Código HTML:
Ver original
  1. <input type = "text" id = "foo" />

Código Javascript:
Ver original
  1. var input = document.querySelector("#foo");
  2.  
  3. input.addEventListener("focus", function(event){
  4.     alert("Solo verás este mensaje una vez.");
  5.     this.removeEventListener("focus", arguments.callee);
  6. }, false);

DEMO

Saludos

Edito: Antes de que me lo preguntes, la presencia de arguments.callee se debe a que la función que se ejecuta es anónima (no posee un nombre) y como lo que deseo es que ya no se ejecute dicha función al volver a dar el enfoque a la caja de texto, hago referencia a ella utilizando la propiedad en cuestión.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 22/11/2014 a las 02:47 Razón: Aclaración
  #3 (permalink)  
Antiguo 22/11/2014, 05:25
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Evento onfocus solo una vez

La idea que plantea Alexis88 es buena, pero hay un problema... arguments.callee está en desuso.

Lo más "recomendable" en estos casos sería declararla afuera y después referenciarla, o simplemente darle un nombre al listener del evento (que se puede):

Código Javascript:
Ver original
  1. var input = document.querySelector("#foo");
  2.  
  3. input.addEventListener("focus", function k(event){
  4.     alert("Solo verás este mensaje una vez.");
  5.     this.removeEventListener("focus", k);
  6. }, false);

Última edición por PHPeros; 22/11/2014 a las 05:31
  #4 (permalink)  
Antiguo 22/11/2014, 08:49
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Evento onfocus solo una vez

en mi opinión, la manera más adecuada de hacerlo es almacenar la función anónima en una variable
Cita:
var input = document.querySelector("#foo"), fnc = null;

input.addEventListener("focus", fnc = function(event){
alert("Solo verás este mensaje una vez.");
this.removeEventListener("focus", fnc);
}, false);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 22/11/2014, 19:27
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Evento onfocus solo una vez

Y si quieres tenerlo de forma general, es decir, ejecutar cualquier evento una sola vez en cualquier elemento (del mismo modo en el que se realiza con el método .one() de jQuery), puedes implementar esto:

Código Javascript:
Ver original
  1. window.Element.prototype.one = function(event, callback){
  2.     this.addEventListener(event, this.call = function(){
  3.         callback();
  4.         this.removeEventListener(event, this.call, false);
  5.     }, false);    
  6. };
  7.  
  8. document.querySelector("#id_elemento").one("click", function(){
  9.     alert("Solo verás este mensaje una vez.");
  10. });

De este modo, aplicas este método a cualquier elemento del documento.

DEMO

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 24/11/2014, 04:49
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

gracias por vuestras respuestas, probare y os comento
  #7 (permalink)  
Antiguo 24/11/2014, 06:34
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

Ese codigo javascript lo pondria independientemente de la funcion a la que llamo con el onfocus? o dentro de la funcion que estoy llamando?
  #8 (permalink)  
Antiguo 24/11/2014, 11:35
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Evento onfocus solo una vez

Solo tendrías que copiar y pegar las primeras 6 líneas al inicio de tu archivo JS.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 24/11/2014, 13:03
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

he metido el codigo pero me sigue ejecutando, incluso el mensaje que solo debe de salir una vez vuelve a salir (lo deje para comprobar que hacia bien su cometido)

Código:
function nuevaLinea2(str) {
  
  var input = document.querySelector("#art1");
 
input.addEventListener("focus", function k(event){
    alert("Solo verás este mensaje una vez.");
    this.removeEventListener("focus", k);

  
   if (str=="") {
    document.getElementById("linea2").innerHTML="";
    return;
  } 
  if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  } else { // code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
      document.getElementById("linea2").innerHTML=xmlhttp.responseText;
    }
  }
  xmlhttp.open("GET","linea2.php?q="+str,true);
  xmlhttp.send();
  }, false);
}
esa es la funcion a la que llama el onfocus, el fin de ese codigo es que aparezca un textbox justo abajo cuando obtenga el textbox el focus. La razon de que solo quiera una ejecucion es que me borra el dato que ya tenga si el usuario vuelve a hacer focus en el textbox anterior.

muchas gracias por vuestra ayuda
  #10 (permalink)  
Antiguo 24/11/2014, 13:30
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Evento onfocus solo una vez



No, pues, fíjate en lo que estás haciendo. Estás agregando la asignación de la función a la caja de texto dentro de la función que ya tenías creada.

Prueba así:

Código Javascript:
Ver original
  1. var input = document.querySelector("#art1");
  2.  
  3. input.addEventListener("focus", fn = function (event){
  4.     if (!this.value.length) {
  5.         document.getElementById("linea2").innerHTML = "";
  6.         return;
  7.     }
  8.     if (window.XMLHttpRequest) {
  9.         xmlhttp = new XMLHttpRequest();
  10.     }
  11.     else {
  12.         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  13.     }
  14.     xmlhttp.onreadystatechange = function() {
  15.         if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  16.             document.getElementById("linea2").innerHTML = xmlhttp.responseText;
  17.         }
  18.     }
  19.     xmlhttp.open("GET", "linea2.php?q=" + str, true);
  20.     xmlhttp.send();
  21.  
  22.     this.removeEventListener("focus", fn);
  23. }, false);

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 25/11/2014, 06:41
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

Alexis88 que va no ejecuta ahora la funcion. Voy a revisar haber si algo no coincide.

Gracias por tu tiempo!
  #12 (permalink)  
Antiguo 25/11/2014, 11:37
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Evento onfocus solo una vez

Solo por las dudas, asegúrate de que tu código JavaScript se encuentre después de todos los elementos de tu documento, es decir:

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang = "es">
  3.     <meta charset = "utf-8" />
  4.     <title>Título</title>
  5. </head>
  6.     <!-- Aquí van todos tus elementos -->
  7.     <script type = "text/javascript">
  8.         //Aquí va tu código JavaScript
  9.     </script>
  10. </body>
  11. </html>

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #13 (permalink)  
Antiguo 26/11/2014, 12:18
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

Tenia la funcion en HEAD, la he puesto en el BODY despues de todos los elementos y el mismo resultado
  #14 (permalink)  
Antiguo 26/11/2014, 13:15
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Evento onfocus solo una vez

Si nos muestras tu código actualizado, será más fácil identificar el problema.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #15 (permalink)  
Antiguo 03/12/2014, 05:52
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

perdon por la ausencia, este es el codigo que tengo puesto:

Código:
<script type = "text/javascript">
function nuevaLinea2(str) {
	
	var input = document.querySelector("#art1");
	 
	input.addEventListener("focus", fn = function (event){ 
		if (str=="") {
			document.getElementById("linea2").innerHTML="";
			return;
		  } 
		  if (window.XMLHttpRequest) {
			// code for IE7+, Firefox, Chrome, Opera, Safari
			xmlhttp=new XMLHttpRequest();
		  } else { // code for IE6, IE5
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		  }
		  xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4 && xmlhttp.status==200) {
			  document.getElementById("linea2").innerHTML=xmlhttp.responseText;
			}
		  }
		  xmlhttp.open("GET","linea2.php?q="+str,true);
		  xmlhttp.send();
	 
	}, false);
	this.removeEventListener("focus", fn);
}
</script>
mas arriba tengo el objeto que llama al evento:

Código:
<input type="text" size="10" id="art1" name="art1" class="celda" onblur="showUser(this.value);" onclick="nuevaLinea2(1);" value="<?php echo $fndArt; ?>" />
  #16 (permalink)  
Antiguo 03/12/2014, 06:38
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Evento onfocus solo una vez

evidentemente si asignas el evento cada vez que haces click en el elemento, por mucho que lo elimines, se asignará de nuevo. el problema que se aprecia es que le estás pasando un parámetro, por lo que no puedes usar el evento onload. tendrás que mostrarnos de donde obtienes es parámetro. aunque supongo que es la "posición" del elemento dentro de una colección

por otro lado no estás haciendo lo que se te indica
Cita:
function nuevaLinea2(str) {

var input = document.querySelector("#art1"), fn = null;

input.addEventListener("focus", fn = function (event){

..........

this.removeEventListener("focus", fn);
}, false);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #17 (permalink)  
Antiguo 05/12/2014, 06:33
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

ese parametro lo paso manualmente, porque la funcion esa la he adaptado de otra cosa para lo que necesito, y esa funcion me exige un parametro.

gracias por vuestra ayuda
  #18 (permalink)  
Antiguo 05/12/2014, 06:48
 
Fecha de Ingreso: diciembre-2006
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Evento onfocus solo una vez

ademas una consulta, con esa funcion veo que ya se le asigna el evento... entonces ?¿no es necesario asignarle al textbox el onlick="evento();" no? Ya se lo asigna la funcion en si
  #19 (permalink)  
Antiguo 05/12/2014, 08:55
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Evento onfocus solo una vez

no es no sea necesario, es que incurrirías el mismo problema.

si el parámetro que le pasas lo escribes tú, entonces puede hacer algo como esto
Cita:
window.addEventListener('load', function(event) {

var input = document.querySelector("#art1"), fn = null;

input.addEventListener("focus", fn = function (event){

............

this.removeEventListener("focus", fn);
}, false);
}, false);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Etiquetas: evento, html, todo, vez
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:02.