2014-12-20 3 views
0

커서 창에 현재 커서가있는 모든 현재 방문자를 표시하는 가장 좋은 방법은 무엇입니까?모든 현재 방문자 커서 표시 라이브

너무 느리지 않고 달성 할 수 있습니까?

이것은 유성 JS 내 시도 :

http://meteorpad.com/pad/rCSsroc4G4gYQGkAY/Leaderboard가 (이름을 마음, 변경할 수 없습니다?)

http://allofthecursors.meteor.com/

cursors.js :

Cursors = new Mongo.Collection("Cursors"); 

if (Meteor.isClient) { 
    Meteor.startup(function() { 
     if(!Session.get('cursorId')) { 
     // todo: not unique enough! 
     var cursorId = new Date(); 

     Session.set('cursorId', cursorId); 
     Meteor.call('initCursor', cursorId); 
     } 
    }); 

    Template.cursor.helpers({ 
    cursor: function() { 
     return Cursors.findOne({ cursorId: Session.get('cursorId') }); 
    }, 
    cursors: function() { 
     return Cursors.find({ cursorId: { $ne: Session.get('cursorId') } }); 
    } 
    }); 

    Template.cursor.events({ 
    "mousemove": function(event) { 
     var x = event.pageX, 
      y = event.pageY, 
      cursorId = Session.get('cursorId'); 

     Meteor.call('updateCursor', cursorId, x, y); 
    } 
    }); 
} 

if (Meteor.isServer) { 

    Meteor.methods({ 
    'initCursor': function(cursorId) { 
     Cursors.insert({ 
      cursorId: cursorId, 
      x: 0, 
      y: 0 
     }); 
    }, 
    'updateCursor': function(cursorId, x, y) { 
     Cursors.update(
     { cursorId: cursorId }, 
     { $set: { x: x, y: y }} 
    ); 
    } 
    }); 
} 

커서 .html

<head> 
    <title>cursors</title> 
</head> 
<body> 

    {{> cursor}} 

</body> 

