2017-04-21 68 views
1

我想發送智商節要求用戶的名冊使用strophe庫。 Strophe爲此提供了一個功能,稱爲sendIQ試圖發送與Strophe XMPP智商節

我試圖發送IQ節這樣的:

let iq_str = "<iq type='get' id='roster1'><query xmlns='jabber:iq:roster'/></iq>"; 
let parser = new DOMParser(); 
let iq = parser.parseFromString(iq_str, "text/xml"); 
XMPP.conn.sendIQ(iq, onRoster); 

然而,與TypeError: e.getAttribute is not a function錯誤var id = elem.getAttribute('id');線的strophe的sendIQ功能崩潰,因爲(如果我理解正確),iq不是一個XML元素對象,而是一個XML文檔對象。

經過一番搜索,我能夠通過這樣來避免碰撞:

let iq_str = "<iq type='get' id='roster1'><query xmlns='jabber:iq:roster'/></iq>"; 
let parser = new DOMParser(); 
let iq = parser.parseFromString(iq_str, "text/xml").getElementsByTagName("iq")[0]; 
XMPP.conn.sendIQ(iq, onRoster); 

可是這樣一來,我明明沒有收到任何答覆,因爲我不是在通過iq指定查詢變量。

我有這樣的感覺,我必須失去一些非常微不足道的東西,但我一直在堅持一段時間。我發現的所有示例都使用jQuery,但我相信必須有一個不使用它的解決方案。

+0

我的壞,'getElementsByTagName'不會返回子元素,因此智商是正確的。問題是'onRoster'回調中的一個錯誤,我沒有注意到。 –

回答

1

您應該使用Strophe自己的Strophe.Builder構造函數創建XML節,而不是瀏覽器的DOMParser API。而不是直接調用Strophe.Builder的

,您可以通過使用效用函數Strophe.$msg(用於「消息」節),Strophe.$pres(對於「存在」節)和Strophe.$iq(對於「智商」節)做到這一點。

子元素通過c方法和文本通過t方法添加。

例如:

$msg({'to': '[email protected]'}).c('body').t('Hello world!); 

這些函數和方法返回生成Strophe.Builder對象。所以如果你使用c添加一個孩子,它會返回這個孩子。如果您想添加另一個孩子,則使用up將上下文移回到父級。

例如:

$msg({'to': '[email protected]'}).c('child1').up().c('child2'); 

還有一個更一般的,低層次的$build功能,由$味精叫,$ PRES和$智商,哪些是你可以用它來生成其他XML節,但它的很少需要。

所以創建和發送您的具體IQ節,你會做這樣的事:

let iq = $iq({'type':'get', 'id':'roster1'}).c('query', {'xmlns':'jabber:iq:roster'}); 
XMPP.conn.sendIQ(iq, onRoster); 
+0

感謝您的回答和解釋。我已經嘗試過,雖然(這是我發現的第一個例子),但不斷得到一個_ $ IQ不是defined_錯誤。我最終以爲它失敗的原因是因爲它實際上是jQuery,但現在我發現我錯了。我不斷收到相同的錯誤。 –

+0

沒關係,我將$ iq添加到了strophe導入,並且工作正常。 –

+0

然後請接受答案。 –