Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中检测互联网速度?_Javascript_Download Speed - Fatal编程技术网

如何在JavaScript中检测互联网速度?

如何在JavaScript中检测互联网速度?,javascript,download-speed,Javascript,Download Speed,如何创建一个JavaScript页面来检测用户的网速并在页面上显示?类似于“您的internet速度是???/?Kb/s”。正如我在中概述的,您可以通过定时下载各种大小的文件(开始时很小,如果连接允许的话,则增加速度),确保通过缓存头,这样文件才是真正从远程服务器读取的,而不是从缓存中检索的。这并不一定要求您拥有自己的服务器(文件可能来自或类似),但您需要从某个地方获取文件以测试连接速度 也就是说,时间点带宽测试是出了名的不可靠,因为它们会受到其他窗口中下载的其他项目、服务器速度、途中链接等的影

如何创建一个JavaScript页面来检测用户的网速并在页面上显示?类似于“您的internet速度是???/?Kb/s”。

正如我在中概述的,您可以通过定时下载各种大小的文件(开始时很小,如果连接允许的话,则增加速度),确保通过缓存头,这样文件才是真正从远程服务器读取的,而不是从缓存中检索的。这并不一定要求您拥有自己的服务器(文件可能来自或类似),但您需要从某个地方获取文件以测试连接速度


也就是说,时间点带宽测试是出了名的不可靠,因为它们会受到其他窗口中下载的其他项目、服务器速度、途中链接等的影响。但使用这种技术,您可以大致了解情况。

在某种程度上,这是可能的,但不会真正准确,想法是加载具有已知文件大小的图像,然后在其
onload
事件中测量触发该事件之前经过的时间,并将该时间除以图像文件大小

可在此处找到示例:

应用此处建议的修复程序的测试用例:

