1

我正在开发一个 javascript (jQuery) 应用程序,该应用程序收集用户数据(姓名、性别、生日等)并将其发送到 Heroku 托管的 Rails 应用程序。Rails 从请求中读取 JSON 并且应该创建一个新记录。我的代码如下

params = {};
params.session_user = {};

var e = {
    "username"    :    localStorage.getItem("UN"),
    "gender"      :    gender,
    "birthdate"   :    birthdate,
    "session_id"  :    getSessionID(),
};
params.session_user = e;
$.post("https://***.herokuapp.com/session_users", params);

这适用于 Firefox、Chrome、Opera 和 IE,但不适用于 Safari。Safari 继续说 POST 请求已被取消,并且从未在数据库上创建任何记录。

同样,jQuery 应用程序也会收集应用程序每个页面上的使用数据,称为 focus_events。我使用了相同的格式,

var e = {
    "timestamp"  : (new Date).toUTCString(),
    "focus_type" : type,
    "page"       : page_id,
    "problem_set": problem_set_id,
    "session_id" : getSessionID(),
  }
 params={};
 params.focus_event={};
 params.focus_event=e;
 $.post("https://***.herokuapp.com/focus_events",params);

这在大多数情况下都有效。但偶尔,在所有浏览器中,POST 请求也会显示为已取消。对此和Safari问题的任何帮助将不胜感激

4

1 回答 1

0

我解决了这个问题。在这里为后代发布答案。$.post()(它只是 ajax() 的包装器)默认异步发送请求。当用户单击下一页按钮时,我的请求被发送,当浏览器加载新页面时,请求被切断。将我的 $.post(...) 更改为

$.ajax({
    url    :    "https://***.herokuapp/controller_name",
    data   :    params,
    type   :    'POST';
    async  :    false,
});

效果很好。解决了 Safari 问题和 focus_event 问题。请注意,同步发送时,取决于服务器的响应速度,您可能需要耐心等待请求完成。在请求完成之前,浏览器不会加载下一页。

于 2013-09-18T15:12:08.730 回答