jquery-ajax-async之浏览器差异

最近的PC项目遇到了一个问题,日志记录程序会在1s内多次发起对首页的请求,一时间没有找到原因。
简单描述一下问题:访问一个首页的时候,由于代码质量不高的原因,访问就连接数据库,但是同时存在的问题是一秒了多次发起了对首页的请求,请求中包含/favicon.ico(如此能不能判断是浏览器发起的呢?),也就导致了数据库出现很多连接,到此引起的连锁反应就是服务器内存占用飙升,接着就是卡卡卡……
由于能力不足的原因,一时间排查不出问题的原因,找不到很好的解决方案,找到了一个临时的方案“生成静态首页”。不过后期查看日志,在index.html存在的情况下,还是会出现请求404的问题(无解)。
生成静态首页也很愉快,于是很快就把补丁给打上去了,相反也就遇到了今天的问题,在此予以记录。
愉快的模拟了一个场景:

html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jquery-ajax-async</title>
</head>
<body>
    <button id="testAsync">测试</button>
    <script src="script.js"></script>
    <script>
    $("#testAsync").bind("click", function() {
        $.ajax({
            url:"http://demo.pushself.com/index.php",
            success:function(d){
                if(d.result=="OK"){
                    alert("生成成功!");
                }
            },
            //async:false,
            dataType:"json"
        }); 
        console.log(this);
    });
    </script>
</body>
</html>

php代码

<?php
    sleep(3);
    echo json_encode(array('result'=>'OK'));
?>

在注释async: false 的时候,async的默认值是true,连续点击3次测试

IE:连续输出3次<button id="testAsync">测试</button>,3秒后连续弹出3次生成成功
非IE:连续输出3次<button id="testAsync">测试</button>,3秒后依次弹出3次生成成功

如图:jquery-ajax-async-true

在取消注释async: false 后,连续点击3次测试

IE:3秒后弹出1次生成成功,输出1次<button id="testAsync">测试</button>
非IE:3秒后依次弹出3次生成成功,输出3次<button id="testAsync">测试</button>,而且会提示:Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.

如图:jquery-ajax-async-false
如图:jquery-ajax-async-false-end

看到上面的结果,暂且不说alert的事情。异步情况下,IE与非IE浏览器处理的方式是一样的。同步的时候,IE是单线程的,非IE却不是单线程处理。非IE会出现提示ajax同步请求在主线程中不利于用户体验,被弃用了,可见用户体验的重要性。
最后还是需要换取另外的方式来阻止用户多次点击:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jquery-ajax-async</title>
</head>
<body>
    <button id="testAsync">测试</button>
    <script src="script.js"></script>
    <script>
    var testAsyncEle = $("#testAsync"),
        createIndex = function() {
            testAsyncEle.unbind();
            $.ajax({
                url:"http://demo.pushself.com/index.php",
                success:function(d){
                    if(d.result=="OK"){
                        alert("生成成功!");
                        testAsyncEle.bind("click", createIndex);
                    }
                },
                //async:false,
                dataType:"json"
            }); 
            console.log(this);
        };
    testAsyncEle.bind("click", createIndex);
    </script>
</body>
</html>

转载于:https://www.cnblogs.com/unofficial/p/4417263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值