2009-03-31 10 views
4

Comment puis-je utiliser jQuery pour exécuter en permanence un script PHP et obtenir la réponse chaque seconde et aussi pour envoyer de petits bits de données sur la souris vers le même script?jQuery ping en permanence pour Ajax responce

Est-ce que je dois vraiment ajouter une extension aléatoire juste pour obtenir une minuterie aussi simple?

+0

Obtenir la réponse toujours seconde est un peu excessif ... pouvez-vous changer cela à 15 secondes au moins? – alex

Répondre

0

Vous n'avez pas besoin d'ajouter une extension aléatoire. Il existe des fonctions javascript natives setInterval and setTimeout pour effectuer des tâches sur des intervalles définis. Vous voulez sans doute faire quelque chose comme

function ajaxPing() { 
    ... 
} 

setInterval("ajaxPing()", 1000); 

$(element).mousedown(ajaxPing); 

D'autre part, si vous voulez vraiment faire le pinger chaque seconde, il serait probablement suffisant pour simplement stocker vos données dans les variables sur mousedown et de le soumettre sur ping suivant (cela arrivera en moins d'une seconde).

0

Vous pouvez mettre le code pour interroger le serveur dans une fonction, faire quelque chose comme ceci:

setInterval('ping()',1000); //this will ping 1000 milliseconds or 1 second 
1
function doAjax(data){ 
    $.ajax({ 
    type: "POST", 
    data: data, 
    url: 'http://example.com/yourscript.php', 
    }); 
} 
// Set interval 
setInterval('doAjax()',1000); 
// Set event handler 
$(document).mousedown(function(){ 
    doAjax({key: 'value'}); 
}); 

Vous pouvez remplacer $ (document) avec un élément réel si vous ne voulez pas pour capturer des clics sur toute la page.

Vous pouvez faire beaucoup plus avec la fonction ajax si vous cherchez callbacks etc: http://docs.jquery.com/Ajax/jQuery.ajax

24

à itérer est humaine, récursivité divine.
-L. Peter Deutsch

var req = function() { 
    $.ajax({ 
     url : 'http://example.com/yourscript.php', 
     complete : function() { 
      req(); 
     } 
    }); 
}; 
req(); 

Dans le cas où il est pas évident, ce qui précède une nouvelle demande dès que la précédente est terminée, pour toujours. Vous pouvez également définir un délai de 1 seconde entre les requêtes comme suit:

var req = function() { 
    $.ajax({ 
     url : 'http://example.com/yourscript.php', 
     complete : function() { 
      setTimeout(function() { 
       req(); 
      }, 1000); 
     } 
    }); 
}; 
req(); 
+0

Cela se produira plusieurs fois par seconde et fera baisser le serveur avec sa charge –

+0

Je présume que vous avez downvoted avant d'ajouter la 2ème version. L'idée de base est d'utiliser un rappel plutôt que de simplement interroger une fois par seconde. –

+2

Et, de toute façon, il ne fera pas beaucoup de demandes par seconde. Il fera 1 demande à la fois. Une fois la requête terminée, faites la demande suivante. Alors, peut-être que vous devriez annuler votre downvote? –

1

// Toutes les pings dont vous avez besoin:

ping.pushCallback(function() { YourCallback(); }); 
$.data(document.body, 'data_ping', ping); 

// -------------- ---------------------------------------- // Script

$.ping = function(url, options) { 
    this.url = url; 
    this.options = $.extend({ 
     delay: 2000, 
     dataType: 'json', 
     timeout: 10000, 
     data: {}, 
     callbacks: [] 
    }, options); 
    this.queue(); 
}; 
$.ping.prototype = { 
    queue: function() { var self = this; 
     setTimeout(function() { 
      self.send(); 
     }, self.options.delay); 
    }, 
    send: function() { var self = this; 
     $.ajax(self.url, { 
      success: function(data) { 
       for (var i in self.options.callbacks) { 
        self.options.callbacks[i](data); 
       } 
      }, 
      complete: function() { 
       self.queue(); 
      }, 
      dataType: self.options.dataType, 
      data: self.options.data, 
      type: "GET", 
      cache: false, 
      timeout: self.options.timeout 
     }); 
    }, 
    setData: function(key, value) { 
     this.options.data[key] = value; 
    }, 
    pushCallback: function(callback) { 
     this.options.callbacks.push(callback); 
    } 
};