javascript - 我可以控制 javascript/jQuery 事件触发的顺序吗?

标签 javascript jquery asp.net webforms

背景

我有带有网格的 asp.net Web 表单,当用户更新该网格中的文本框时,onchange 事件将启动 WebMethod 调用并更新已更改行的其余部分。当时没有保存任何内容——我们只是更新 UI。

要提交更改,请单击“保存”按钮。

这实际上在几乎所有场景下都能可靠地工作。然而,有一个非常持久的问题,我觉得我应该能够解决,但现在是时候请专家了。

问题场景

我正在使用 jQuery 捕获回车键,不幸的是该事件首先触发,导致页面在回调完成之前提交。该行未正确更新。陈旧且令人困惑的数据被保存。

更新

我认为您不能使输入行为依赖于回调,因为您可以保存而不更改行。在这种情况下,如果您不更改一行,则它永远不会保存。

现在,如果有某种方法可以检查 javascript 的内部要做的事情列表,或者创建我自己的列表,然后以某种方式管理它,那就行了。但这对于一些本来应该很容易的事情来说是一些繁重的工作。因此,除非专家告诉我其他情况,否则我必须假设这是错误的。

尝试

现在我正在使用内置的 jQuery 事件,并且我已经得到了这个精心设计的 setTimeout 来坚持尝试保存的事实,暂停足够长的时间以使 WebMethod 至少被调用,并依赖于回调进行提交。但事实证明 javascript ansychrony 并没有按照我希望的方式工作,并且 onchange 事件甚至不会触发,直到该代码块完成。这太令人惊讶了。

我想我可以使用自己的小对象以正确的顺序对这些事件进行排队,并找到一种聪明的方法来触发它,等等。

这一切似乎都是错误的方向。当然,这是疯狂的矫枉过正,这是一个常见问题,我忽略了一个简单的解决方案,因为我不使用 javascript 24/7 工作。

对吗?

代码

这就是我此刻所得到的。这显然不起作用——我试图利用 jquery 的异步特性,但所有这些显然都必须在行的 onchange 事件触发之前结束:

$(document).bind("keypress", function (e) {
    if (e.keyCode == 13) {
        handleEnter();
        return false; //apparently I should be using e.preventDefault() here. 
    }
});


function handleEnter() {
    setTimeout(function () {
        if (recalculatingRow) { //recalculatingRow is a bit managed by the onchange code.
            alert('recalculating...');
            return true; //recur
        }

        //$('input[id$="ButtonSave"]').click();
        alert('no longer recalculating. click!');
        return false;
    }, 1000);
}

典型的行如下所示。请注意,我没有使用 jquery 来绑定(bind)它:

 <input name="ctl00$MainContent$GridOrderItems$ctl02$TextOrderItemDose" type="text" value="200.00" maxlength="7" id="ctl00_MainContent_GridOrderItems_ctl02_TextOrderItemDose" onchange="recalculateOrderItemRow(this);" style="width:50px;" />

我可以发布 recalculateOrderItemRow 的代码,但它真的很长,现在的问题是它在按键后事件结束之前不会触发。

更新 Dos 根据Nick Fitzgerald (man 是一篇很酷的文章)setTimeout 的使用应该会导致它变得异步。进一步深入研究 setTimeout 和 jQuery 之间的交互,以及普通 javascript 事件和 jQuery 事件之间的交互。

最佳答案

阻止 ENTER 不应该给您带来这么多麻烦!确保您的代码中有类似的内容:

$(document).on('keydown', 'input', function(e) {
    if(e.keyCode == 13) {
       e.preventDefault();
    }
});

更新

看起来您确实想要在ENTER上保存,但前提是在change上更新UI之后。这是可能的。您可以使用上面 Matthew Blancarte 建议的标志,从 change 回调触发保存,并摆脱 setTimeout

但我不建议这样做。 您最好仅依靠保存按钮进行保存。如果不这样做,您的用户将必须等待两个异步操作完成才能完成保存。因此,您必须阻止 UI,或跟踪所有异步操作,并根据需要中止一些操作。我认为这是不值得的,如果保存时间太长,ENTER 对于用户来说会变得不太直观。

关于javascript - 我可以控制 javascript/jQuery 事件触发的顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10116709/

相关文章:

javascript - Google Optimize 停止将 utm_expid 添加到 URL 作为参数?

javascript - 如何在 d3.js 中加速力布局动画

jQuery 移动切换按钮开/关?

javascript - 使用 d3 绘制箭头

asp.net - 如何以编程方式将参数传递给 SSRS 报告

php - onclick -> mysql 查询 -> javascript;同一页

javascript - 网络录音,预设: 16000Hz 16bit

jQuery 表单验证插件默认文本

c# - 货币的正则表达式缺少个位数?

asp.net - 使用 ADO.NET 在 VB 2008 中的不同网页上显示数据库