JQuery AJAX调用本地更新脚本在Safari中失败,在Chrome和FF中工作


JQuery AJAX calling local update script fails in Safari, works in Chrome and FF

在本地脚本上进行AJAX调用以使用POST更新dbase。 错误报告并没有给我太多的可继续。 适用于IE,Chrome和FF,但不适用于Safari 6。 其他JQuery功能在Safari中工作,Firebug DOM选项卡显示JQuery有。 下面是 AJAX 代码块。

$.ajax({
    type: "POST",
    url: "updatead3.php",
    data: {pos_data: dd_elm},   //index array created earlier
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
}).done (function(data) {
    if(console && console.log) {
       console.log("AJAX success: " + data);
    }
}).fail(function(obj,status,error) {
     alert("AJAX Error:" + obj.error);
});
alert("Changes were saved!");
location.reload();
)};
)}:

在"检查 jquery-1.9.1.js"菜单选项>"Firebug 脚本"选项卡下,将显示"拒绝访问受限 URI"。 但如果这是一个跨域问题,我不会期望任何JQuery功能。提前致谢

在处理$.ajax(或任何与此相关的异步代码)时,应始终记住:"下面"并不意味着"之后"。

要使一些代码在解析调用后立即执行$.ajax()无论成功与否,仅仅在$.ajax下编写是不够的 - 实际上,除非它引入了一个等待块(就像alert一样),否则它的代码将始终在任何 ajax 回调有机会工作之前执行。

相反,您应该使用 Promise 接口提供的方法(以及$.ajax返回的jqXHR对象):

  • .done(),在成功解析 AJAX 调用时触发
  • .fail(),在解析 AJAX 调用并出现错误时触发
  • .always(),无论如何在解析 AJAX 调用时触发(并且 .done/.fail 方法中指定的所有回调也已完成)。

在此特定情况下,在仍处理 AJAX 调用时触发页面的重新加载。首先,这对某些浏览器来说是令人困惑的,实际上在大多数情况下会阻止您正确处理 AJAX 的结果。

相反,应该做的是将代码放入$.ajax().always()回调中:

$.ajax({ some: 'settings'})
 .done(function() { console.log('SUCCESS :)'); })
 .fail(function() { console.log('FAIL :('); })
 .always(function() { console.log('Doh, I''m fired anyway'); });