2011-12-29 17 views
6

tengo el siguiente código html:evento Change preferencia con jQuery

<input type="text" id="theInput" value=""/>  
<a href="#" id="theLink">Click me</a> 

Quiero detectar cuando los cambios de entrada y llevar a cabo una operación en este caso, pero sólo cuando el usuario no ha hecho clic en el enlace. He intentado esto:

$('#theLink').live('click', function(){ 
    alert('click'); 
}); 

$('#theInput').live('change', function(){ 
    alert('change'); 
}); 

Sin embargo change siempre se ejecuta antes de click cuando el valor de la entrada cambia, debido a las reglas de precedencia caso de Javascript, y por lo tanto sólo se muestra el mensaje "cambio".

Me gustaría mostrar change solo si el valor de entrada cambió y el usuario salió de la entrada haciendo clic en cualquier otro lugar en lugar del enlace. En ese último caso, me gustaría mostrar click.

El ejemplo es here.

Yo uso jQuery 1.6.4.

+0

buena pregunta! Estoy interesado en la respuesta aquí ... – Murtaza

+0

He actualizado mi respuesta, finalmente entendí su pregunta –

Respuesta

1

Por lo que yo sé, los click desencadena el evento después de las blur y change eventos en todos los navegadores (echar un vistazo a this JSFiddle). El orden de blur y change es diferente en todos los navegadores (fuente: Nicholas Zakas).

Para resolver su problema, puede escuchar los eventos click en el documento y comparar el objetivo del evento con #theLink. Cualquier evento de clic se disparará hasta el documento (a menos que se lo impida).

Prueba esto:

var lastValue = ''; 

$(document).click(function(event) { 
    var newValue = $('#theInput').val(); 

    if ($(event.target).is('#theLink')) { 
     // The link was clicked 
    } else if (newValue !== lastValue) { 
     // Something else was clicked & input has changed 
    } else { 
     // Something else was clicked but input didn't change 
    } 

    lastValue = newValue; 
}); 

jsFiddle: http://jsfiddle.net/PPvG/TTwEG/

+0

Parece que funciona, pero estoy un poco preocupado en términos de rendimiento al capturar todos los eventos 'click' en la página. – Pablo

+0

@Pablo: ¿es probable que el usuario haga clic tanto que haga una diferencia notoria? – PPvG

+0

Ok, finalmente he optado por algo similar a su solución. Muchas gracias. Solución final JSFiddle es [aquí] (http://jsfiddle.net/hTqNr/27/) en caso de que ayude a alguien. – Pablo

1

Ok, ahora lo tengo, se puede hacer

$('#theLink').live('click', function(e){ 
    alert('click'); 
}); 

$('#theInput').live('change', function(e){ 
    //Check if the change events is triggerede by the link 
    if(e.originalEvent.explicitOriginalTarget.data === "Click me"){ 
     //if this is the case trigger the click event of the link 
     $('#theLink').trigger("click"); 
    }else{ 
     //otherwise do what you would do in the change handler 
     alert('change'); 
    } 
}); 

violín aquí http://jsfiddle.net/hTqNr/19/

+0

Gracias por su respuesta. Sin embargo, recibo un error: 'No se puede leer la propiedad 'datos' de undefined' – Pablo

+0

@Pablo lo siento, pero el violín estaba equivocado http://jsfiddle.net/hTqNr/19/ –

+0

Ok, ahora veo. El error anterior ocurre cuando se usa el navegador Chrome, pero funciona con Firefox. – Pablo

0

por qué no recoger el valor del cuadro de entrada. usted tiene que almacenar el valor inicial del cuadro de entrada en función de listas

initialvalue= $('#theInput').val(); 

luego comparar el valor

$('#theLink').live('click', function(){ 
    var newvalue =$('#theInput').val(); 
     if(newvalue!=initialvalue) { 
      //do something 
     } 

    }); 
+0

Con su código, no aparece el mensaje 'change' cuando el valor cambia y el usuario hace clic fuera del enlazar. Además, lo que quiero es que cuando el usuario haga clic en el enlace no me importe el cambio de valor. – Pablo

1

Ambos eventos dispararán, pero en su ejemplo la alerta en el controlador onchange caso despedido cuando el evento onmousedown ocurre detendrá el evento onmouseup requerido para el evento onclick para disparar. El uso de console.log mostrará la activación de ambos eventos.

http://jsfiddle.net/hTqNr/4/

+0

Es cierto. Voy a editar la pregunta. – Pablo