Обратные вызовы Javascript работают в Firefox, но не в Chrome или Safari. - PullRequest
0 голосов
/ 04 августа 2010

Я работаю с Ejabberd и Orbited, и у меня возникли некоторые проблемы с не вызываемыми функциями обратного вызова JavaScript. Ниже приведен мой файл JavaScript, в котором происходит соединение TCPSocket, и у меня есть две функции обратного вызова, а именно

onSocketConnect: который вызывается, когда Orbited установил соединение с портом 5222 сервера XMPP и

onLoginSuccess: который вызывается при успешном завершении функции xmpp_client.login

Проблема, с которой я сталкиваюсь, заключается в том, что соединение происходит успешно, но мои обратные вызовы вызываются только тогда, когда я использую FireFox, а не при использовании Safari или Chrome. Я совершенно не знаю, что является причиной этой проблемы, но я уверен, что метод xmpp_client.login действительно вызывается, потому что пользователь вошел в систему и отображается как онлайн в консоли администратора 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 %>

Это часть xmpp.js, которую я получил, когда установил на орбиту, и чтобы проверить, действительно ли мои запросы достигли, я добавил предупреждение в метод входа в систему следующим образом


...
...

    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
...
...

Теперь я понятия не имею, как это получило мои обратные вызовы, и буду очень признателен за помощь.

Спасибо

На самом деле я обнаружил, что удаление xmpp_client.set_presence и перемещение его в onLoginSuccess - это то, что, кажется, добилось цели. В ту минуту, когда я добавляю метод set_presence после вызова метода login, в chrome происходит сбой функциональности. Так почему же это препятствует вызову обратного вызова при успешном входе в систему?



    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');



    }


Помощь!

1 Ответ

1 голос
/ 05 августа 2010

Я думаю, что ваша проблема связана с той же политикой происхождения для Javascript

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

Я уверен, что веб-инспектор Safari / Chrome (с включенным Javascript) проверит это вконсоль javascript

Современные браузеры (т. е. не Internet Explorer!) решают эту проблему с помощью совместного использования ресурсов между источниками.Но тогда ваша клиентская библиотека Javascript XMPP должна также реализовать CORS

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

Я не знаком с Orbited, но я сделал этот тип подключений XMPP в браузере с использованием библиотеки Strophejs и ejabberdДиспетчер соединений XMPP BOSH

Чтобы обойти политику Same Origin во всех браузерах, необходимо использовать прокси

http://flxhr.flensed.com/ (прокси-библиотека на стороне клиента)

При использовании apache вы можете использовать прокси на стороне сервера с директивой ProxyPass в модуле mod_proxy

...