0

为了更好地可视化它,我有一个用于显示日历的酒店管理应用程序的 PHP 脚本(表格列:每月的天数/行:每天的价格)。

我可以在编辑模式下访问这个脚本,它会在每个 .

当我更改字段的值时,ajaxcall 会执行后台作业并将更新的值返回给字段(以确认数据库中的新值已更新)。

当我缓慢更改值(每个字段超过 1 秒)时,它可以完美运行。但是当我尝试加快速度时(编辑值、TAB 到下一个字段、更改值等等),ajaxcall 会更新数据库,但无法更新回该字段。

关于为什么会发生这种情况的任何想法?以及如何解决?我在所有浏览器中都试过了。

HTML部分:

<td>
    <input type='text' id='$counter' onChange='updateAvailability(this,$idroomclass,\"$date\",$counter)'
    value='$total' />
</td>  

Javascript:

function ajaxRequest() {
    try {
        var request = new XMLHttpRequest()
    } catch (e1) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP")
        } catch (e2) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP")
            } catch (e3) {
                request = false
            }
        }
    }
    return request
}

function updateAvailability(vagos, idroomclass, date, input_id) {
    if (vagos.value != "") {
        params = "vagos=" + vagos.value + "&idroomclass=" + idroomclass + "&date=" + date
        request = new ajaxRequest()
        request.open("POST", "ajaxcalls/updateAvailability.php", true)
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
        request.setRequestHeader("Content-length", params.length)
        request.setRequestHeader("Connection", "close")
        request.onreadystatechange = function () {
            if (this.readyState == 4) {
                if (this.status == 200) {
                    document.getElementById(input_id).value = request.responseText;
                } else alert("Ajax error: " + this.statusText)
            }
        }
        request.send(params)
    }
}
4

1 回答 1

0

我认为你应该重新考虑整体算法。

据我了解,您正在尝试创建一个允许同时修改数据的 Web 应用程序(在本例中:日历条目)。

这可以通过用于同时编辑文本文档(例如Google Docs)的算法来解决——但这在这里可能是矫枉过正的。

我建议使用具有本地锁定的方法:
一旦用户单击该元素,AJAX 调用就需要服务器提供“租约”来修改该元素。服务器将响应一条消息,告诉客户端它当前已锁定(-> 用户无法修改它)或告诉客户端它现在允许修改它的内容 - 所有其他客户端现在将返回锁定消息他们试图修改它。
然后在客户端你可以写任何你想要的(直到超时)。
一旦您再次离开该元素,客户端就会向服务器发送一条消息,其中包含新内容以及它现在再次解锁的信息。

如果您还需要其他客户端的实时更新,您可以通过计时器发送当前内容。

于 2012-05-19T12:33:19.820 回答