如何检测慢速互联网连接?

时间:2011-08-09 09:31:47

标签: javascript

目前,大多数热门网站,如google,yahoo检测用户连接速度是否较慢,然后选择加载网站的基本版本而不是高端版本。

有哪些方法可用于检测慢速互联网连接?

<子> P.S。我认为这是通过javascript实现的,所以我会将其标记为javascript问题?但是,我正在寻找更多针对PHP的答案,如果这也与服务器相关。

4 个答案:

答案 0 :(得分:67)

您可以在<head>中的内联脚本块中start a timeout,它会在遇到后立即运行。然后,当load事件触发时,您将cancel the timeout。如果超时发生,则页面加载缓慢。例如:

<script type="text/javascript">
    var slowLoad = window.setTimeout( function() {
        alert( "the page is taking its sweet time loading" );
    }, 10 );

    window.addEventListener( 'load', function() {
        window.clearTimeout( slowLoad );
    }, false );
</script>

显然,您希望将警报替换为更有用的警报。另请注意,该示例使用W3C / Netscape事件API,因此在版本9之前无法在Internet Explorer中使用。

答案 1 :(得分:9)

这是我刚刚为我正在开发的网站完成的完整实施。感觉像分享它。它使用cookie来消除消息(对于那些不介意该站点需要很长时间才能加载的人。)如果页面加载时间超过1秒,则会显示该消息。最好将此更改为大约5秒左右。

下面的代码应该在打开<head>标记之后添加,因为它必须尽快加载,但它不能出现在html或head标记之前,因为这些标记需要是脚本运行时出现在DOM中。它是所有内联代码,因此脚本和样式在任何其他外部文件(css,js或图像)之前加载。

<style>
    html { position: relative; }
    #slow-notice { width:300px; position: absolute; top:0; left:50%; margin-left: -160px; background-color: #F0DE7D; text-align: center; z-index: 100; padding: 10px; font-family: sans-serif; font-size: 12px; }
    #slow-notice a, #slow-notice .dismiss { color: #000; text-decoration: underline; cursor:pointer; }
    #slow-notice .dismiss-container { text-align:right; padding-top:10px; font-size: 10px;}
</style>
<script>

    function setCookie(cname,cvalue,exdays) {
        var d = new Date();
        d.setTime(d.getTime()+(exdays*24*60*60*1000));
        var expires = "expires="+d.toGMTString();
        document.cookie = cname + "=" + cvalue + ";path=/;" + expires;
    }

    function getCookie(cname) {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for(var i=0; i<ca.length; i++) {
            var c = ca[i].trim();
            if (c.indexOf(name)==0) return c.substring(name.length,c.length);
        }
        return "";
    } 

    if (getCookie('dismissed') != '1') {
        var html_node = document.getElementsByTagName('html')[0];
        var div = document.createElement('div');
        div.setAttribute('id', 'slow-notice');

        var slowLoad = window.setTimeout( function() {
            var t1 = document.createTextNode("The website is taking a long time to load.");
            var br = document.createElement('br');
            var t2 = document.createTextNode("You can switch to the ");
            var a = document.createElement('a');
            a.setAttribute('href', 'http://light-version.mysite.com');
            a.innerHTML = 'Light Weight Site';

            var dismiss = document.createElement('span');
            dismiss.innerHTML = '[x] dismiss';
            dismiss.setAttribute('class', 'dismiss');
            dismiss.onclick = function() {
                setCookie('dismissed', '1', 1);
                html_node.removeChild(div);
            }

            var dismiss_container = document.createElement('div');
            dismiss_container.appendChild(dismiss);
            dismiss_container.setAttribute('class', 'dismiss-container');

            div.appendChild(t1);
            div.appendChild(br);
            div.appendChild(t2);
            div.appendChild(a);
            div.appendChild(dismiss_container);

            html_node.appendChild(div);


        }, 1000 );

        window.addEventListener( 'load', function() {
            try {
                window.clearTimeout( slowLoad );
                html_node.removeChild(div);
            } catch (e){
                // that's okay.
            }

        });
    }

</script>

结果应如下所示:

enter image description here

希望它有所帮助。

答案 2 :(得分:4)

您可以收听两个DOM事件DOMContentLoadedload,并计算调度这两个事件的时间之间的差异。

在DOM结构准备就绪时调度

DOMContentLoaded,但外部资源,图像,CSS等可能不是。

一切就绪后,

load被派遣。

http://ablogaboutcode.com/2011/06/14/how-javascript-loading-works-domcontentloaded-and-onload/

答案 3 :(得分:1)

您可以通过下载一些测试资源(图像更合适)来获得连接速度,这些测试资源的大小是您已知的(很容易获得)并且可以测量下载它所需的时间。请记住,一次测试只会为您提供当时的连接速度。如果用户使用与图像测试平行的带宽,结果可能会不时变化。这会为您的应用带来可用带宽,这正是我们所需要的。

我在某地阅读Google使用一些1x1网格像素图像来测试页面加载时的连接速度,它甚至会显示“连接似乎很慢,尝试HTML版本”等等。

以下是描述相同技术的另一个链接 - http://www.ehow.com/how_5804819_detect-connection-speed-javascript.html