Ответ 1
Здесь реализована реализация этого с использованием XMLHttpRequest
, расширяющегося по идее @Yiğit Yener.
Скорость загрузки зависит от двух факторов: скорости подключения пользователя и скорости подключения к серверу. Я сделал предположение, что вы хотите проверить скорость между пользователем и вашим сервером. И с XMLHttpRequest
, это действительно единственный вариант из-за политики одного и того же происхождения.
С скоростью загрузки вам не нужно ничего возвращать. Вам просто нужно POST
большой фрагмент данных на любую страницу вашего сервера. Самая легкая страница, на которую нужно попасть, - это та, на которой вы уже находитесь. Для этого вы можете полностью оставить часть домена в URL-адресе .open()
. POST
данные ограничены на некоторых серверах до двух мегабайт, поэтому я использовал их для обеспечения безопасности. Одного достаточно, чтобы получить достойное чтение.
Чтобы предотвратить кэширование URL-адреса, я добавляю случайное число до конца.
url = '?cache=' + Math.floor( Math.random() * 10000 )
Чтобы предотвратить передачу данных POST
, я использую случайные данные. Функция позволяет передавать количество итераций, которые вы хотите проверить. Итерации разнесены каждые пять секунд. Обратный вызов update
вызывается каждой итерацией со скоростью этой проверки и скользящим средним всех проверок. Используйте столько итераций, сколько хотите получить желаемую точность. Если вам просто нужна приблизительная оценка, достаточно одной итерации.
Он называется так:
checkUploadSpeed( 10, function ( speed, average ) {
} );
Demos
Здесь вы можете попробовать этот код.
Частный сервер
Вы можете попробовать это на собственный сервер ThinkingStiff, который, вероятно, является самым быстрым из всех.
Фрагмент стека
function checkUploadSpeed( iterations, update ) {
var average = 0,
index = 0,
timer = window.setInterval( check, 5000 ); //check every 5 seconds
check();
function check() {
var xhr = new XMLHttpRequest(),
url = '?cache=' + Math.floor( Math.random() * 10000 ), //random number prevents url caching
data = getRandomString( 1 ), //1 meg POST size handled by all servers
startTime,
speed = 0;
xhr.onreadystatechange = function ( event ) {
if( xhr.readyState == 4 ) {
speed = Math.round( 1024 / ( ( new Date() - startTime ) / 1000 ) );
average == 0
? average = speed
: average = Math.round( ( average + speed ) / 2 );
update( speed, average );
index++;
if( index == iterations ) {
window.clearInterval( timer );
};
};
};
xhr.open( 'POST', url, true );
startTime = new Date();
xhr.send( data );
};
function getRandomString( sizeInMb ) {
var chars = "A[email protected]#$%^&*()_+`-=[]\{}|;':,./<>?", //random data prevents gzip effect
iterations = sizeInMb * 1024 * 1024, //get byte count
result = '';
for( var index = 0; index < iterations; index++ ) {
result += chars.charAt( Math.floor( Math.random() * chars.length ) );
};
return result;
};
};
checkUploadSpeed( 10, function ( speed, average ) {
document.getElementById( 'speed' ).textContent = 'speed: ' + speed + 'kbs';
document.getElementById( 'average' ).textContent = 'average: ' + average + 'kbs';
} );
<div id="speed">speed: 0kbs</div>
<div id="average">average: 0kbs</div>