J'ai trouvé quelqu'un qui accomplit cela avec une utilisation très intelligente de l' Imageobjet natif .
De leur source, c'est la fonction principale (elle a des dépendances sur d'autres parties de la source mais vous voyez l'idée).
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);
}
}
Cela fonctionne sur tous les types de serveurs que j'ai testés (serveurs Web, serveurs ftp et serveurs de jeux). Cela fonctionne également avec les ports. Si quelqu'un rencontre un cas d'utilisation qui échoue, veuillez poster dans les commentaires et je mettrai à jour ma réponse.
Mise à jour : le lien précédent a été supprimé. Si quelqu'un trouve ou met en œuvre ce qui précède, veuillez commenter et je l'ajouterai dans la réponse.
Mise à jour 2 : @trante était assez gentil pour fournir un jsFiddle.
http://jsfiddle.net/GSSCD/203/
Mise à jour 3 : @Jonathon a créé un dépôt GitHub avec l'implémentation.
https://github.com/jdfreder/pingjs
Mise à jour 4 : il semble que cette implémentation n'est plus fiable. Les gens signalent également que Chrome ne prend plus en charge tout cela, ce qui génère une net::ERR_NAME_NOT_RESOLVEDerreur. Si quelqu'un peut vérifier une autre solution, je la placerai comme réponse acceptée.
"/?cachebreaker="+new Date().getTime();à la fin de l'img src si nécessaire.