2014-09-22 2 views
0

차트의 섹션으로 원을 드래그하여 제출하는 사람들을위한 반복 차트를 만들려고합니다. 이 서클은 다른 사람들이 볼 수 있도록 차트에 표시됩니다. 이 아이디어는 프로젝트의 가장 중요한 측면을 이해 관계자에게 결정하는 것입니다.대화 형 드래그 가능 차트

나는이 기능의 일부를 보여주는 jsfiddle입니다. 내가 '기록'하고 싶은 것은 원을 이동 한 다음 제출할 때 어딘가에 배치하는 것입니다 (CSV). 그런 다음 차트에 CSV 프로그램의 모든 서클을 갖고 싶습니다.

요소 (원)를 검사하면 위치가 표시됩니다.

의미가 있습니까? 누구든지 아이디어가 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

샘플 코드는 다양한 온라인 자습서에서 함께 자갈길 :

에릭 너무 많은

<svg xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    version="1.1" 
    width="970" 
    height="450"> 

    <script type="text/ecmascript"><![CDATA[ 
    var selectedElement = 0; 
    var currentX = 0; 
    var currentY = 0; 
    var currentMatrix = 0; 

    function selectElement(evt) { 
     selectedElement = evt.target; 
     currentX = evt.clientX; 
     currentY = evt.clientY; 
     currentMatrix = selectedElement.getAttributeNS(null, "transform").slice(7,-1).split(' '); 

     for(var i=0; i<currentMatrix.length; i++) { 
     currentMatrix[i] = parseFloat(currentMatrix[i]); 
     } 

     selectedElement.setAttributeNS(null, "onmousemove", "moveElement(evt)"); 
     selectedElement.setAttributeNS(null, "onmouseout", "deselectElement(evt)"); 
     selectedElement.setAttributeNS(null, "onmouseup", "deselectElement(evt)"); 
    } 

    function moveElement(evt) { 
     var dx = evt.clientX - currentX; 
     var dy = evt.clientY - currentY; 
     currentMatrix[4] += dx; 
     currentMatrix[5] += dy; 

     selectedElement.setAttributeNS(null, "transform", "matrix(" + currentMatrix.join(' ') + ")"); 
     currentX = evt.clientX; 
     currentY = evt.clientY; 
    } 

    function deselectElement(evt) { 
     if(selectedElement != 0){ 
      selectedElement.removeAttributeNS(null, "onmousemove"); 
      selectedElement.removeAttributeNS(null, "onmouseout"); 
      selectedElement.removeAttributeNS(null, "onmouseup"); 
      selectedElement = 0; 
      } 
     } 

    ]]> </script> 

    <rect x="0.5" y="0.5" width="970" height="399" fill="#ecf0f1" stroke="black"/> 
    <rect x="0.5" y="0.5" width="970" height="299" fill="none" stroke="black"/> 
    <rect x="0.5" y="0.5" width="970" height="199" fill="#ecf0f1" stroke="black"/> 
    <rect x="0.5" y="0.5" width="970" height="99" fill="none" stroke="black"/> 




    <circle 
     id ="circleitem" 
     cx="50" 
     cy="50" 
     r="20" 
     stroke="black" 
     stroke-width="2" 
     fill="#c0392b" 
     transform="matrix(1 0 0 1 0 0)" 
     onmousedown="selectElement(evt)"/> 


</svg> 

<input name="position1" class="inputfield" id="position1" readonly="readonly"> 
<input name="position2" class="inputfield" id="position2" readonly="readonly"> 



<script type="text/javascript"> 

position1.value = currentMatrix[4]; 
position2.value = currentMatrix[5]; 


</script> 

감사

답변

0

의견 수 있지만 긴 하나해야 : 노드 서버와의 실시간 아키텍처를 사용해보십시오 :

socket.io (실시간 채팅 코딩을 확인하고 기본으로 사용).

deselectElement()에서 POST ID,x,y (여기서 ID=random_sessionID, x=currentMatrix[4], y=currentMatrix[5])을 서버에 연결합니다. 채팅 서버를 조정하여 연관 배열 (예 : users[ID] = [x,y];)에 기록하고 연결된 모든 클라이언트에 데이터를 "브로드 캐스트"합니다.

가) 서버에 연결하는 새 클라이언트에 users 배열의 JSON 버전이 제공됩니다.

B)는 연결된 클라이언트 ID,x,y의 업데이트를 수신처 두 시나리오는 :

  1. ID가 존재하면, X를 갱신하는 경우, Y 값.
  2. 새 ID 인 경우 x, y 위치에 id=ID 인 새 서클을 만듭니다.

참고 : 다른 백엔드 서버를 사용할 수 있습니다. 노드 서버에서는 websocket을 사용하여 실시간 업데이트를 구현하는 것이 간단합니다.