5

我对 Strophe.Connection.addHandler 和 Strophe.Connection.sendIQ 有疑问。下面的代码可以工作:

Strophe.Connection.addHandler(context.onMessage, null, 'message')

onMessage = function (msgXML){
    var to = msgXML.getAttribute('to');
    var from = msgXML.getAttribute('from');
    var fromBareJid = Strophe.getBareJidFromJid(from);
    var type = msgXML.getAttribute('type');
    var elems = msgXML.getElementsByTagName('body');
    var body = elems[0]
    var text = Strophe.getText(body);
    return true;
}

但是如果我在调用addHandler之后调用setContactData,onMessage方法永远不会被回调,但是onRoster方法可以在sendIQ之后调用。

setContactData = function(){
    var iq = $iq({
        type: 'get'
    }).c('query', {
        xmlns: 'jabber:iq:roster'
    });
    Strophe.Connection.sendIQ(iq, context.onRoster);
}

onRoster = function(iq){
    $(iq).find('item').each(function(){
        var jid = $(this).attr('jid');     
        // transform jid into an id
        var jid_id = CommonUtil.getNameFromJid(jid);
        userList = userList + "','" + jid_id;
    });

为什么不能回调onMessage?根本原因是什么?我错过了什么?

4

1 回答 1

4

试试这个:

addHandler(context.onMessage, null, 'message', 'chat')//or 'normal'


来自 Wrox Professional XMPP Programming with JavaScript and jQuery Book:
addHandler() 函数采用一个或多个参数。第一个参数是接收到匹配节时调用的函数。其余参数是匹配标准。
这些参数的完整列表显示在 Strophe 源代码的这个缩写函数定义中:

addHandler: function (handler, ns, name, type, id, from) {
// implementation omitted
}

如果任何条件为空或未定义,则任何节都将匹配。否则,仅当节的特定部分中的字符串相等性满足条件时,节才会匹配。
最后四个条件——名称、类型、id 和 from——指定节的元素名称和类型、id 和 from 属性的过滤器。这四个条件仅在顶级元素上检查,而不是在任何元素的后代上检查。第一个标准 ns 稍有不同,它会检查顶级元素及其直接子元素。你很快就会明白为什么。名称标准几乎总是为空,以匹配任何节,或消息、存在或 iq 之一。addHandler() 示例设置了一个处理程序,它将为接收到的任何节调用。
类型、id 和 from 标准与 和 节的主要属性相匹配。
您可以使用 type 来区分常规聊天消息和群聊消息,或者将 IQ 结果节与 IQ 错误节分开。id 标准通常用于处理对特定请求的回复,例如与特定 IQ-get 请求关联的 IQ-结果。

于 2012-11-05T10:19:17.780 回答