Znalazłem kogoś, kto osiąga to dzięki bardzo sprytnemu wykorzystaniu natywnego Imageobiektu.
Z ich źródła jest to główna funkcja (ma zależności od innych części źródła, ale masz pomysł).
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);
}
}
Działa to na wszystkich typach serwerów, które testowałem (serwery WWW, serwery ftp i serwery gier). Działa również z portami. Jeśli ktoś napotka przypadek użycia, który się nie powiedzie, napisz w komentarzach, a zaktualizuję moją odpowiedź.
Aktualizacja : poprzedni link został usunięty. Jeśli ktoś znajdzie lub zastosuje powyższe, proszę o komentarz, a ja dodam to do odpowiedzi.
Aktualizacja 2 : @trante było na tyle miłe, aby zapewnić jsFiddle.
http://jsfiddle.net/GSSCD/203/
Aktualizacja 3 : @Jonathon utworzył repozytorium GitHub z implementacją.
https://github.com/jdfreder/pingjs
Aktualizacja 4 : Wygląda na to, że ta implementacja nie jest już niezawodna. Ludzie zgłaszają również, że Chrome nie obsługuje już tego wszystkiego, wyrzucając net::ERR_NAME_NOT_RESOLVEDbłąd. Jeśli ktoś może zweryfikować alternatywne rozwiązanie, umieszczę je jako zaakceptowaną odpowiedź.
"/?cachebreaker="+new Date().getTime();na końcu img src, jeśli to konieczne.