<template name="cursor"> 
    <div class="cursors-area"> 
     {{#each cursors}} 
      <div class="cursor" style="top: {{y}}px; left: {{x}}px;"></div> 
     {{/each}} 

     <div class="my-cursor"> 
      {{cursor.cursorId}}: {{cursor.x}}, {{cursor.y}} 
     </div> 
    </div> 
</template> 
응답 evrybady에 대한

cursors.css는

html, body { 
    margin: 0; 
    padding: 0; 
} 

.cursors-area { 
    height: 100vh; 
} 

.cursor { 
    position: fixed; 
    width: 11px; 
    height: 17px; 
    background-image: url(cursor.png); 
} 

감사합니다. 여기에 업데이트 된 버전이 있습니다. $ 유성이 lepozepo를 추가 :

는 스트림 패키지를 추가 클라이언트 측 수집에만 반응 기능에 액세스하는 데 사용되는

스트리밍합니다.

cursors_2.js

Stream = new Meteor.Stream('public'); 

if(Meteor.isClient) { 

    Cursors = new Mongo.Collection(null); 

    Template.cursor.events({ 
    'mousemove': function(event) { 

     if (Meteor.status().connected) { 
     Stream.emit('p', { 
      _id: Meteor.connection._lastSessionId, 
      x: event.pageX, 
      y: event.pageY 
     }); 
     } 

    } 
    }); 

    Stream.on('p', function(p) { 

    // how can I change this? 

    if(Cursors.findOne(p._id) === undefined) { 

     Cursors.insert({ 
     _id: p._id, 
     x: p.x, 
     y: p.y 
     }); 

    } else { 

     Cursors.update(p._id, { 
      $set: { 
      x: p.x, 
      y: p.y 
      } 
     } 
    ); 
    } 

    }); 

    function getCursors() { 
    return Cursors.find(); 
    } 
    var throttledGetCursors = _.throttle(getCursors, 50); 

    Template.cursor.helpers({ 
    cursors: throttledGetCursors 
    }); 
} 
+0

[메서드 호출을 제한하기 위해 밑줄을 사용하는] (http://underscorejs.org/#throttle)을 권장하므로 마우스가 한 픽셀 씩 이동할 때마다 새 메서드 호출을 보내지 않습니다. 움직임을 여전히 부드럽게 보이게하려면 스로틀과 같은 지속 시간을 사용하여 CSS 속성을 'top'및 'left'속성에 넣을 수 있습니다. – sbking

+0

디 바운싱 외에도 [streams] (http://arunoda.github.io/meteor-streams/)을 사용해야합니다. MongoDB없이 실시간 통신을 할 수 있습니다. 그 웹 사이트는 당신의 앱에 스트림 패키지를 추가하기 위해 구식입니다.'meteor add lepozepo : streams' – sbking

+0

전환을 사용해 보았지만 이상한 지연이있었습니다. 내가 스로틀을 올바르게 설정할 수 있었는지 확실하지 않은. – niklashultstrom

답변

1

이것에 대해 이동하는 방법은 두 가지가 기본적으로 있습니다.

  1. 첫 번째는 클라이언트 - 서버 - 클라이언트 통신 및 레코드 보관 (즉, 콜렉션)을 위해 내장 된 API를 사용하는 것입니다. 이것의 이점은 매우 간단하고 반응과 의사 소통이 당신을 위해 돌보아진다는 것입니다. 이 경로를 따라 간다면 현재 설정이 복잡해 졌다고 생각합니다. 각 클라이언트의 위치 변경을 전달하는 방법을 사용하고 컬렉션이 동기화되면 livedata를 사용하여 다시 통신 할 수 있습니다. 왜 클라이언트에서 콜렉션에 쓰는 것이 아닌가?

CLIENT

Template.body.events({ 
    'mousemove': function(event) { 
     if (Meteor.status().connected) { 
      Cursors.update(Meteor.connection._lastSessionId, { 
       $set: { 
        x: event.pageX, 
        y: event.pageY 
       } 
      }); 
     } 
    } 
}); 

서버에

Meteor.onConnection(function(connection) { Cursors.insert({ _id: connection.id, x: 0, y: 0 }); connection.onClose(function() { Cursors.remove(connection.id); }); }); 

뿐만 아니라에 세션 ID를 사용하여 세션 변수에 대한 필요성을 미연에 방지 :이 같은 것을 건의 할 것 각 클라이언트에 대해 고유 한 커서 ID를 제공하고 연결이 끊어지면 컬렉션에서 제거합니다. 이는 보안상의 관점에서 보면 사용자가 우려 할만한 경우에 대비해 허용/거부를 ​​통해 연결 ID를 공유하지 않는 커서를 업데이트하지 못하도록 허용하므로 더 바람직합니다.

  1. 그러나 여전히 MongoDB 밖으로 물건을 가져 오는 오버 헤드가있어 어떤 대기 시간이 발생합니다. @sbking이 지적한대로 lepozepo:streams 패키지 (docs here)를 사용하면 원시 websocket에 더 가까이 통신 할 수 있으며 배관이 수반되므로 대기 시간이 짧아집니다.2015 년 12 월 런던 DevShop에서 이에 대한 논의가있었습니다. 동영상은 곧 제공 될 예정입니다. 누군가가 순수한 서버 - 클라이언트 메시징 (콜렉션과 무관 한)을위한 콜렉션을 작성할 수 있다면 좋겠지 만, 현재 존재한다고 생각하지는 않습니다.

또한, 당신은 밑줄 (하지 조절)로 업데이트를 디 바운싱한다 @sbking로 합의했다.

+0

OP를 명확히하기 위해 사용자가 커서 이동을 중지 한 후 디 바운싱이 n 밀리 초 만의 업데이트를 보냅니다. 스로틀은 최대 n 밀리 초마다 업데이트를 보내지 만 사용자가 커서를 움직이는 동안 업데이트를 보낼 수 있습니다. 사용할 것인지에 대한 결정은 응용 프로그램의 작동 방식에 달려 있습니다. 그러나 디 바운싱 (debouncing)은 업데이트 횟수를 줄입니다. – sbking

+0

감사합니다. 컬렉션과 스트림을 교환 할 수있었습니다. 나는이 설정에서 반응을 사용하는 방법을 잘 모르겠다. 필자는 클라이언트 전용 콜렉션을 사용하여 가짜로 적절한 DOM 업데이트를 생성 할 수있다. 그러나 "insert"가 함수가 아니라는 오류가 발생한다. 내 클라이언트 "커서"컬렉션. – niklashultstrom

+0

"스트림 버전"이 가동되어 @ http://allofthecursors.meteor.com/ ...은 성능이 확실히 향상 될 수 있습니다. – niklashultstrom

0

WebRTC를 사용하십시오. 그것을위한 Google.

본질적으로 두 개의 브라우저를 연결하기 위해 JavaScript를 사용하고 Meteor가 핸드 셰이크를 보내면 두 브라우저가 대화 할 수 있습니다. 여기에서 Meteor 또는 고객을 부 풀리지 않고 모든 종류의 데이터 집약적 인 작업을 수행 할 수 있습니다. Ez. Pz.