//仅举一个例子,请使用您自己的图片!
var imageAddr=”http://www.kenrockwell.com/contax/images/g2/examples/31120037-5mb.jpg"; 
var downloadSize=4995374//字节
函数ShowProgressMessage(msg){
if(控制台){
如果(消息类型==“字符串”){
控制台日志(msg);
}否则{
对于(变量i=0;i);
oProgress.innerHTML=actualHTML;
}
}
函数InitiateSpeedDetection(){
ShowProgressMessage(“正在加载图像,请稍候…”);
setTimeout(MeasureConnectionSpeed,1);
};    
if(window.addEventListener){
window.addEventListener('load',InitiateSpeedDetection,false);
}else if(窗口附件){
window.attachEvent('onload',启动种子检测);
}
函数MeasureConnectionSpeed(){
var startTime,endTime;
var download=newimage();
download.onload=函数(){
endTime=(新日期()).getTime();
showResults();
}
download.onerror=函数(err,msg){
ShowProgressMessage(“无效图像或下载错误”);
}
startTime=(新日期()).getTime();
var cacheBuster=“?nnn=“+startTime;
download.src=imageAddr+cacheBuster;
函数showResults(){
风险值持续时间=(结束时间-开始时间)/1000;
var bitsLoaded=下载大小*8;
var speedBps=(比特数/持续时间).toFixed(2);
var speedKbps=(speedBps/1024).toFixed(2);
var speedMbps=(speedKbps/1024).toFixed(2);
ShowProgressMessage([
“您的连接速度是:”,
速度bps+“bps”,
speedKbps+“kbps”,
speedMbps+“Mbps”
]);
}
}

JavaScript被关闭,或者你的浏览器真的很慢
我需要一种快速的方法来确定用户连接速度是否足够快,以启用/禁用我正在使用的站点中的某些功能,我制作了这个小脚本,平均下载单个(小)图像所需的时间数次,在我的测试中,它工作得相当准确,能够清楚地区分3G和Wi-Fi,例如,也许有人可以制作一个更优雅的版本,甚至是一个jQuery插件

var arrTimes=[];
变量i=0;//开始
var-timesToTest=5;
var tThreshold=150//太太
var testImage=”http://www.google.com/images/phd/px.gif"; // 服务器中的小映像
var dummyImage=新图像();
var isConnectedFast=false;
testLatency(函数平均值){

isConnectedFast=(avg最好使用图像来测试速度

var fileURL = "your/url/here/testfile.zip";

var request = new XMLHttpRequest();
var avoidCache = "?avoidcache=" + (new Date()).getTime();;
request.open('GET', fileURL + avoidCache, true);
request.responseType = "application/zip";
var startTime = (new Date()).getTime();
var endTime = startTime;
request.onreadystatechange = function () {
    if (request.readyState == 2)
    {
        //ready state 2 is when the request is sent
        startTime = (new Date().getTime());
    }
    if (request.readyState == 4)
    {
        endTime = (new Date()).getTime();
        var downloadSize = request.responseText.length;
        var time = (endTime - startTime) / 1000;
        var sizeInBits = downloadSize * 8;
        var speed = ((sizeInBits / time) / (1024 * 1024)).toFixed(2);
        console.log(downloadSize, time, speed);
    }
}

request.send();

对于小于10MB的文件,这将不能很好地工作。您必须在多次下载尝试中运行聚合结果。

我需要类似的东西,所以我写了。这是对的重写

这个想法是通过Ajax进行两个调用,一个用于下载,另一个用于通过POST上传


它应该同时适用于
jQuery.ajax
或Angular
$http

图像技巧很酷,但在我的测试中,它是在我想要完成的一些ajax调用之前加载的

2017年的正确解决方案是使用工人()

工人将看起来像:

/**
 * This function performs a synchronous request
 * and returns an object contain informations about the download
 * time and size
 */
function measure(filename) {
  var xhr = new XMLHttpRequest();
  var measure = {};
  xhr.open("GET", filename + '?' + (new Date()).getTime(), false);
  measure.start = (new Date()).getTime();
  xhr.send(null);
  measure.end = (new Date()).getTime();
  measure.len = parseInt(xhr.getResponseHeader('Content-Length') || 0);
  measure.delta = measure.end - measure.start;
  return measure;
}

/**
 * Requires that we pass a base url to the worker
 * The worker will measure the download time needed to get
 * a ~0KB and a 100KB.
 * It will return a string that serializes this informations as
 * pipe separated values
 */
onmessage = function(e) {
  measure0 = measure(e.data.base_url + '/test/0.bz2');
  measure100 = measure(e.data.base_url + '/test/100K.bz2');
  postMessage(
    measure0.delta + '|' +
    measure0.len + '|' +
    measure100.delta + '|' +
    measure100.len
  );
};
将调用工作程序的js文件:

var base_url = PORTAL_URL + '/++plone++experimental.bwtools';
if (typeof(Worker) === 'undefined') {
  return; // unsupported
}
w = new Worker(base_url + "/scripts/worker.js");
w.postMessage({
  base_url: base_url
});
w.onmessage = function(event) {
  if (event.data) {
    set_cookie(event.data);
  }
};
代码取自我编写的Plone软件包:


好的,现在是2017年,因此您现在有了网络信息API(尽管目前跨浏览器的支持有限),可以获得某种估计值下行链路速度信息:

navigator.connection.downlink
这是以Mbits/sec为单位的有效带宽估计值。浏览器根据最近观察到的跨最近活动连接的应用层吞吐量进行估计。不用说,这种方法的最大优点是,您不需要下载任何内容来计算带宽/速度

您可以查看此属性和其他几个相关属性


由于它的支持有限,且不同浏览器的实现方式也不同(截至2017年11月),因此强烈建议您仔细阅读,感谢Punit的回答,为了检测动态连接速度变化,您可以使用以下代码:

navigator.connection.onchange=函数(){
//在变速事件中,做您需要做的事情
console.log(“连接速度改变”);
}

尽管这是一个老生常谈的问题,但我还是想与大家分享我在2020年提出的解决方案

它与th一起提供
var speedtest = {};
function speedTest_start(name) { speedtest[name]= +new Date(); }
function speedTest_stop(name) { return +new Date() - speedtest[name] + (delete 
speedtest[name]?0:0); }
speedTest_start("test1");

// ... some code

speedTest_stop("test1");
// returns the time duration in ms
speedTest_start("whole");

// ... some code

speedTest_start("part");

// ... some code

speedTest_stop("part");
// returns the time duration in ms of "part"

// ... some code

speedTest_stop("whole");
// returns the time duration in ms of "whole"