我有一个关于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?根本原因是什么?我错过了什么?
发布于 2012-11-05 18:19:18
试试这个:
addHandler(context.onMessage, null, 'message', 'chat')//or 'normal'来自Wrox Professional XMPP Programming with JavaScript和jQuery的书籍:
addHandler()函数接受一个或多个参数。第一个参数是在接收到匹配的节时调用的函数。其余的参数是匹配条件。
这些参数的完整列表显示在Strophe源代码中的这个简短的函数定义中:
addHandler: function (handler, ns, name, type, id, from) {
// implementation omitted
}如果任何条件为空或未定义,则任何节都将匹配。否则,只有当节的特定部分中的字符串相等满足条件时,节才会匹配。
最后四个条件- name、type、id和from -指定节的元素名称和type、id和from属性的过滤器。这四个条件只在顶级元素上检查,而不是在元素的任何后代上检查。第一个条件ns略有不同,它检查顶级元素及其直接子元素。你很快就会明白为什么。名称条件几乎总是为空,以匹配任何节,或者message、presence或iq中的一个。addHandler()示例设置了一个处理程序,接收到的任何节都将调用该处理程序。
type、id和from条件与和节的主要属性相匹配。
您可以使用type来区分常规聊天消息和群聊消息,或者区分IQ-result节和IQ-error节。id标准通常用于处理对特定请求的回复,例如与特定IQ-get请求相关联的IQ-result。
https://stackoverflow.com/questions/13154102
复制相似问题