drag
Version:
a very small drag library for javascript
459 lines (402 loc) • 16 kB
JavaScript
//stub this for ie crap
if (!window.console) {
window.console = { log: function () {}}
}
sink('add', function (test, ok) {
test('add: should return the element passed in', 1, function () {
var el = document.getElementById('input');
var returned = bean.add(el, 'click', function () {});
ok(el == returned, 'returns the element passed in');
bean.remove(el);
});
test('add: should be able to add single events to elements', 1, function () {
var el = document.getElementById('input');
bean.add(el, 'click', function () {
bean.remove(el);
ok(true, 'adds single events to elements');
});
Syn.click(el);
});
test('add: should be able to add single events to objects', 1, function () {
var obj = {};
bean.add(obj, 'complete', function () {
ok(true, 'adds single events to objects');
});
bean.fire(obj, 'complete');
bean.remove(obj);
bean.fire(obj, 'complete');
});
test('add: scope should be equal to element', 1, function () {
var el = document.getElementById('input');
bean.add(el, 'click', function (e) {
bean.remove(el);
ok(this == el, 'equal to element')
});
Syn.click(el);
});
test('add: should recieve an event method', 1, function () {
var el = document.getElementById('input');
bean.add(el, 'click', function (e) {
bean.remove(el);
ok(e != null, 'recieves an event method')
});
Syn.click(el);
});
test('add: should be able to pass x amount of additional arguments', 4, function () {
var el = document.getElementById('input');
handler = function (e, foo, bar, baz) {
bean.remove(el);
ok(e != null, 'listener was called with event');
ok(foo === 1, 'listener was called with correct argument');
ok(bar === 2, 'listener was called with correct argument');
ok(baz === 3, 'listener was called with correct argument');
};
bean.add(el, 'click', handler, 1, 2, 3);
Syn.click(el);
});
test('add: should be able to add multiple events by space seperating them', 2, function () {
var el = document.getElementById('input');
bean.add(el, 'click keypress', function () {
ok(true, 'adds multiple events by space seperating them');
});
Syn.click(el).key('j');
});
test('add: should add same event only one time', 1, function () {
var el = document.getElementById('input');
bean.remove(el);
var handler = function () {ok(true, 'adds same event only one time')};
bean.add(el, 'click', handler);
bean.add(el, 'click', handler);
bean.add(el, 'click', handler);
Syn.click(el);
});
test('add: should be able to add multiple events of the same type', 3, function () {
var el = document.getElementById('input');
bean.remove(el);
bean.add(el, 'click', function () {ok(true, 'adds multiple events of the same type 1')});
bean.add(el, 'click', function () {ok(true, 'adds multiple events of the same type 2')});
bean.add(el, 'click', function () {ok(true, 'adds multiple events of the same type 3')});
Syn.click(el);
});
test('add: should be able to add multiple events simultaneously with an object literal', 2, function () {
var el = document.getElementById('input');
bean.remove(el);
bean.add(el, {
click: function () {
ok(true, 'adds multiple events simultaneously with an object literal 1');
},
keydown: function () {
ok(true, 'adds multiple events simultaneously with an object literal 2');
bean.remove(el);
}
});
Syn.click(el).key('j');
});
test('add: should bubble up dom', 1, function () {
var el1 = document.getElementById('foo');
var el2 = document.getElementById('bar');
bean.add(el1, 'click', function () {ok(true, 'bubbles up dom')});
Syn.click(el2);
});
})
sink('fire', function (test, ok) {
test('fire: should be able to fire an event', 1, function () {
var el = document.getElementById('input');
bean.remove(el);
bean.add(el, 'click', function () {ok(true, 'fires an event')});
bean.fire(el, 'click');
});
test('fire: should be able to fire multiple events by space seperation', 2, function () {
var el = document.getElementById('input');
bean.remove(el);
bean.add(el, 'mousedown', function () {ok(true, 'fires multiple events by space seperation 1')});
bean.add(el, 'mouseup', function () {ok(true, 'fires multiple events by space seperation 2')});
bean.fire(el, 'mousedown mouseup');
});
test('fire: should be able to pass multiple arguments to custom event', 4, function () {
// jquery like array syntax
var el = document.getElementById('input');
bean.remove(el);
bean.add(el, 'foo', function (one, two, three) {
ok(arguments.length == 3, 'fires an event with 3 arguments')
ok(one == 1, 'value should equal 1')
ok(two == 2, 'value should equal 2')
ok(three == 3, 'value should equal 3')
});
bean.fire(el, 'foo', [1, 2, 3]);
});
})
sink('custom', function (test, ok) {
test('custom: should be able to add single custom events', 1, function () {
var el = document.getElementById('input');
bean.remove(el);
bean.add(el, 'partytime', function () {
ok(true, 'add single custom events');
});
bean.fire(el, 'partytime');
});
test('custom: should bubble up dom like traditional events', 1, function () {
if (!window.addEventListener) {
//dean edwards onpropertychange hack doesn't bubble unfortunately :(
return ok(true, 'internet explorer is not a bubler, turns out.')
}
var el1 = document.getElementById('foo');
var el2 = document.getElementById('bar');
bean.add(el1, 'partytime', function () {ok(true, 'bubbles up dom like traditional events')});
bean.fire(el2, 'partytime');
});
})
sink('event object', function (test, ok) {
test('event: should have correct target', 1, function () {
var el1 = document.getElementById('foo');
var el2 = document.getElementById('bar');
bean.remove(el1, 'click');
bean.add(el1, 'click', function (e) {ok(e.target == el2, 'has correct target')});
Syn.click(el2);
});
test('event: should have stop propagation method', 1, function () {
var el = document.getElementById('foo');
bean.remove(el);
bean.add(el, 'click', function (e) {ok(e.stopPropagation != null, 'has stop propagation')});
Syn.click(el);
});
test('event: should have preventDefault method', 1, function () {
var el = document.getElementById('foo');
bean.remove(el);
bean.add(el, 'click', function (e) {ok(e.preventDefault != null, 'has prevent default method')});
Syn.click(el);
});
test('event: should have keyCode', 1, function () {
var el = document.getElementById('input');
bean.add(el, 'keypress', function (e) {
bean.remove(el);
ok(e.keyCode != null, 'has keycode');
});
Syn.key(el, 'f');
});
})
sink('remove', function (test, ok) {
test('remove: should return the element passed in', 1, function () {
var el = document.getElementById('foo');
bean.remove(el);
var handler = function () {};
bean.add(el, 'click', handler);
var returned = bean.remove(el, 'click', handler);
ok(el == returned, 'returns the element passed in');
});
test('remove: should be able to remove a single event', 1, function () {
var el = document.getElementById('foo');
bean.remove(el);
var handler = function () {
ok(true, 'remove a single event');
bean.remove(el, 'click', handler);
Syn.click(el);
}
bean.add(el, 'click', handler);
Syn.click(el)
});
test('remove: should be able to remove mulitple events with an object literal', 1, function () {
var el = document.getElementById('input'),
handler1 = function () {
ok(true, 'remove mulitple events with an object literal1');
bean.remove(el, {
click: handler1,
keydown: handler2
});
Syn.click(el).key('j');
},
handler2 = function () {
ok(true, 'remove mulitple events with an object literal2');
};
bean.add(el, 'click', handler1);
bean.add(el, 'keydown', handler2);
Syn.click(el);
});
test('remove: should be able to remove all events of a specific type', 2, function () {
var el = document.getElementById('input');
bean.remove(el);
var handler1 = function () {
ok(true, 'removes all events of a specific type 1');
},
handler2 = function () {
ok(true, 'removes all events of a specific type 2');
bean.remove(el, 'click');
Syn.click(el);
};
bean.add(el, 'click', handler1);
bean.add(el, 'click', handler2);
Syn.click(el);
});
test('remove: should be able to remove all events of a specific type', 2, function () {
var el = document.getElementById('input');
bean.remove(el);
var handler1 = function () {
ok(true, 'removes all events of a specific type 1');
},
handler2 = function () {
ok(true, 'remove all events of a specific type 2');
bean.remove(el, 'mousedown mouseup');
Syn.click(el);
};
bean.add(el, 'mousedown', handler1);
bean.add(el, 'mouseup', handler2);
Syn.click(el);
});
test('remove: should be able to remove all events', 1, function () {
var el = document.getElementById('input'),
handler1 = function () {
ok(true, 'remove all events 1');
bean.remove(el);
Syn.click(el).key('j');
},
handler2 = function () {
ok(true, 'remove all events 2');
};
bean.add(el, 'click', handler1);
bean.add(el, 'keydown', handler2);
Syn.click(el);
});
test('remove: should be able to remove all events of a certain namespace', 1, function () {
var el = document.getElementById('input'),
handler1 = function () {
ok(true, 'remove all events 1');
bean.remove(el, '.foo');
Syn.click(el).key('j');
},
handler2 = function () {
ok(true, 'remove all events 2');
};
bean.add(el, 'click.foo', handler1);
bean.add(el, 'click.foo', handler1);
bean.add(el, 'keydown.foo', handler2);
Syn.click(el);
});
})
sink('clone', function (test, ok, before) {
var el1 = document.getElementById('input');
var el2 = document.getElementById('input2');
before(function () {
bean.remove(el1);
bean.remove(el2);
})
test('clone: should be able to clone events of a specific type from one element to another', 2, function () {
bean.add(el2, 'click', function () {ok(true, 'clones events of a specific type from one element to another 1')});
bean.add(el2, 'click', function () {
ok(true, 'clone events of a specific type from one element to another 2');
bean.remove(el1);
});
bean.add(el2, 'keydown', function () {
ok(true, 'clone events of a specific type from one element to another 3');
bean.remove(el1);
});
bean.clone(el1, el2, 'click');
Syn.click(el1).key('j');
});
test('clone: should be able to clone all events from one element to another', 3, function () {
bean.add(el2, 'keypress', function () {ok(true, 'clones all events from one element to another 1');});
bean.add(el2, 'click', function () {ok(true, 'clones all events from one element to another 2');});
bean.add(el2, 'click', function () {ok(true, 'clonesall events from one element to another 3');});
bean.clone(el1, el2);
Syn.click(el1).key('j');
});
test('clone: should firere cloned event in scope of new element', 1, function () {
bean.add(el1, 'click', function () {
ok(this == el2, 'scope of "this" is the element that cloned the event')
})
bean.clone(el2, el1)
Syn.click(el2)
});
})
sink('delegation', function (test, ok) {
test('delegate: should be able to delegate on selectors', 4, function () {
var el1 = document.getElementById('foo');
var el2 = document.getElementById('bar');
var el3 = document.getElementById('baz');
var el4 = document.getElementById('bang');
bean.remove(el1);
bean.remove(el2);
bean.remove(el3);
bean.add(el1, '.bar', 'click', function () {
ok(true, 'delegation on selectors 1');
ok(this == el2, 'delegation on selectors, context was set to delegated element 2');
}, qwery);
Syn.click(el2);
Syn.click(el3);
Syn.click(el4);
});
test('delegate: should be able to delegate on arary', 4, function () {
var el1 = document.getElementById('foo');
var el2 = document.getElementById('bar');
var el3 = document.getElementById('baz');
var el4 = document.getElementById('bang');
bean.remove(el1);
bean.remove(el2);
bean.remove(el3);
bean.add(el1, [el2], 'click', function () {
ok(true, 'delegation on arary 1');
ok(this == el2, 'delegation on arary, context was set to delegated element 1');
}, qwery);
Syn.click(el2);
Syn.click(el3);
Syn.click(el4);
});
})
sink('namespaces', function (test, ok) {
test('namespace: should be able to name handlers', 1, function () {
var el1 = document.getElementById('foo');
bean.remove(el1);
bean.add(el1, 'click.fat', function () {ok(true, 'bubbles up dom')});
Syn.click(el1);
});
test('namespace: should be able to add multiple handlers under the same namespace to the same element', 2, function () {
var el1 = document.getElementById('foo');
bean.remove(el1);
bean.add(el1, 'click.fat', function () {ok(true, 'bubbles up dom')});
bean.add(el1, 'click.fat', function () {ok(true, 'bubbles up dom')});
Syn.click(el1);
});
test('namespace: should be able to fire an event without handlers', 1, function () {
var el1 = document.getElementById('foo'), succ;
bean.remove(el1);
try {
bean.fire(el1, 'click.fat');
succ = true;
} catch (exc) {
succ = false;
}
ok(succ, 'fire namespaced event with no handlers');
});
test('namespace: should be able to target namespaced event handlers with fire', 1, function () {
var el1 = document.getElementById('foo');
bean.remove(el1);
bean.add(el1, 'click.fat', function () {ok(true, 'targets namespaced event handlers with fire')});
bean.add(el1, 'click', function () {ok(true, 'targets namespaced event handlers with fire')});
bean.fire(el1, 'click.fat');
});
test('namespace: should be able to target multiple namespaced event handlers with fire', 2, function () {
var el1 = document.getElementById('foo');
bean.remove(el1);
bean.add(el1, 'click.fat', function () {ok(true, 'target multiple namespaced event handlers with fire')});
bean.add(el1, 'click.ded', function () {ok(true, 'targets multiple namespaced event handlers with fire')});
bean.add(el1, 'click', function () {ok(true, 'targets multiple namespaced event handlers with fire')});
bean.fire(el1, 'click.fat.ded');
});
test('namespace: should be able to remove handlers based on name', 1, function () {
var el1 = document.getElementById('foo');
bean.remove(el1);
bean.add(el1, 'click.ded', function () {ok(true, 'removes handlers based on name')});
bean.add(el1, 'click', function () {ok(true, 'removes handlers based on name')});
bean.remove(el1, 'click.ded');
Syn.click(el1);
});
test('namespace: should be able to remove multiple handlers based on name', 1, function () {
var el1 = document.getElementById('foo');
bean.remove(el1);
bean.add(el1, 'click.fat', function () {ok(true, 'removes multiple handlers based on name')});
bean.add(el1, 'click.ded', function () {ok(true, 'removes multiple handlers based on name')});
bean.add(el1, 'click', function () {ok(true, 'removes multiple handlers based on name')});
bean.remove(el1, 'click.ded.fat');
Syn.click(el1);
});
});
window.onload = start;