2012-05-07 37 views
1

我要讓像谷歌Wave一個聊天程序,顯示了在實時輸入。目前我只使用textarea。我只想知道用戶對textarea所做的更改(無論是一個字符還是粘貼文本),而不必在整個textarea上執行diff。我是沿着使用setTimeoutoninput事件的線條的東西,但我認爲這隻能給我和「後的文本」,「文本之前」。有任何想法嗎?如何從textarea獲取新輸入的文本?

+1

你可能要花費一些時間檢查出meteor.js http://meteor.com這是一個javascript框架編寫實時應用程序 - 如聊天。 –

回答

1

這種類型的功能被使用消息配料類型的設置最有可能實現的。

這裏是它是如何打破:

  1. 附加事件處理程序的文本區域來跟蹤人物等級(認爲,的keydown,按鍵,KEYUP,等..)修改和記錄這些成消息緩衝區

  2. 您需要爲「endchange」,「onpaste」等「最終事務」類型事件提供備份。這些事件用於檢查您的狀態並準備好運行「完全重新同步」(例如,通知其它客戶做一個全面的「拉」),如果你認爲你有一個不匹配

  3. 上的間隔
  4. (每0.3 - 1秒),則清空消息緩衝區和重新發送消息到其他客戶端(直接連接[WebSockets的?],或經由服務器間接)

  5. 當客戶端接收消息,他們按照他們收到的相同順序處理它們[希望]以相同的狀態,錯誤或衝突回退結束:信號完全同步

  6. 在完全同步客戶端上應重新拉動完整狀態試圖將焦點/胡蘿蔔接近最後的位置儘可能

在一個側面說明:這是大大與在那裏你可以做你的區域清潔全互換而不影響我的「地區」的概念簡化...

希望這有助於-ck

1

你會想看看key事件:​​,keypressedkeyup

W3C keyboard events

但你還需要考慮粘貼的文本 - 這可能沒有一個按鍵。

一種策略,以簡化事件HANDELING,將有一個「提交」按鈕。然後你會知道用戶何時完成他們的陳述。

1

跟蹤價值使用setInterval將文本區域與自身進行比較,以查看它是否發生更改。這適用於粘貼,正常按鍵等

例子:

var lastVal = $("#myTextInput").val(); 
setInverval(function(){ 
    if($("#myTextInput").val() != lastVal) { 
     lastVal = $("#myTextInput").val(); 
     // the text changed, do something with the current value (AJAX, whatever) 
    } 
}, 300); 
相關問題