2010-09-14 66 views
24

在选择列表的火jQuery的变化()事件我有一个选择框无法从华廷

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

和jQuery

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

并有华廷测试

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

在IE中,这会更改选择框,但不会触发jquery事件处理程序。我意识到围绕IE中change()事件处理程序的许多问题。所以我尝试添加了一些东西到测试到事件迫使火:

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

我也试图选择框外单击以清除病灶,希望这将触发事件。

任何想法?

+0

+1:刚刚碰到同样的问题我自己 – Mayo 2011-02-22 15:27:21

+0

+1:我也是。有没有人报告过这个bug? – 2011-06-30 12:46:56

回答

17

您可以手动触发事件:

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

你烧不改变价值的其他JavaScript事件,所以他们不会触发change事件。

+2

谢谢!我最终从Watin做到了这一点:Browser.Eval(“$('#myselectbox')。change();”)并且做到了! – fredw 2010-09-16 19:34:37

15

从Matt Ball的回答和OP的附加步骤中,我将下面的扩展方法添加到测试帮助类中。

using WatiN.Core; 

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

现在,到目前为止,无论如何,我已经成功地做到了:

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

OK,它充其量是一个小的方便,但我发现它是有用的。无论如何,来自我的OP和答案!

+0

不错!感谢您添加这个额外的善良。 – fredw 2011-02-11 04:56:07

7

当页面上有两个元素具有相同的ID时,使用JQuery ID选择器可能会产生问题。下面的代码应该深入到相应的WaitN元素

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

但是再一次,您不应该在同一页上有两个具有相同ID的元素,因为这与HTML 4和HTML 5规范相反。 – 2012-10-17 15:14:44

+0

只有当_jQuery_不存在于页面上时,才想知道如何单独使用** JavaScript **来执行此操作?我发现这个更好。 – rahoolm 2013-12-21 05:33:38

+0

如果select例如没有设置ID,这非常有用。 – 2014-10-24 19:48:22

0

这似乎是IE的fireEvent中的一个错误。 WatiN的SelectList.Select()生成类似于

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

其中,watin3是本机HTMLSelectElement。 fireEvent调用不会触发jQuery附加事件。你可以通过手动调用$('#id')[0].fireEvent('onchange');

所以你最好的选择是像其他人使用jQuery一样手动触发事件。

0

这为我工作:

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

必须这样做,因为jQuery在尝试其他方式时没有被定义为某种原因。 – rball 2012-02-23 21:19:25

1

“变化” 是该事件。 “onchange”是事件处理程序。 WatiN的Select()是越野车;它最终会发射“onchange”,好像它是一个事件,它不会帮助想要“改变”事件的海报发射。

正如答案中所述,最终必须使用JavaScript/JQuery来触发“更改”事件才能解决此问题。