我有一个关于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?根本原因是什么?我错过了什么?
最佳答案
试试这个:
addHandler(context.onMessage,'message','chat')//or 'normal'
使用JavaScript和jQuery Book进行Wrox Professional XMPP编程:
addHandler()函数接受一个或多个参数.第一个参数是函数
收到匹配节时调用.其余参数是匹配标准.满满的
这些参数的列表显示在Strophe源代码的缩写函数定义中:
addHandler: function (handler,ns,name,type,id,from) {
// implementation omitted
}
如果任何条件为null或未定义,则任何节都将匹配.否则,节只会匹配
如果他们在节的特定部分通过字符串相等满足标准.最后四个标准 –
name,id和from – 在节的元素名称和类型,id和from上指定过滤器
属性.这四个标准仅在顶级元素上检查,而不是在任何元素上检查
后人.第一个标准ns略有不同,并检查顶级元素为
以及它的直系孩子.你很快就明白了.
名称标准几乎总是为空,以匹配任何节,或消息,存在,
或者iq. addHandler()示例设置了一个可以为任何节调用的处理程序
接收.
type,id和from标准匹配,和的主要属性
节.您可以使用类型来区分常规聊天消息和群聊消息
或者将IQ结果节与IQ错误节分开. id标准通常用于处理
回复特定请求,例如与特定IQ-get请求关联的IQ结果.