请考虑以下情形:

<asp:TextBox ID="txt" runat="server" AutoPostBack="true" OnTextChanged="txt_TextChanged"></asp:TextBox>
<asp:Button ID="btn" runat="server" OnClick="btn_Click" CausesValidation="false" UseSubmitBehavior="false" />

呈现时,这两个控件变为:
<input name="txt" type="text" onchange="javascript:setTimeout('__doPostBack(\'txt\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="txt">
<input type="button" name="btn" onclick="javascript:__doPostBack('btn','')" id="btn">

由于setTimeout,Click事件在Change事件之前触发。

After some research,我发现ASP.NET这样做是由于某些旧版IE中的旧故障。

但是,这引起了问题,因为我的按钮单击隐藏了文本框,从而导致一些“无效的回发或回调”错误。

如何确定执行顺序,使TextChanged始终在Click之前触发?

PS :我愿意使用Javascript / jQuery来更改事件之一,但是我对这种解决方案的性能有所怀疑(因为我可能被迫为此使用eval)

最佳答案

我用一点技巧解决了这个问题,如果有人知道,我仍然愿意寻求更好的解决方案。
现在,我在页面加载时调用此函数:

function removeSetTimeout() {
    var inputs = "select, input[type=text], input[type=number], input[type=date], input[type=time]";
    $(inputs).each(function (index, elem) {
        var change = $(elem).attr('onchange');
        if (change) {
            var patch = /setTimeout\('__doPostBack\(\\'.*?\\',\\'\\'\)', 0\)/.exec(change);
            if (patch) {
                change = change.replace(patch[0], patch[0].substring(12, patch[0].length - 5).replace(/\\/g, ''));
                $(elem).attr('onchange', change);
            }
        }
    });
}

08-19 03:52