2012-06-26 13 views
10

Bien, no veo por qué esto no funciona. Parece bastante simple.HTML <select> JQuery .change no funciona

Aquí está mi menú desplegable:

<div> 
    <form> 
     <select id='yearDropdown'> 
      <c:forEach var="years" items="${parkYears}"> 
       <option value=/events.html?display_year=${years}<c:if test="${currentYear == years}">selected="selected"</c:if>>${years}</option> 
      </c:forEach> 
     </select> 
    </form> 
</div> 

y aquí está el código JavaScript

$("#yearDropdown").change(function() { 
    alert('The option with value ' + $(this).val()); 
}); 

En este momento sólo quiero conseguir que funcione para que pueda agregar funcionalidad. ¡Gracias!

+0

¿Cuál es el resultado representado del control (ver fuente, inspeccionar elemento, etc ...)? –

+0

perdóneme, no sé lo que está preguntando. Soy un estudiante de CS y prácticamente no tengo conocimiento de javascript – theCamburglar

+0

¿Lo tiene ejecutándose en un $ (documento). listo (función() {ESTE CÓDIGO AQUÍ}); o solo un $ (función() {CÓDIGO AQUÍ}); ? Me parece correcto ... – ntgCleaner

Respuesta

27

Ese código es sintácticamente correcto. Lo más probable es que lo ejecute en el momento equivocado.

Usted desea enlazar el evento cuando el DOM está listo :

$(function(){ /* DOM ready */ 
    $("#yearDropdown").change(function() { 
     alert('The option with value ' + $(this).val()); 
    }); 
}); 

O bien, utilizar live:

$("#yearDropdown").live('change', function() { 
    alert('The option with value ' + $(this).val()); 
}); 

O bien, utilizar delegate:

$(document.body).delegate('#yearDropdown', 'change', function() { 
    alert('The option with value ' + $(this).val()); 
}); 

O, si está utilizando jQuery 1.7+:

$("#yearDropdown").on('change', function() { 
    alert('The option with value ' + $(this).val()); 
}); 

No obstante, por lo general es la mejor manera de ejecutar un script una vez que el navegador ha terminado la prestación de marcado.

+0

No importa porque '.change' se aplicará a cada elemento recién agregado. (Corrígeme si es incorrecto) –

+3

@Derek: Estás equivocado, se aplica a los elementos que coinciden con la expresión (#yearDropdown) en el momento en que se ejecuta la línea. jQuery no supervisa los elementos nuevos ni nada por el estilo. – WhyNotHugo

+1

@ user1469925 La diferencia es que se llama a esta función una vez que el documento ha terminado de cargarse y se ha creado el DOM. Su código se ejecuta tan pronto como se lee, y es posible que DOM aún no esté listo; la selección aún no existe. – WhyNotHugo

0

No estoy seguro si esto ayudará, pero usted podría intentar esto:

$("#yearDropdown").live("change", function() { 
    alert('The option with value ' + $(this).val()); 
}); 
+4

'A partir de jQuery 1.7, el método .live() está en desuso. Use .on() para adjuntar manejadores de eventos. ' –

+0

¿Lo es? Necesito leer las notas de la versión, entonces supongo. Gracias por la info. – Logard

+0

http://liveisdeprecated.com –

1

He intentado su código in jsFiffle. Agregué manualmente algunos años como opciones. Funciona bien.

Sólo se unen al evento en el .Cambiar $ (document) ready:

$(document).ready(function(){ 
    $("#yearDropdown").change(function() { 
     alert('The option with value ' + $(this).val()); 
    });​ 
});