mirror of
https://github.com/socketio/socket.io.git
synced 2026-01-15 01:48:01 -05:00
107 lines
2.8 KiB
JavaScript
107 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
(function() {
|
|
|
|
var socket = io();
|
|
var canvas = document.getElementsByClassName('whiteboard')[0];
|
|
var colors = document.getElementsByClassName('color');
|
|
var context = canvas.getContext('2d');
|
|
|
|
var current = {
|
|
color: 'black'
|
|
};
|
|
var drawing = false;
|
|
|
|
canvas.addEventListener('mousedown', onMouseDown, false);
|
|
canvas.addEventListener('mouseup', onMouseUp, false);
|
|
canvas.addEventListener('mouseout', onMouseUp, false);
|
|
canvas.addEventListener('mousemove', throttle(onMouseMove, 10), false);
|
|
|
|
//Touch support for mobile devices
|
|
canvas.addEventListener('touchstart', onMouseDown, false);
|
|
canvas.addEventListener('touchend', onMouseUp, false);
|
|
canvas.addEventListener('touchcancel', onMouseUp, false);
|
|
canvas.addEventListener('touchmove', throttle(onMouseMove, 10), false);
|
|
|
|
for (var i = 0; i < colors.length; i++){
|
|
colors[i].addEventListener('click', onColorUpdate, false);
|
|
}
|
|
|
|
socket.on('drawing', onDrawingEvent);
|
|
|
|
window.addEventListener('resize', onResize, false);
|
|
onResize();
|
|
|
|
|
|
function drawLine(x0, y0, x1, y1, color, emit){
|
|
context.beginPath();
|
|
context.moveTo(x0, y0);
|
|
context.lineTo(x1, y1);
|
|
context.strokeStyle = color;
|
|
context.lineWidth = 2;
|
|
context.stroke();
|
|
context.closePath();
|
|
|
|
if (!emit) { return; }
|
|
var w = canvas.width;
|
|
var h = canvas.height;
|
|
|
|
socket.emit('drawing', {
|
|
x0: x0 / w,
|
|
y0: y0 / h,
|
|
x1: x1 / w,
|
|
y1: y1 / h,
|
|
color: color
|
|
});
|
|
}
|
|
|
|
function onMouseDown(e){
|
|
drawing = true;
|
|
current.x = e.clientX||e.touches[0].clientX;
|
|
current.y = e.clientY||e.touches[0].clientY;
|
|
}
|
|
|
|
function onMouseUp(e){
|
|
if (!drawing) { return; }
|
|
drawing = false;
|
|
drawLine(current.x, current.y, e.clientX||e.touches[0].clientX, e.clientY||e.touches[0].clientY, current.color, true);
|
|
}
|
|
|
|
function onMouseMove(e){
|
|
if (!drawing) { return; }
|
|
drawLine(current.x, current.y, e.clientX||e.touches[0].clientX, e.clientY||e.touches[0].clientY, current.color, true);
|
|
current.x = e.clientX||e.touches[0].clientX;
|
|
current.y = e.clientY||e.touches[0].clientY;
|
|
}
|
|
|
|
function onColorUpdate(e){
|
|
current.color = e.target.className.split(' ')[1];
|
|
}
|
|
|
|
// limit the number of events per second
|
|
function throttle(callback, delay) {
|
|
var previousCall = new Date().getTime();
|
|
return function() {
|
|
var time = new Date().getTime();
|
|
|
|
if ((time - previousCall) >= delay) {
|
|
previousCall = time;
|
|
callback.apply(null, arguments);
|
|
}
|
|
};
|
|
}
|
|
|
|
function onDrawingEvent(data){
|
|
var w = canvas.width;
|
|
var h = canvas.height;
|
|
drawLine(data.x0 * w, data.y0 * h, data.x1 * w, data.y1 * h, data.color);
|
|
}
|
|
|
|
// make the canvas fill its parent
|
|
function onResize() {
|
|
canvas.width = window.innerWidth;
|
|
canvas.height = window.innerHeight;
|
|
}
|
|
|
|
})();
|