<!DOCTYPE html>
<html ng-app="drag">
<head>
<script data-require="angular.js@*" data-semver="1.2.6" src="http://code.angularjs.org/1.2.6/angular.js"></script>
<link href="style.css" rel="stylesheet" />
<script src="script-coffee.js"></script>
</head>
<body>
Use the plus signs to drag the elements
<div ng-controller='dragController'>
<div id=outer>
<div id=inner>
<div ng-repeat="elem in elements" style="top: {{elem.top || 0}}px; left: {{elem.left || 0}}px" class=greenBox>
<div class=handle draggable>+</div>
<div>{{elem.name}}</div>
<div>{{elem.top}}</div>
<div>{{elem.left}}</div>
</div>
</div>
</div>
Events ({{events.length}})
<div ng-repeat="event in events">
<div>{{event | json}}</div>
</div>
</div>
</body>
</html>
/*
This is the original draggable code. It is not used. See the coffeescript file.
*/
angular.module('drag', []).
directive('draggable', function($document) {
return function(scope, element, attr) {
var startX = 0,
startY = 0,
x = 0,
y = 0;
var container = null;
element.css({
position: 'relative',
cursor: 'pointer'
});
element.on('mousedown', function(event) {
// Prevent default dragging of selected content
event.preventDefault();
startX = event.screenX - x;
startY = event.screenY - y;
$document.on('mousemove', mousemove);
$document.on('mouseup', mouseup);
container = attr.$$element.parent();
console.log(container);
});
function mousemove(event) {
y = event.screenY - startY;
x = event.screenX - startX;
console.log("x: " + x + " y: " + y)
container.css({
top: y + 'px',
left: x + 'px'
});
}
function mouseup() {
$document.unbind('mousemove', mousemove);
$document.unbind('mouseup', mouseup);
}
}
});
/* Styles go here */
#outer
/*width 500px
background-color #666
position absolute */
display block
padding 0px
.handle
display: block;
width 10px
margin-top: 0px
margin-left: 0px
background-color #FE4
.greenBox
position absolute
background-color #CE6
width 100px
#inner
position relative
margin 50px
width 80%
height 500px
background-color #888
overflow scroll
This shows how to databind position of draggable elements. Also illustrates use
of a "drag handle" that is the only allowed way to drag the object. Also
demonstrates constraint of draggable elements to their parent container.
console.log('this is from coffeescript file');
module = angular.module("drag", [])
module.directive "draggable", ($document) ->
(scope, element, attr) ->
[x, y, container, startX, startY] = [null, null, null, null, null]
# Prevent default dragging of selected content
mousemove = (event) ->
y = event.pageY - startY
x = event.pageX - startX
#console.log "x: " + x + " y: " + y
if x < 0 then x = 0
if y < 0 then y = 0
scope.$apply( ->
scope.$parent.events.push mousemove: x: x, y: y, pageX: event.pageX, pageY: event.pageY, startY: startY, startX: startX
)
#console.log "#{event.pageX} #{event.pageY} "
container.css
top: y + "px"
left: x + "px"
mouseup = ->
$document.unbind "mousemove", mousemove
$document.unbind "mouseup", mouseup
#debugger
scope.elem.top = y
scope.elem.left = x
console.log element
scope.$apply( ->
scope.$parent.events.push mouseup: x: x, y: y
)
startX = 0
startY = 0
x = scope.elem.left
y = scope.elem.top
container = null
element.css
position: "relative"
cursor: "pointer"
element.on "mousedown", (event) ->
return unless event.which == 1
event.preventDefault()
console.log 'mousedown'
console.log event
console.log element
container = attr.$$element.parent()
console.log container
scope.$apply( ->
scope.$parent.events = ["mousedown": x: x, y: y, pageX: event.pageX, pageY: event.pageY, startY: startY, startX: startX]
)
startX = event.pageX - x
startY = event.pageY - y
$document.on "mousemove", mousemove
$document.on "mouseup", mouseup
module.controller("dragController", ["$scope", ($scope) ->
$scope.events = []
$scope.elements = []
$scope.elements.push(top: 27, left: 57, name: "#1")
$scope.elements.push(top: 135, left: 40, name: "#2")
$scope.elements.push(top: 184, left: 227, name: "#3")
])