【问题标题】:jQuery-ajax call: async property is not working?jQuery-ajax 调用:异步属性不起作用?
【发布时间】:2010-06-14 07:25:29
【问题描述】:

在某些情况下,我不得不在会话中保留页面设置(Javascript 值),并且必须在离开页面之前完成(我不能使用 cookie,因为“pageSettings”可能会变得相当large 和 localStorage 还不是一个选项;))。所以这就是我尝试的方式。然而,当我再次直接调用页面时,“http://blabla.com/bla”的调用似乎是异步发生的,即使设置了异步属性(我没有收到上一个调用的设置,但之前的那个) :

$jQ(document).ready(function () {
    $jQ(window).unload(Main.__setSessionValues);
});

var Main = {
    pageSettings: {},

    __setSessionValues: function __setSessionValues() {
        $jQ.ajax({
            type: "POST",
            async: false,
            url: "http://blabla.com/bla",
            data: {
                pageSettings: Object.toJSON(Main.pageSettings)
            }
        });
    }
};

有人知道问题出在哪里吗?

提前致谢

【问题讨论】:

  • 这对于用户体验来说是非常值得怀疑的
  • OT:在 IE 上,您的代码将为__setSessionValues 生成两个单独的函数对象。这是 JScript 中的一个错误。对于引用的代码来说,这没什么大不了的(两个函数都非常小),但是如果您将这种模式用于很多东西,了解它很有用。问题是当您执行命名函数表达式时(您还同时分配给某个东西的function name() { ... })。 JScript 将其作为函数declaration 处理(创建一个函数),然后稍后将其作为函数expression 再次处理,从而创建一个完全独立的函数对象。很遗憾。
  • @jAndy:我知道这个解决方案远非最佳。但正如我所说……鉴于这种情况,我想不出更好的主意。将值放入会话的调用是微不足道的。我已经测试过了。您不会注意到同步调用产生的块。 @T.J。克劳德:有趣。我不知道。我使用命名函数进行调试(以避免调用堆栈中的所有匿名函数)。但我会记住这一点,以备将来使用。感谢您的提示:)

标签: javascript jquery ajax asynchronous


【解决方案1】:

代码看起来不错。您可以尝试bind('beforeunload', ...) 而不是unload,以便尽早抢到东西。但是,当然,如果还有其他东西也钩住了beforeunload 并且卸载被取消,那么即使你还在页面上,你的调用也会被调用。

有点离题,但如果你能找到不同的方法来做到这一点,我会的。当用户试图离开页面时触发同步 ajax 调用并不理想。

【讨论】:

  • 我也考虑过 beforeunload-event,但我记得我在某处读到它在 IE 中不起作用,所以我跳过了它......但是我现在已经尝试过了它可以工作...即使在 IE(7) 中 ;) 谢谢
  • @Prjio:很高兴有帮助。 beforeunload 确实在 IE(甚至 IE6)中工作,您可能听说过在 IE 中向用户显示来自 beforeunload 的消息的机制与在某些其他浏览器中有点不同。但是由于您没有显示消息... :-)
  • 显然我把它弄混了......似乎 beforeunload 曾经是一个 IE 事件(quirksmode.org/js/events_events.html -> Microsoft 事件)。但它也适用于 FF(与此同时,至少 ;) )...无论如何,感谢来自 beforeunload 事件的消息的提示 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多