两个JavaScript“进程”

时间:2009-10-01 17:24:28

标签: javascript javascript-events asynchronous

我正在使用名为DHTMLXGrid的产品,这是一个JS库,用于在网页上创建类似电子表格的表格。

当我编辑一个单元格,然后在单元格外单击时,会触发一个事件(它们称之为onCellEdit)并且我会处理该事件 - 一个AJAX调用将单元格数据保存到数据库中。

但是,如果用户编辑单元格并单击网格外部触发其他JavaScript的按钮,则onCellEdit处理程序在新JS代码运行之前无法运行。没有深入细节,这会使事情变得混乱。

所以我有“网格代码”和“按钮代码”,我希望按钮代码等到网格代码完成。

所以我尝试在Button代码运行的开头插入一个愚蠢的sleep()方法。我错误的想法是,这会给Grid代码一个运行的机会。但这假设多线程,当然我们没有。结果是所有JS代码执行都被搁置,我的Button代码仍然在Grid代码之前执行。

因此,一般问题是单击按钮会从先前选定的元素中移除焦点。点击和更改/模糊都是事件。我希望在click事件之前处理blur事件。相反似乎发生了。我假设在纯JS中它会以这种方式工作(我没有尝试过),但这是一个复杂的库,它可以自己做。

底线 - 有没有办法我可以异步暂停我的Button代码以完成Grid代码,然后继续使用Button代码?

谢谢,

3 个答案:

答案 0 :(得分:0)

在按钮处理程序中设置一个小的(但不是太小)超时,如下所示:

setTimeout(function {
    //Button handler
}, 100);    //100 means this will execute after 100 milliseconds.

如果网格代码开始运行befoer定时器“响铃”,则该函数将仅在网格代码完成后执行(因为Javascript是单线程的)。您应该选择一个足够大的超时值,让网格代码在响铃之前开始运行。

答案 1 :(得分:0)

这听起来像是一个混搭: - (

您可以尝试在点击处理程序的开头设置超时:

function myClickHandler(event) {
    // make sure we have the stuff we need from the event object
    var something = event.someProperty;
    var x = event.x;
    setTimeout(function() {
        doWonderfulThings(something, x);
    }, 1);
}

尽管有1毫秒的延迟,但所有浏览器在运行内部函数之前都会等待至少10毫秒,并且在此期间应该处理模糊事件。当然,如果模糊事件的处理需要很长时间 - 比如超过大约二十分之一秒 - 那么用户将会感觉到按钮响应的延迟,这可能会成为一个问题......

编辑:我已经从0ms改为1ms,因为我记得有一些非常老版本的Opera出现0问题 - 不太可能成为问题,但你不能太小心

答案 2 :(得分:0)

我认为你最终无法依赖任何明确的事件循环处理系列。什么可能比添加简单的交叉手指超时延迟更有效地工作将是“onCellEdit”的直接事件处理程序和控制按钮都只是添加命令块(可能只是可调用的闭包)到不同的工作队列。为您的页面提供100毫秒(或50毫秒或其他)间隔计时器,该计时器运行代码以从这些队列中解脱出来。让代码按需要优先处理工作 - 首先更改单元格,然后按下按钮X,最后按钮Y,或者其他任何内容。当然,这种方法仍然容易受到这样的情况的影响,即你的间隔计时器事件在表格单元格中的“模糊”和按钮上的“mousedown”(或“点击”)之间徘徊。

相关问题