2010-09-14 3 views
24

Ich habe eine Auswahlbox abzufeuernkann nicht jQuery ändern() Ereignis auf Select von WatiN

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

Und jquery

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

Und ein WatiN Test

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

In IE, Dadurch wird das Auswahlfeld geändert, der jquery-Ereignishandler wird jedoch nicht ausgelöst. Ich bin mir der vielen Probleme bewusst, die den Ereignishandler change() in IE umgeben. Also habe ich versucht, indem eine Reihe von Dingen auf die Probe um das Ereignis zu Feuer zu zwingen:

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

Ich habe auch versucht, außerhalb der Auswahlbox klicken, um den Fokus zu entfernen, in der Hoffnung das würde das Ereignis ausgelöst.

Irgendwelche Ideen?

+0

+1: Gerade lief das gleiche Problem selbst – Mayo

+0

+1: ich auch. Hat das schon jemand als Fehler gemeldet? –

Antwort

17

Sie können manuell das Ereignis ausgelöst:

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

Die anderen JavaScript-Ereignisse Sie feuern den Wert nicht ändern, so dass sie das change Ereignis nicht ausgelöst.

+2

Danke! Ich habe das von Wattin aus getan: Browser.Eval ("$ ('# myselectbox'). Change();") und das hat den Trick gemacht! – fredw

15

Ausgehend von Matt Balls Antwort und den zusätzlichen Schritten des OP habe ich die folgende Erweiterungsmethode zu einer Testhelfer-Klasse hinzugefügt.

using WatiN.Core; 

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

Nun, so weit wie auch immer, ich habe das gelungen:

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

OK, es bestenfalls eine kleine Bequemlichkeit, aber ich bin es nützlich finden. Wie auch immer, Upvotes von mir für das OP und die Antwort!

+0

Schön! Danke, dass du diese zusätzliche Güte hinzugefügt hast. – fredw

7

Die Verwendung der JQuery-ID-Auswahl kann zu Problemen führen, wenn zwei Elemente auf einer Seite mit derselben ID vorhanden sind. Der folgende Code sollte

auf die genaue entsprechenden WaitN Element Drilldown
Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference())); 
+2

Aber andererseits sollten Sie nicht 2 Elemente mit der gleichen ID auf der gleichen Seite haben, da dies gegen die HTML 4 und HTML 5 Spezifikation ist. –

+0

Ich wollte nur wissen, wie man dies mit ** JavaScript ** alleine macht, wenn _jQuery_ nicht auf der Seite ist? Ich habe das hier besser gefunden. – rahoolm

+0

Dies ist sehr hilfreich, wenn die Auswahl zum Beispiel keine ID hat. –

0

Es scheint wie ein Bug im IE fireevent. WatiN der SelectList.Select() erzeugt etwas ähnliches wie

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

Wo watin3 die native Htmlselectelement ist. Der fireEvent-Aufruf löst keine jQuery-Ereignisse aus. Sie können es manuell repro-$('#id')[0].fireEvent('onchange');

So ist Ihre beste Wette, um das Ereignis manuell auslösen wie andere mit jQuery vorgeschlagen.

0

Dieser arbeitete für mich:

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

Hatte es so zu tun, weil jQuery aus irgendeinem Grund nicht definiert wurde, wenn man die anderen angegebenen Möglichkeiten ausprobiert. – rball

1

"change" ist das Ereignis. "onchange" ist der Event-Handler. WatiNs Select() ist fehlerhaft; es feuert schließlich "onchange" ab, als ob es ein Ereignis wäre, was dem Poster, das das "change" -Event auslösen möchte, nicht hilft.

Letztlich muss man JavaScript/JQuery verwenden, um das "change" -Ereignis auszulösen, wie in der Antwort angegeben, um diesen Fehler zu umgehen.