1

https://quip.com/과 비슷한 단락 잠금 속성을 가진 텍스트 편집기를 실시간으로 개발 중입니다. socket.ionodejs.Nodejs & Socket.io의 실시간 협업 텍스트 편집기

주어진 단락에 글을 쓸 때, 다른 사람 공동 작업자 캔트가 편집 할 수 있다는 것을 의미합니다. 입력하거나 단락 다른 공동 작업자에 대한 편집 가능한이되는 새로운 라인으로 커서를 이동 공격

순간.

나는 이것 이후로 아주 고생하고있다. 나는 더 나아갈 접근를 생각하고있다. 제발 제안.

다음은 내 코드입니다. 완벽하게 작동합니다. 지금까지 모든 공동 작업자 목록을 가져와 다른 공동 작업자에게 편집자의 콘텐츠를 브로드 캐스트합니다.

index.html을

<!DOCTYPE html> 
<html> 
<head> 
    <title>Connected Clients</title> 
    <!--<meta charset="UTF-8"> --> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
    <!--<script type="text/javascript" src="jquery.js"></script> --> 
    <script src="/socket.io/socket.io.js"></script> 
</head> 

<body> 
    <textarea id="editor" style="height:200px;width:300px"> 
     Thinknest Pragraph locking Test sample ! 
    </textarea> 

    <script> 
    function msgReceived(msg){ 
     //clientCounter.html(msg.clients); 
     document.getElementById('people').innerHTML=msg.uid; 
     //console.log(msg.id); 
    } 

    var clientCounter; 

    $(document).ready(function() { 
     clientCounter = $("#client_count"); 
     var socket = io.connect(
         'http://localhost:5000', 
         {'sync disconnect on unload':true} 
        ); 
     var uId=prompt("enter your userId",''); 
     socket.emit('collabrator',uId); 

     socket.on('message', function(msg){ 
      msgReceived(msg); 
     }); 

     socket.on('online_collabs',function(data){ 
      $('#online_ppl').html(data); 
      clientCounter.html(data.length); 
     }); 

     socket.on('remained_collabs',function(data){ 
      $('#online_ppl').html(data); 
      clientCounter.html(data.length); 
     }); 

     socket.on('note_collabs',function(data){ 
      $('#note_colabs').html(data); 
     }); 

     socket.on('updated_para',function(data){ 
      //$('#editor').append(data); 
      document.getElementById('editor').innerHTML=data; 
     }); 

     $('#editor').on('keydown',function(){ 
      //var para=$('#editor').value; 
      var para= $('#editor').val(); 
      //var para=document.querySelector('[contenteditable]'); 
      // var text=para.textContent; 
      socket.emit('para',{paragraph:para}); 
     }); 
    }); 
    </script> 

    <p><span id="client_count">0</span> connected clients</p><br/> 
    <ul id="people"></ul> 
    <h3>Online Collaborators</h3> 
    <span id="online_ppl"></span> <br> 
    <h3>Note Collaborators</h3> 
    <span id="note_colabs"></span> 
</body> 
</html> 

server.js

var app = require('express')() 
    , server = require('http').createServer(app) 
    , io = require('socket.io').listen(server); 

server.listen(5000); 

app.get('/',function(req,res){ 
    res.sendfile("./index.html"); 
}); 

var activeClients = 0; 
var Collaborators=['Colab1','Colab2','Colab3']; 
var people=[]; 

io.sockets.on('connection', function(socket){ 
    clientConnect(socket); 

    socket.on('disconnect', function(){ 
     clientDisconnect(socket); 
    }); 

    socket.on('para',function(data){ 
     //io.sockets.emit('updated_para',data.paragraph); 
     socket.broadcast.emit('updated_para',data.paragraph); 
    }); 
}); 

function clientConnect(socket){ 
    //activeClients +=1; 
    var userSocketId=socket.id; 
    check_Collaborator(socket); 

    io.sockets.emit('message', {uid:userSocketId}); 
} 

var online_collabs=[]; 

function check_Collaborator(socket){ 
    socket.on('collabrator',function(data){ 
     if(Collaborators.indexOf(data)!=-1){ 
      socket.data=data; 

      if(online_collabs.indexOf(data)==-1) { 
       online_collabs.push(data); 
      } 

      io.sockets.emit('online_collabs',online_collabs); 
      io.sockets.emit('note_collabs',Collaborators); 
     } else { 
      console.log("collabrator not found"); 
     } 
    }); 
} 

function clientDisconnect(socket){ 
    var index=online_collabs.indexOf(socket.data) 

    if(index>-1) 
     online_collabs.splice(index,1); 

    //activeClients -=1; 
    //io.sockets.emit('message', {clients:activeClients}); 
    io.sockets.emit('remained_collabs',online_collabs); 
} 
+0

이 프로젝트는 언제든지 오픈 소스입니까? 나는 이걸보고 싶을 때 그것을보고 싶다. –

+0

잠김의 필요성을 제거하는 작동 변환이라고 불리는 무언가가 있습니다.하지만 여기에는 위키 링크가 있습니다. https://en.wikipedia.org/wiki/Operational_transformation –

답변

2

나는 이미 어제 보았다. 당신의 질문은 정확히 무엇입니까? 자바 스크립트로 텍스트 영역을 '고정'하는 방법을 알고 싶습니까? 나는 왜 당신이 질문에 node/socket.io를 그렇게 강조하는지 혼란 스럽다.

또한 다음에 코드 형식을 지정하십시오. 당신은 도움을 원하고 그것을 얻습니다, 그러나 다른 사람들이 당신을 도울 수있게 만듭니다.

다른 사람들이 편집 할 수없는 단락을 만들기 위해해야 ​​할 일은 무엇인지 모르겠습니다. 하지만 socket.io에서 내가 한 일을 제안 해주세요.

각 단락을 별도로 저장하고 누가 잠금을했는지 기억하십시오. 잠금을 위해 사용자가 등록 할 필요가 없을 경우를 대비하여 sessionID를 사용합니다. 이 모양은 다음과 같습니다.

var paragraphs = { 
    data : [ 
     { 
      text: "this is an unlocked paragraph", 
      lock: "" 
     }, 
     { 
      text: "this is a locked paragraph", 
      lock: "oWEALlLx5E-VejicAAAC" 
     } 
    ] 
} 

이제 사용자는 기존 단락 앞에 단락을 추가 할 수 있습니다. 따라서 당신은 같은 추가 인덱스를 유지해야한다 : 데이터의 양이 소켓을 통해 전송되는

var paragraphs = { 
    index : [ 
     1, 
     0 
    ], 
    data : [ 
     { 
      text: "this the second paragraph", 
      lock: "oWEALlLx5E-VejicAAAC" 
     }, 
     { 
      text: "this is the first paragraph", 
      lock: "" 
     } 
    ] 
} 

지금 매우 작아야한다 - 추가 클라이언트/서버 측 로직 입력해도.

+0

그래, 형식을 지정합니다. 서둘러 서면. 어쨌든 퀴프를 사용 했나요? 내 애플 리케이션에서 동일한 작업을 수행하고 싶습니다. 다른 누군가가 당신과 같은 줄에 글을 쓰고 있다면 매우 바쁠 것입니다. 그래서 잠그는 것이 중요합니다. –