这样你可以更好地想象它,我有一个用于显示日历的酒店管理应用程序的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)
}
}
答案 0 :(得分:0)
我认为你应该重新考虑整体算法。
据我了解,您正在尝试创建一个允许同时修改数据的Web应用程序(在本例中为:日历条目)。
这可以通过用于同时编辑文本文档(例如Google Docs)的算法来解决 - 但这可能是一种过度杀伤。
我建议使用本地锁定的方法:
一旦用户点击该元素,AJAX调用就需要从服务器获得一个“租约”来修改该元素。服务器将响应一条消息,告诉客户端当前已锁定( - >用户无法修改它)或告诉客户端现在允许修改它的内容 - 所有其他客户端现在将获取锁定的消息当他们试图修改它时
然后在客户端上你可以写任何你想要的东西(直到超时)
再次离开该元素后,客户端会向服务器发送一条消息,其中包含新内容以及现在再次解锁的信息。
如果您还需要其他客户端的实时更新,您可以通过计时器发送当前内容。