Я знайшов когось, хто це досягає дуже розумним використанням рідного Imageоб'єкта.
Від їх джерела це основна функція (вона має залежність від інших частин джерела, але ви отримуєте ідею).
function Pinger_ping(ip, callback) {
if(!this.inUse) {
this.inUse = true;
this.callback = callback
this.ip = ip;
var _that = this;
this.img = new Image();
this.img.onload = function() {_that.good();};
this.img.onerror = function() {_that.good();};
this.start = new Date().getTime();
this.img.src = "http://" + ip;
this.timer = setTimeout(function() { _that.bad();}, 1500);
}
}
Це працює на всіх тестованих серверах (веб-серверах, ftp-серверах та ігрових серверах). Він також працює з портами. Якщо хтось стикається з випадком використання, який не вдається, будь ласка, опублікуйте в коментарях, і я оновлю свою відповідь.
Оновлення : попереднє посилання видалено. Якщо хтось знайде або реалізує вищесказане, будь ласка, прокоментуйте його, і я додаю його у відповідь.
Оновлення 2 : @trante було досить приємним, щоб надати jsFiddle.
http://jsfiddle.net/GSSCD/203/
Оновлення 3 : @Jonathon створив репортаж GitHub з реалізацією.
https://github.com/jdfreder/pingjs
Оновлення 4 : Схоже, ця реалізація вже не є надійною. Люди також повідомляють, що Chrome більше не підтримує все, видаючи net::ERR_NAME_NOT_RESOLVEDпомилку. Якщо хтось може перевірити альтернативне рішення, я поставлю це як прийняту відповідь.
"/?cachebreaker="+new Date().getTime();якщо необхідно, додавши a до кінця img src.