哪些事件处理程序应该在窗口关闭时触发自定义函数?

时间:2013-11-25 16:30:36

标签: javascript jquery ajax

好的,我的数据管道工作正常,如果我将事件处理程序映射到输入单击触发器,它会通过Jquery / Ajax将数据发送到PHP处理文件,并将数据写入SQL数据库。

但是,我试图在窗口/页面关闭时触发Ajax发送的方法似乎都没有工作。我不想返回一个警告框,但是我在网上找到的所有示例似乎都只显示使用onbeforeunload,beforeunload和unload事件来显示警告框。他们还说你可以发起一个自定义事件,但我还没有找到这样一个事件的可靠例子。

我做错了什么?这是代码。除了最新的触发器之外,我所有尝试过的触发器都接近顶部注释,所以你们可以看到我已经尝试过的。

var formData;

$(document).ready(function() {

//$("#driver").click(function() {

//$('a[rel!=ext]').click(function() { window.onbeforeunload = null; });
//$('form').submit(function() { window.onbeforeunload = null; });

//window.onbeforeunload = function() {

//jQuery(window).bind("beforeunload",function() {

//$(window).unload(function() {

$(window).bind("beforeunload", function() {

    var date=new Date();
    var formData = $("#testform :input[id!='card-type'][id!='paymentSelection_0']"+
    "[id!='ccSelectedRadio'][id!='card-number'][id!='card-exp-month'][id!='card-exp-year'][id!='card-cvv'][id!='billing-first-name']"+
    "[id!='billing-last-name'][id!='billing-company'][id!='billing-address1'][id!='billing-address2'][id!='billing-city']"+
    "[id!='billing-state'][id!='billing-zip'][id!='billing-phone'][id!='billing-country'][id!='useShippingRadio'][id!='useBillingRadio']"+
    "[id!='ppSelectedRadio'][name!='miscDS.shopperEmailAddress_ymixval'][name!='miscDS.shopperEmailAddress_ymixlabel']"+
    "[name!='miscDS.shopperEmailAddress_secname'][name!='paymentSelectionDS.paymentSelection_ROW0_paymentPPSelected']").serializeArray();

    $.post("jquery/process.php",
        {
            mydata: formData,
            orderSubTotal: orderSubTotal,
            orderTotal: orderTotal,
            numOfItems: numOfItems,
            items: items,
            ids: ids,
            codes: codes,
            qtys: qtys,
            price: price,
            orderTax: orderTax,
            orderShipping: orderShipping,
            appliedPromoIdList: appliedPromoIdList,
            coupon: coupon,
            storeId: storeId,
            activeShipPromotionCount: activeShipPromotionCount,
            itemImages: itemImages,
            date: date
        }
    );
});
});

1 个答案:

答案 0 :(得分:4)

就附加事件而言,您在此处显示的任何附件方法都可以。问题不在于您的附件方法本身,而是您的函数执行异步任务,在情况发生变化之前需要“太长时间”才能完成。

当页面卸载时,任何挂起的AJAX请求都会被取消。由于默认情况下ajax请求是异步的,因此在浏览器取消之前,您的请求甚至无法连接到服务器。

对于此用例,唯一的路由是使用同步请求。但是,这可能会导致意外的影响:当您的请求处于待处理状态时,浏览器界面将显示并且表现得好像被“锁定”一样。

这就是警报工作的原因,因为它本质上是一种同步的“阻塞”情况。警报框有效地阻止整个浏览器UI等待输入。

另请参阅:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests