javascript - 确保 TextBox OnTextChanged(ASP.NET 注入(inject) "setTimeout")在 OnClick 之前触发

标签 javascript asp.net

考虑以下场景:

<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 始终在单击之前触发?

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);
            }
        }
    });
}

关于javascript - 确保 TextBox OnTextChanged(ASP.NET 注入(inject) "setTimeout")在 OnClick 之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809913/

相关文章:

Javascript注入(inject)覆盖响应式 slider 的CSS

javascript - 如何将整个 GWT 包装在 div 中?

java - 如何在 Birt 中开发报表并在 ASP.NET 中使用?

c# - 访问检索到的数据

c# - 是否首先调用母版页?

javascript这种形式相当于jquery形式

javascript - 如何在javascript中创建行高的倍数?

javascript - 为什么对我的指令使用 ng-repeat 会对我的绑定(bind)产生影响?

asp.net - 停止调试后能否使ASP.NET Core网站保持运行状态?

c# - ASP.NET 与 Oracle 连接问题