Подтвердить что ты не робот

Невозможно запустить событие jQuery change() в избранном списке из WatiN

У меня есть поле выбора

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

И jquery

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

И тест WatiN

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

В IE это изменяет поле выбора, но не запускает обработчик события jquery. Я знаю о многих проблемах, связанных с обработчиком события change() в IE. Поэтому я попытался добавить к тесту несколько вещей, чтобы заставить событие срабатывать:

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

Я также попытался щелкнуть за пределами поля выбора, чтобы удалить фокус, надеясь, что это запустит событие.

Любые идеи?

4b9b3361

Ответ 1

Вы можете вручную запустить событие:

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

Другие события JavaScript, которые вы запускаете, не изменяют значение, поэтому они не будут запускать событие change.

Ответ 2

Отключение ответа 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();

Хорошо, это в лучшем случае небольшое удобство, но я считаю это полезным. Во всяком случае, от меня зависит от OP и ответа!

Ответ 3

Использование JQuery ID Selector может создавать проблемы при наличии двух элементов на странице с тем же идентификатором. Следующий код должен быть развернут до соответствующего соответствующего элемента WaitN

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

Ответ 4

"change" - это событие. "onchange" - это обработчик событий. WatiN Select() не работает; он в конечном счете стреляет "onchange", как если бы это было событие, которое не помогает плакату, который хочет, чтобы произошло событие "изменения".

В конечном счете, нужно использовать JavaScript/JQuery для запуска события "изменения", как указано в ответе, чтобы обойти эту ошибку.

Ответ 5

Кажется, что ошибка в 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.

Ответ 6

Это сработало для меня:

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