AppendText和TypeText与IE9的问题(特别是与变更事件)

时间:2011-08-17 19:06:15

标签: jquery internet-explorer-9 watin event-handling

所以最近我们强迫我们的应用程序在IE9模式下运行,从那时起WatiN typetext,AppendText与TriggerClientChange(显示如下)不会再激活页面上的JS。

这是情况......它是一个文本字段,用于快速搜索我们的应用程序。 OnFocus,弹出一个菜单,当键入发生时,它会搜索数据库并填充带有结果的选择菜单。在过去两年中,使用AppendText和TypeText与此方法TriggerClientChange一起工作正常

    public static void TriggerClientChange(this Element element)
    {
        //var Id = element.Id.Replace("[", @"\\[").Replace("]", @"\\]");
        if (String.IsNullOrEmpty(element.Id))
        {
            element.Id = "x" + Guid.NewGuid().ToString("N");
        }

        string selector = "[id=\"" + element.Id + "\"]";

        //if (element.Name == null)
        //    throw new ElementExtensionException("element: " + element.ToString() + " doesn't exist.");

        if (element is CheckBox)
        {
            selector += ":checkbox";
        }
        element.DomContainer.WaitForComplete();
        element.DomContainer.Eval("var elt = window.$('" + selector + "'); if(elt.length > 0) { elt.trigger('change'); }");
        element.DomContainer.WaitForAjaxComplete();
        element.DomContainer.WaitForComplete();
    }

现在我们正在支持IE9和HTML5,我们决定强制使用IE9和标准。从那时起,当在搜索文本字段中输入值时,在调用TriggerClientChange(运行JS)时,不会触发JS。我们尝试过.change的不同排列没有成功,如:

    public static void ForceChange(this Element element)
    {
        element.DomContainer.Eval(String.Format("$({0}).change();", element.GetJavascriptElementReference()));
    }
    public static void ForceChange(this Element element)
    {
        element.DomContainer.Eval("$('#" + element.Id + "').change();");
    }

不像过去那样产生结果。下面是QuickSearch方法,它将值键入文本框已经工作了很长时间,直到我们强制使用IE9标准

    internal void SetQuickSearchTextbox(string val)
    {
        this.Browser.TextField("navBarQuickContactSearch").AppendText(val);
        this.Browser.TextField("navBarQuickContactSearch").TriggerClientChange();
        this.Browser.WaitForAjaxComplete();

        Thread.Sleep(5000);

        ElementCollection results = this.Browser.Div(Find.ByClass("ac_results")).ElementsWithTag("li");
        results[1].Click();
    }

最后这是TypeText

    protected virtual void SendKeyPresses(string value)
    {
        var length = value != null ? value.Length : 0;

        if (TextField.MaxLength != 0 && length > TextField.MaxLength)
        {
            length = TextField.MaxLength;
        }

        for (var i = 0; i < length; i++)
        {
            var character = value[i];

            FireKeyDown(character);
            FireKeyPress(character);
            FireKeyUp(character);
        }
    }

    protected virtual void FireKeyUp(char character)
    {
        TextField.KeyUp(character);
    }

    protected virtual void FireKeyPress(char character)
    {
        TextField.KeyPress(character);
    }

    protected virtual void FireKeyDown(char character)
    {
        TextField.KeyDown(character);
    }

总结:这些工作一直有效,直到IE9被迫。是的,这在手动输入文本字段时有效,但现在脚本没有。像以前一样更改元素。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

我们使用以下代码修复了此问题。它模拟了缺少的jquery事件:

var evt = jQuery.Event("keydown");   
evt.keyCode = $.ui.keyCode.RIGHT;   
$('input.ac_input').focus().val('SOME TEST TEXT').trigger(evt);

这是一个通过Browser.Eval运行的解决方法。打破它的ie9模式的变化仍未确定。