2010-08-04 7 views
0

Je travaille avec Ejabberd et Orbited et j'ai quelques problèmes avec mes fonctions de rappel JavaScript qui ne sont pas appelées. Ce qui suit est mon fichier JavaScript où la connexion TCPSocket arrive et j'ai deux fonctions de rappel à savoirLes rappels Javascript fonctionnent dans Firefox mais pas dans Chrome ou Safari

onSocketConnect: qui est appelé lorsque le mis en orbite connexion établie avec le port 5222 du serveur XMPP et

onLoginSuccess: qui est appelé Le problème auquel je suis confronté est la connexion qui se passe avec succès, mais mes rappels ne sont appelés que lorsque j'utilise FireFox et non pas en utilisant Safari ou Google Chrome. Je suis totalement ignorant de ce qui cause ce problème mais je suis sûr que la méthode est appelée car l'utilisateur est connecté et est affiché en ligne dans la console d'administration ejabberd.

TCPSocket = Orbited.TCPSocket; 
Orbited.settings.port = 8000; 
Orbited.settings.hostname = 'localhost'; 

document.domain = document.domain; 

<script src='http://localhost:8000/static/protocols/xmpp/xmpp.js'></script> 

//xmpp.js file is included after this which is available with the Orbited. I have not included the code here. 

<% if current_user %> 
<script> 
    notifier = ' '; 
    user = "<%= current_user.jabber_id %>"; 
    alert(user); 
    password = '123456'; 
    domain = XMPPDOMAIN; 

/* function onLoginSuccess(){ 
     $('.status').html("Connected and Logged In"); 
     xmpp_client.set_presence('available'); 
    } */ 

    var onLoginSuccess = function(){ 
     $('.status').html("Connected and Logged In"); 

    } 
    function onLoginFailure(){ 
     alert('User could not be logged in'); 
    } 
    function connectSuccess(){ 
     $('.status').html("Connection Successful."); 
    } 

    function connectFailure(){ 
     $('.status').html("Connection Failed!"); 
    } 

    function onSetupNotification(){} 

    xmpp_client = new XMPPClient(); 
    xmpp_client.connect('localhost',5222); 

    xmpp_client.onPresence = function(ntype, from) { 
     alert('Presence message' + ntype + ' From :' + from) 

    } 

    xmpp_client.onSocketConnect = function(domain, connectSuccess, connectFailure){ 

     var domain = XMPPDOMAIN; 
     $('.status').html('Connected'); 
     alert(user); 
     if(domain) 
     { 
      xmpp_client.connectServer(domain, connectSuccess, connectFailure); 
      xmpp_client.login(user, password, onLoginSuccess, onLoginFailure); 
      xmpp_client.set_presence('available'); 

     } 

    } 

    function send_message(id, msg){ 

     var j_id = id + '@' + 'siddharth-ravichandrans-macbook-pro.local'; 
     alert('jid_id' + j_id); 
     var status = xmpp_client.msg(j_id, msg); 
     alert(status); 
    } 

    xmpp_client.onMessage = function(jid, username, text) { 
     alert('message-recieved'); 
     if ($('.discussion-area').length > 0){ 
      $('.discussion-area').append('<div class=\'new-message\'>' + text + '</div>'); 
      return false; 
     } 
    } 

/*  self.login = function(nick, pass, s, f) { 
    conn.onread = setUser; 
    success = s; 
    failure = f; 
    user = nick; 
    bare_jid = nick + "@" + domain; 
    full_jid = bare_jid + "/Orbited"; 
    self.send(construct(LOGIN, [user, pass])); 
    } 

    self.set_presence = function(status, status_msg) { 
    self.send(EXT_PRESENCE[0] + full_jid + EXT_PRESENCE[1] + room_jid + EXT_PRESENCE[3] + status + EXT_PRESENCE[4] + status_msg + EXT_PRESENCE[5]); 
    } 
*/ 
</script> 
<% end %> 

