卸载时的同步跨域ajax DELETE请求
Synchronous cross-domain ajax DELETE request on unload
我正在处理需要锁定的跨域远程资源。CORs标头设置正确
我正在尝试解决当浏览器窗口关闭时资源未被客户端释放的情况(直到锁定到期)。
我希望在窗口卸载时发送一个同步DELETE请求。我使用jquery(答案可以是纯javascript,如果有必要…我注意到他们的文档说"跨域请求……不支持同步操作",我变得很难过。
是否有可能使一个同步跨域ajax请求?jquery的限制是由于旧的浏览器吗?我读到的所有内容都表明,如果ajax调用是异步的,那么卸载事件侦听器的存在时间将不够长,因此建议使用同步请求进行这种类型的清理。不幸的是,这个呼叫是跨域的…我能做什么?
编辑
所以我很好奇如果我在本地开发(即客户端在127.0.0.1:8080和api在127.0.0.1:8081)或jquery文档只是误导。接下来的事情会给我带来麻烦吗?
这似乎是在Chrome45工作:
var unload_event = "unload." + lock.id
function release_lock(sync) {
$.ajax({
method: "DELETE",
async: !sync,
data: lock,
url: lock.url,
error: function(){
console.log("failed to release lock " + JSON.stringify(lock));
},
success: function(){
console.log("lock " + lock.id + " released");
lock = null;
$(window).off(unload_event);
}
});
}
$(window).on(unload_event, function(){
release_lock(true);
});
它会在控制台中生成以下警告:
Synchronous XMLHttpRequest on the main thread is deprecated because of
its detrimental effects to the end user's experience.
For more help, check http://xhr.spec.whatwg.org/.
我会避免在卸载事件中这样做,因为同步ajax是唯一可行的方法,而同步ajax请求在某些现代浏览器中已被弃用。
选项包括:
keepalive请求这将涉及定期向服务器发送请求,表明用户仍在编辑资源。这种技术的缺点是,在超时发生之前,资源将保持锁定状态,因此,如果将keepalive设置为1分钟的间隔和3分钟的锁定超时,那么在用户离开页面后,它将保持锁定状态长达3分钟。此外,如果用户失去网络连接3分钟或更长时间,它也将被解锁。
websockets
这将在客户端和服务器之间创建一个打开的连接,当这个连接打开时,您可以保持资源锁定。一旦客户端断开连接,您就可以假设客户端已经关闭了页面并将其解锁。这里的缺点是,如果客户端失去网络连接,它也将被解锁。
- 无法在通过jQuery的ajax加载的页面中执行javascript
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在php文件中获取$.post-ajax传递的值
- Replacing $ .ajax?
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- Ajax发布表单序列化,发布引号'
- 通过Ajax将JavaScript函数传递给PHP文件
- ajax请求的顺序总是不同的
- jquery ajax delete 404 error
- 使用get/put/delete方法从ajax请求调用laravel-controler
- Javascript (Jquery lib 1.9.1) Mutli file-upload ajax delete
- PHP AJAX MySQL DELETE not working
- Ajax、重定向和DELETE
- 卸载时的同步跨域ajax DELETE请求
- Ajax在MVC模式下GET/POST/PUT/DELETE的区别
- 删除的AJAX路由错误.为什么索引页出现DELETE路由错误
- 骨干模型.destroy不起作用,但ajax delete调用可以
- AJAX DELETE方法重定向不起作用
- 在Rails中使用AJAX进行DELETE请求时,如何从表单中获得不同的id值
- Ajax IndexedDB Delete当前上传成功