2010-09-14 6 views
24

Tengo una caja de selecciónincapaz de disparar el cambio jQuery evento() en selectlist de WatiN

<select id="myselectbox"> 
    <option value='a'>First option</option> 
    <option value='b'>Second option</option> 
</select> 

y jQuery

$('#myselectbox').change(function() { 
    ... 
}); 

Y una prueba WatiN

SelectList list = Browser.SelectList(Find.ById("myselectbox")); 
list.Select("First option"); 

En IE, esto cambia el cuadro de selección, pero no activa el controlador de eventos jquery. Soy consciente de los muchos problemas que rodean al controlador de eventos change() en IE. Así que he intentado añadir una serie de cosas a la prueba para forzar el evento al fuego:

list.Blur(); 
list.Keypress('\r'); 
list.Click(); 

También traté de hacer clic fuera del cuadro de selección para eliminar el foco, esperando que esto desencadenar el evento.

¿Alguna idea?

+0

+1: Acabo de encontrarme con el mismo problema – Mayo

+0

+1: yo también. ¿Alguien ha informado esto como un error todavía? –

Respuesta

17

Se puede disparar manualmente el evento:

$('#myselectbox').change(); 

Los otros eventos de JavaScript que está disparando no cambie el valor, para que no se dispare el evento change.

+2

¡Gracias! Terminé haciendo esto de Watin: Browser.Eval ("$ ('# myselectbox'). Change();") ¡y eso funcionó! – fredw

15

Al salir de la respuesta de Matt Ball y de los pasos adicionales de OP, agregué el siguiente método de extensión a una clase de ayuda de prueba.

using WatiN.Core; 

namespace Some.Test.Project 
{ 
    public static class WatiNExtensions 
    { 
     public static void ForceChange(this Element e) 
     { 
      e.DomContainer.Eval("$('#" + e.Id + "').change();"); 
     } 
    } 
} 

Ahora, en lo que va de todos modos, he tenido éxito en hacer:

SelectList list = Browser.SelectList(Find.ById("myselectbox")); 
list.Select("First option"); 
list.ForceChange(); 

bien, se trata de un menor de edad en el mejor de conveniencia, pero me resulta útil. De todos modos, votos positivos de mi para el OP y la respuesta!

+0

¡Agradable! Gracias por agregar esta bondad adicional. – fredw

7

El uso del selector de ID JQuery puede crear problemas cuando hay dos elementos en una página con la misma ID. El siguiente código debe profundizar en el elemento WaitN correspondiente exacto

Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference())); 
+2

Pero, una vez más, no debe tener 2 elementos con la misma ID en la misma página, ya que eso va en contra de las especificaciones HTML 4 y HTML 5. –

+0

¿Solo quería saber cómo hacerlo usando ** JavaScript ** solo cuando _jQuery_ no está allí en la página? Encontré este mejor. – rahoolm

+0

Esto es muy útil si la selección no tiene un ID establecido, por ejemplo. –

0

Parece un error en fireEvent de IE. de WatiN SelectList.Select() genera algo similar a

var newEvt = document.createEventObject(); 
newEvt.button = 1; 
watin3.fireEvent('onchange', newEvt); 

Dónde watin3 es la HTMLSelectElement nativa. La llamada fireEvent no activa los eventos adjuntos jQuery. Puede reproducirlo llamando manualmente al $('#id')[0].fireEvent('onchange');

Por lo tanto, su mejor opción es disparar manualmente el evento como otros sugirieron usar jQuery.

0

Esto funcionó para mí:

public static void SelectByValueAndBlur(this SelectList selectList, string value) 
    { 
     selectList.Focus(); 
     selectList.SelectByValue(value); 
     selectList.Blur(); 
    } 
+0

Tuve que hacerlo de esta manera porque jQuery no se definió por algún motivo al probar las otras formas dadas. – rball

1

"cambio" es el evento. "onchange" es el controlador de eventos. WatiN's Select() tiene errores; en última instancia, se activa "onchange" como si fuera un evento, lo que no ayuda al autor que desea que se active el evento "change".

En última instancia, uno tiene que usar JavaScript/JQuery para activar el evento de "cambio", como se indica en la respuesta, para evitar este error.

Cuestiones relacionadas