jQuery Ajax call - Set variable value on success
我正在编写的应用程序修改服务器中缓存对象上的数据。修改是通过一个Ajax调用执行的,该调用基本上更新了该对象的属性。当用户完成工作后,我有一个基本的"保存更改"按钮,允许他们保存数据并刷新缓存的对象。
为了保护用户,我希望在对服务器对象进行了修改(如果尚未保存)时,如果尝试离开页面,则向他们发出警告。因此,我创建了一个名为IsInitialized的Web服务方法,它将根据是否保存了更改返回true或false。如果他们没有被保存,我想提示用户并给他们一个机会取消他们的导航请求。
这是我的问题-虽然我的调用工作正常,但我似乎无法获得Ajax成功调用来设置其回调函数的变量值。这是我现在的密码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ////Catches the users to keep them from navigation off the page w/o saved changes... window.onbeforeunload = CheckSaveStatus; var IsInitialized; function CheckSaveStatus() { var temp = $.ajax({ type:"POST", url:"URL.asmx/CheckIfInstanceIsInitilized", data:"{}", contentType:"application/json; charset=utf-8", dataType:"json", success: function(result) { IsInitialized = result.d; }, error: function(xmlHttpRequest, status, err) { alert(xmlHttpRequest.statusText +"" + xmlHttpRequest.status +" :" + xmlHttpRequest.responseText); } }); if (IsInitialized) { return"You currently have unprocessed changes for this Simulation."; } } |
我觉得我可能试图以不适当的方式使用成功回调。如何在success回调上设置一个javascript变量,以便我可以决定是否应通过未保存的更改消息提示用户?
正如前面所指出的,我正在进行异步调用,这意味着在我的方法返回之前调用了其余的代码。是否有方法使用该Ajax调用,但仍捕获window.onUnload事件?(不使用Synchronos Ajax)
由于在卸载事件中需要这种行为,因此必须进行同步调用。但是,它可能会冻结浏览器窗口/选项卡,这取决于调用需要多长时间,但因为您正在有效地阻止用户关闭窗口…
向JSON中添加
jquery页面示例:
1 2 3 4 | var html = $.ajax({ url:"some.php", async: false }).responseText; |
来源:http://api.jquery.com/jquery.ajax/
问题是对Ajax调用的请求是异步的。因此,当您检查您是否已初始化时,调用尚未完成。
我建议在成功功能中指定您的行为。
基本上,使用Ajax进行同步调用是不可能的,而不是真正令人气馁的。
我在尝试通过Ajax请求的成功回调为数据对象设置属性时遇到了类似的问题。使用
1 2 3 4 5 6 7 8 9 10 11 | function getSessionid() { $.ajax({ type: 'POST', url: 'getSession.php', dataType: 'text', success: function(result){myData.sessionid = result;}, error: function(data) {alert("Error! " + data);} }); setTimeout(function() {alert('sessionid = ' + myData.sessionid);},1); } |
仅仅是1毫秒的延迟就造成了世界上所有的不同。如果没有它,
从理论上讲,您可以终止事件(返回false)并在成功时关闭窗口,但我认为您会遇到一些用户设置的javascript限制,也会混淆他们为什么不关闭窗口。所以,我同意PawelKrakowiak的观点,Ajax调用本身必须是同步的。
我要补充的是,您要给用户一些通知,说明您正在检查状态(请不要弹出窗口)。窗口顶部的一个漂亮的通知横幅),确保将$.Ajax"Timeout"选项设置为更合理的选项,这样他们就不会永远等待窗口关闭。
看起来对我来说最好的方法是在Ajax调用上使用async:false选项。尽管我理解拉沙克对这一点的犹豫,但我认为这种情况证明了这种手段的正当性。
杰尔夫也提出了一个很好的观点,那就是确保在我试图验证用户状态时不会让用户挂起。超时选项的耦合非常重要。
感谢所有评论的人。
请参见这里:
http://groups.google.com/group/jquery-dev/browse ou thread/thread/40d0e3def47148a0