Cela fait partie des xmpp.js que je glissai quand je l'ai installé et mis en orbite afin de tester si mes demandes ont été effectivement fournis j'ai ajouté une alerte dans la méthode de connexion comme suit


... 
... 

    self.login = function(nick, pass, s, f) { 
     conn.onread = setUser; 
     success = s; 
     failure = f; 
     user = nick; 
     bare_jid = nick + "@" + domain; 
     full_jid = bare_jid + "/Orbited"; 
     self.send(construct(LOGIN, [user, pass])); 
     alert("bazingaa"); 
    } 

    self.connectServer = function(d, s, f) { 
     success = s; 
     failure = f; 
     doma 
... 
... 

Maintenant, je n'ai aucune idée de comment cela a obtenu mes rappels et j'apprécierais vraiment de l'aide à ce sujet.

Merci

En fait, je trouve que la suppression du xmpp_client.set_presence et en le déplaçant à l'onLoginSuccess est ce qui semble avoir fait le tour. La minute où j'ajoute la méthode set_presence après la méthode de connexion appelle la fonctionnalité échoue dans chrome. Alors pourquoi cela l'empêcherait-il d'invoquer le rappel en cas de connexion réussie?



    var onLoginSuccess = function(){ 
     $('.status').html("Connected and Logged In"); 
     xmpp_client.set_presence('available'); 
    } 

    xmpp_client.onSocketConnect = function(domain, connectSuccess, connectFailure){ 

     var d = ""; 
     $('.status').html('Connected'); 

      xmpp_client.connectServer(d, connectSuccess, connectFailure); 
      xmpp_client.login(user, password, onLoginSuccess, onLoginFailure); 
      //xmpp_client.set_presence('available'); 



    } 


Aide!

+1

"Je suis sûr que la méthode' xmpp_client.login' est appelée "- Êtes-vous sûr qu'elle est appelée?Avez-vous mis un point d'arrêt dedans? Et quelle est l'utilisation de 'document.domain = document.domain;'? –

+0

Le document.domain = document.domain entre en jeu uniquement lorsque je l'exécute en production en tant que sous-domaine. Ici, ça ne fait pas grand-chose. Oui J'avais des messages d'alerte configurés qui ne sont appelés que dans Firefox. De plus, lors de la connexion, l'utilisateur apparaît dans ma console d'administration Web ejabberd, donc je sais qu'il a été appelé. – Sid

+1

Dans Chrome, l'utilisateur se connecte-t-il, selon la console d'administration, mais «xmpp_client.login» n'est pas appelé? Est-ce exact? Cela ressemble à un problème dans xmpp.js. –

Répondre

1

Je pense que votre problème est lié à la politique même d'origine pour Javascript

https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

Je suis sûr que l'inspecteur Web Safari/Chrome (avec Javascript activé) va vérifier dans la console javascript

Les navigateurs modernes (c'est-à-dire pas Internet Explorer!) Contourner ce problème en mettant en œuvre le partage de ressources d'origine croisée. Mais votre bibliothèque client Javascript XMPP doit mettre en œuvre CORS trop

http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/

Je ne suis pas au courant mis en orbite, mais je l'ai fait ce type de navigateur connexions XMPP à l'aide de la bibliothèque Strophejs et XMPP gestionnaire de connexion BOSH de ejabberd

pour contourner la politique d'origine même dans tous les navigateurs, vous devez utiliser un proxy

http://flxhr.flensed.com/ (bibliothèque proxy côté client)

Si vous utilisez apache, vous pouvez utiliser un proxy côté serveur avec la directive ProxyPass sous le module mod_proxy

+0

Cela semble génial. Ce que je ne comprends pas, c'est que toutes mes demandes arrivent du même hôte, du même port et du même protocole, alors pourquoi pensez-vous que cela pourrait être le problème? Le proxy côté client que vous avez suggéré utilise flash et c'est l'une des choses que je voulais éviter quand j'ai opté pour Orbited et Ejabberd. – Sid

+0

Je n'avais aucune idée à ce sujet et merci pour les URL. – Sid

Questions connexes