11 var Local = Local || {};
13 var fire = 'fireEvent', create = function(){
14 return new Element('div');
17 describe('Events API: Element', function(){
19 beforeEach(function(){
21 Local.fn = function(){
22 return Local.called++;
26 it('should add an Event to the Class', function(){
27 var object = create();
29 object.addEvent('event', Local.fn)[fire]('event');
31 expect(Local.called).toEqual(1);
34 it('should add multiple Events to the Class', function(){
38 })[fire]('event1')[fire]('event2');
40 expect(Local.called).toEqual(2);
43 it('should remove a specific method for an event', function(){
44 var object = create();
45 var x = 0, fn = function(){ x++; };
47 object.addEvent('event', Local.fn).addEvent('event', fn).removeEvent('event', Local.fn)[fire]('event');
50 expect(Local.called).toEqual(0);
53 it('should remove an event and its methods', function(){
54 var object = create();
55 var x = 0, fn = function(){ x++; };
57 object.addEvent('event', Local.fn).addEvent('event', fn).removeEvents('event')[fire]('event');
60 expect(Local.called).toEqual(0);
63 it('should remove all events', function(){
64 var object = create();
65 var x = 0, fn = function(){ x++; };
67 object.addEvent('event1', Local.fn).addEvent('event2', fn).removeEvents();
68 object[fire]('event1')[fire]('event2');
71 object.removeEvents()[fire]('event1')[fire]('event2');
74 expect(Local.called).toEqual(0);
77 it('should remove events with an object', function(){
78 var object = create();
84 object.addEvent('event1', function(){ Local.fn(); }).addEvents(events)[fire]('event1');
85 expect(Local.called).toEqual(2);
87 object.removeEvents(events);
88 object[fire]('event1');
89 expect(Local.called).toEqual(3);
91 object[fire]('event2');
92 expect(Local.called).toEqual(3);
95 it('should remove an event immediately', function(){
96 var object = create();
100 var three = function(){
104 object.addEvent('event', function(){
106 this.removeEvent('event', three);
107 }).addEvent('event', function(){
109 }).addEvent('event', three);
111 object[fire]('event');
112 expect(methods).toEqual([1, 2]);
114 object[fire]('event');
115 expect(methods).toEqual([1, 2, 1, 2]);
118 it('should be able to remove itself', function(){
119 var object = create();
123 var one = function(){
124 object.removeEvent('event', one);
127 var two = function(){
128 object.removeEvent('event', two);
131 var three = function(){
135 object.addEvent('event', one).addEvent('event', two).addEvent('event', three);
137 object[fire]('event');
138 expect(methods).toEqual([1, 2, 3]);
140 object[fire]('event');
141 expect(methods).toEqual([1, 2, 3, 3]);
146 var fragment = document.createDocumentFragment();
148 // Restore native fireEvent in IE for Syn
149 var createElement = function(tag, props){
150 var el = new Element(tag);
151 if (el._fireEvent) el.fireEvent = el._fireEvent;
152 return el.set(props);
155 describe('Element.Event', function(){
157 it('Should trigger the click event', function(){
159 var callback = jasmine.createSpy('Element.Event click');
161 var el = createElement('a', {
171 }).inject(document.body);
173 Syn.trigger('click', null, el);
175 expect(callback).toHaveBeenCalled();
179 it('Should trigger the click event and prevent the default behavior', function(){
181 var callback = jasmine.createSpy('Element.Event click with prevent');
183 var el = createElement('a', {
191 click: function(event){
192 event.preventDefault();
196 }).inject(document.body);
198 Syn.trigger('click', null, el);
200 expect(callback).toHaveBeenCalled();
205 // Only run this spec in browsers other than IE6-8 because they can't properly simulate key events
206 it('Should watch for a key-down event', function(){
208 var callback = jasmine.createSpy('keydown');
210 var div = createElement('div').addEvent('keydown', function(event){
212 }).inject(document.body);
216 expect(callback).toHaveBeenCalledWith('a');
220 it('should clone events of an element', function(){
224 var element = new Element('div').addEvent('click', function(){ calls++; });
225 element.fireEvent('click');
227 expect(calls).toBe(1);
229 var clone = new Element('div').cloneEvents(element, 'click');
230 clone.fireEvent('click');
232 expect(calls).toBe(2);
234 element.addEvent('custom', function(){ calls += 2; }).fireEvent('custom');
236 expect(calls).toBe(4);
238 clone.cloneEvents(element);
239 clone.fireEvent('click');
241 expect(calls).toBe(5);
243 clone.fireEvent('custom');
245 expect(calls).toBe(7);
250 describe('Element.Event', function(){
251 // This is private API. Do not use.
253 it('should pass the name of the custom event to the callbacks', function(){
255 var callback = jasmine.createSpy('Element.Event custom');
257 var fn = function(anything, type){
258 expect(type).toEqual('customEvent');
261 Element.Events.customEvent = {
265 condition: function(event, type){
275 var div = createElement('div').addEvent('customEvent', callback).inject(document.body);
277 Syn.trigger('click', null, div);
279 expect(callback).toHaveBeenCalled();
280 div.removeEvent('customEvent', callback).destroy();
281 expect(callbacks).toEqual(3);
286 describe('Element.Event.change', function(){
288 it('should not fire "change" for any property', function(){
289 var callback = jasmine.createSpy('Element.Event.change');
291 var radio = new Element('input', {
293 'class': 'someClass',
295 }).addEvent('change', callback).inject(document.body);
297 radio.removeClass('someClass');
298 expect(callback).not.toHaveBeenCalled();
300 var checkbox = new Element('input', {
302 'class': 'someClass',
304 }).addEvent('change', callback).inject(document.body);
306 checkbox.removeClass('someClass');
307 expect(callback).not.toHaveBeenCalled();
309 var text = new Element('input', {
311 'class': 'otherClass',
312 'value': 'text value'
313 }).addEvent('change', callback).inject(document.body);
315 text.removeClass('otherClass');
316 expect(callback).not.toHaveBeenCalled();
318 [radio, checkbox, text].invoke('destroy');
323 describe('Element.Event keyup with f<key>', function(){
325 it('should pass event.key == f2 when pressing f2 on keyup and keydown', function(){
327 var keydown = jasmine.createSpy('keydown');
328 var keyup = jasmine.createSpy('keyup');
330 var div = createElement('div')
331 .addEvent('keydown', function(event){
334 .addEvent('keyup', function(event){
337 .inject(document.body);
339 Syn.trigger('keydown', 'f2', div);
340 Syn.trigger('keyup', 'f2', div);
342 expect(keydown).toHaveBeenCalledWith('f2');
343 expect(keyup).toHaveBeenCalledWith('f2');
351 describe('Element.removeEvent', function(){
353 it('should remove the onunload method', function(){
355 var handler = function(){ text = 'nope'; };
356 window.addEvent('unload', handler);
357 window.removeEvent('unload', handler);
358 window.fireEvent('unload');
359 expect(text).toBe(undefined);