2012-07-05 11 views
9

Estoy intentando activar una función cuando se cambia un elemento seleccionado.cómo enlazar a desenfoque y cambio, pero solo desencadenar una función una vez en Jquery/Javascript?

Como Ipad tiene problemas con on ('cambio'), también deseo enlazar con 'blur', que funciona bien en Ipad.

Sin embargo no quiero ambos eventos para activar la función dos veces, por lo que necesitan algún tipo de gancho para asegurarse de que si tanto el cambio y desenfoque gatillo, que la función subyacente es sólo disparó una vez.

Esto es lo que estoy haciendo ahora, pero ... no muy agradable:

// make sure binding is only assigned once 
var compSel = $('#my_select'); 
if (compSel.jqmData('bound') != true){ 
    console.log("bound"); 
    compSel.jqmData('bound', true) 
     .on($.support.touch ? 'blur' : 'change', function(){ 
      console.log("trigger"); 
      // run function xyz 
     }) 
    }    

Esto funciona si se puede vivir con todos los dispositivos de la toma tangible ver con la falta de definición .

Pregunta:
¿Alguien tiene una idea mejor para asegurarse de que la falta de definición y cambiar sólo desencadenar una función de una sola vez?

¡Gracias por la ayuda!

Respuesta

21

Intente crear una función, vinculada a ambos eventos y agregando un tiempo de espera para llamar a la función. De esta forma, si se llama a la función varias veces, solo se ejecutará una vez.

Algo como esto (se puede ajustar el tiempo de espera si es necesario):

function blurChange(e){ 
    clearTimeout(blurChange.timeout); 
    blurChange.timeout = setTimeout(function(){ 
     // Your event code goes here. 
    }, 100); 
} 

$('#my_select').on('blur change',blurChange); 
+1

+1 Esto debería funcionar – Vithozor

+0

yah. También el enfoque que estoy tomando. ¡Gracias! – frequent

+0

Si la acción abre una nueva página, para cuando el usuario regrese a la página original, el tiempo de espera habrá expirado y al hacer clic en dicha página, desencadenará el evento de desenfoque. –

0

No es agradable, pero se puede llamar a change en la función blur, y hacer todas las cosas en la función change:

... 
$(document).on("change", "#yourelement", function(){ 
    //do your stuff 
}); 
.... 
$(document).on("blur", "#yourelement", function(){ 
    $("#yourelement").change(); 
    //alternatively, you can trigger the change event 
    //$("#yourelement").trigger("change"); 
}); 

No se ve muy bien, pero creo que debería funcionar.

EDITAR: Si el navegador inicia ambos eventos (desenfoque y cambio), este código llamará dos veces la funcionalidad change. Creo que se puede lograr que el comportamiento con algún tipo de indicador:

var executed = false; 
... 
$(document).on("change blur", "#yourelement", function(){ 
    if(!executed){ 
     executed = true; 
     //do your stuff 
    } 
}); 
+0

hm. intentando esto thx hasta el momento – frequent

+0

IMO, si haces esto, puedes cambiar el cambio y la imagen borrosa ya que el cambio aún se declara. El cambio puede ser desencadenado por itselft y por la función de desenfoque. – Melanie

+0

@Melanie, tiene toda la razón – Vithozor

2

no saben de iPad, pero en el navegador tal vez algo como esto

$("#dataTable tbody").on("click blur", "tr", function(event){ 
     if (event.type == "click") 
     { 
     //do stuff 
     } 
     else 
     { 
     //do nothing 
     } 
}); 
+0

también es una buena idea. veamos – frequent

-4

Puede unirse a múltiples eventos en el mismo tiempo:

$(document).on('blur change','#mySelector',function(){ 
    // this is called on either 
}); 
+0

Pero si ha cambiado el elemento y difumina el elemento al mismo tiempo, ambos se dispararán y la función se ejecutará dos veces, lo que a menudo no es lo que desea. – KyleFarris

0

adjuntar varios eventos que se pueden utilizar de esta manera también

<select class="form-control" id="Category" name="Category" required> 
    <option value="">Choose an option</option> 
    <option value="1">Your Text</option> 
</select> 
<p class=""></p> 

$("#Category").on("blur change", function(event) { 
    if($(this).val()===""){ 
      $(this).next().text("Please choose category").css("color","#a94442"); 
     } 
     else 
     { 
      $(this).next().text(""); 
     } 

}); 
Cuestiones relacionadas