javascript events - quirks mode · 2009-04-28 · works in all browsers. dropdown menu problem:...

95
JavaScript Events Peter-Paul Koch (ppk) http://quirksmode.org http://twitter.com/ppk Voices that Matter, 28 April 2009 Hell is other browsers - Sartre

Upload: others

Post on 12-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

JavaScript EventsPeter-Paul Koch (ppk)

http://quirksmode.orghttp://twitter.com/ppk

Voices that Matter, 28 April 2009

Hell is other browsers - Sartre

Page 2: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,
Page 3: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

http://quirksmode.org/dom/events/

Page 4: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Mouseover

and friends

Page 5: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

The mouseover event fires when the user's mouse enters an element .

The mouseout event fires when the user's mouse leaves an element.

Perfect support

Page 6: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh /><ul>

<li><a href=”#”>Multimedialize</a><ul>

<li><a href=”#”>Sound</a></li><li><a href=”#”>Java applets</a></li>

</ul></li><li><a href=”#”>Ajaxify</a>

<ul><li><a href=”#”>Web 2.0</a></li><li><a href=”#”>Web 3.0</a></li><li><a href=”#”>Web 4.0b</a></li>

</ul></li></ul>

Page 7: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Page 8: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Page 9: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Event bubbling has advantages.

var dropdown = {init: function (dropdown) {

var x = dropdown.getElementsByTagName('a');for (var i=0;i<x.length;i++) {

x[i].onmouseover = mouseOver;x[i].onmouseout = mouseOut;

}}

}

Page 10: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Event bubbling has advantages.

var dropdown = {init: function (dropdown) {

var x = dropdown.getElementsByTagName('a');for (var i=0;i<x.length;i++) {

x[i].onmouseover = mouseOver;x[i].onmouseout = mouseOut;

}}

}

Page 11: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Event bubbling has advantages.

var dropdown = {init: function (dropdown) {

}}

We don't do this any more. Instead we use event delegation.

Page 12: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = mouseOver;dropdown.onmouseout = mouseOut;

}}

The event bubbles up to the <ul> anyway.

So why not handle it at that level?

Saves a lot of event handlers.

Page 13: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = mouseOver;dropdown.onmouseout = mouseOut;

}}

Works in all browsers.

Page 14: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Problem: Every mouseover or mouseout event bubbles up.

Page 15: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Page 16: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

a.mouseovera.mouseout and a.mouseovera.mouseout and a.mouseovera.mouseout

Fun! Event bubbling works. As does event delegation.

Page 17: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

a.mouseovera.mouseout and a.mouseovera.mouseout and a.mouseovera.mouseout

But has the mouse left the submenu or not?!

Page 18: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

},mouseOut: function (e) {

if (this mouseout is important) {this.closeSubMenu();

}}

}

Page 19: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

},mouseOut: function (e) {

if (this mouseout is important) {this.closeSubMenu();

}}

}Development time: about 10 minutes

Page 20: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

},mouseOut: function (e) {

if (this mouseout is important) {this.closeSubMenu();

}}

}Development time: about 2 days

Page 21: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

How do we do this?

onmouseout, find out which element the mouse goes to.

If that element is not a part of the submenu, fold the submenu.

Page 22: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

How do we do this?

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

Page 23: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Find the element the mouse goes to.

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

Page 24: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Find the element the mouse goes to.

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

Page 25: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Find the element the mouse goes to.

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

Page 26: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

See whether that element is contained by the submenu.

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

Page 27: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

See whether that element is contained by the submenu.

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

Page 28: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

mouseOut: function (e) {e = e || window.event;var el = e.relatedTarget || e.toElement;if (!submenu.contains(el)) {

this.closeSubMenu();}

}

That's it, right?

<grin type=”evil” />

Page 29: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

Wrong!

Suppose someone doesn't use a mouse at all,

but the keyboard

how does the menu fold out?

Page 30: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Deviceindependence

Page 31: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

}}

Page 32: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

}}

Doesn't work without a mouse.

Page 33: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

}}

We need events that tell us whether the user enters or leaves a link.focus and blur

Page 34: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = dropdown.onfocus = this.mouseOver;

dropdown.onmouseout = dropdown.onblur = this.mouseOut;

}}

Page 35: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = dropdown.onfocus = this.mouseOver;

dropdown.onmouseout = dropdown.onblur = this.mouseOut;

}}

Doesn't work.

Page 36: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = dropdown.onfocus = this.mouseOver;

dropdown.onmouseout = dropdown.onblur = this.mouseOut;

}}

Focus and blur don't bubble.

Page 37: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

To bubble or not to bubble

Two kinds of events:1) Mouse and key events2) Interface events

Page 38: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

To bubble or not to bubble

Two kinds of events:1) Mouse and key events2) Interface events

Fire when the user initiates a device-specific action.mouseover, mouseout, click, keydown, keypress

Page 39: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

To bubble or not to bubble

Two kinds of events:1) Mouse and key events2) Interface events

In general they bubble

Page 40: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

To bubble or not to bubble

Two kinds of events:1) Mouse and key events2) Interface events

Fire when a certain event takes place, regardless of how it was initialised.load, change, submit, focus, blur

Page 41: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

To bubble or not to bubble

Two kinds of events:1) Mouse and key events2) Interface events

Generally don't bubble

Page 42: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;

}}

Page 43: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;var x = dropdown.getElementsByTagName('li');for (var i=0;i<x.length;i++) {

x[i].onfocus = this.mouseOver;x[i].onblur = this.mouseOut;

}}

}

Page 44: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;var x = dropdown.getElementsByTagName('li');for (var i=0;i<x.length;i++) {

x[i].onfocus = this.mouseOver;x[i].onblur = this.mouseOut;

}}

}Doesn't work.

Page 45: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

The HTML elements must be able to receive the keyboard focus.

- links- form fields

Page 46: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

The HTML elements must be able to receive the keyboard focus.

- links- form fields- elements with tabindex

Page 47: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;var x = dropdown.getElementsByTagName('li');for (var i=0;i<x.length;i++) {

x[i].onfocus = this.mouseOver;x[i].onblur = this.mouseOut;

}}

}

Page 48: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;var x = dropdown.getElementsByTagName('a');for (var i=0;i<x.length;i++) {

x[i].onfocus = this.mouseOver;x[i].onblur = this.mouseOut;

}}

}

Page 49: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Dropdown menu <sigh />

var dropdown = {init: function (dropdown) {

dropdown.onmouseover = this.mouseOver;dropdown.onmouseout = this.mouseOut;var x = dropdown.getElementsByTagName('a');for (var i=0;i<x.length;i++) {

x[i].onfocus = this.mouseOver;x[i].onblur = this.mouseOut;

}}

}

Page 50: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Event delegation

So we're stuck with setting a focus and blur event on every single link.

Or are we ... ?

In my recent Yahoo! presentation I give an outline of the solution.http://yuiblog.com/blog/2009/04/27/video-ppk-jsevents/

Page 51: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

More deviceindependence

Page 52: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

And what about click?

We're in luck: click also fires when the user activates an element by keyboard.

Restriction: the element must be able to receive the keyboard focus

Page 53: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-dropuses the mousemove event

Page 54: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-dropuses the mousemove event

and if there's one thing that's impossible to emulate with the keyboard

it's moving the mouse

Page 55: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-dropuses the mousemove event

How do we make this keyboard accessible?

By allowing the user to use the arrow keys.Key events.

Page 56: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

The key events

Page 57: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

keydownWhen a key is depressed.

Repeats.keypress

keyup

Page 58: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

keydownWhen a key is depressed.

Repeats.keypress

When a character key is depressed.

Repeats.keyup

Page 59: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

keydownWhen a key is depressed.

Repeats.keypress

When a character key is depressed.

Repeats.keyup

When a key is released.

Page 60: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

keydown and keypress

Page 61: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

keydown only

Page 62: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Originally this theory was created by Microsoft.

Safari has copied it.

It's the only theory; Firefox and Opera just fire some random events.

Page 63: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

keydownWhen a key is depressed.

Repeats.keypress

When a character key is depressed. Repeats.

Page 64: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Which key did my user press?

el.onkeydown = function (e) {e = e || window.event;var realKey = e.keyCode;

}

Page 65: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Which key did my user press?

el.onkeydown = function (e) {e = e || window.event;var realKey = e.keyCode;

}

Page 66: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Back to the drag-and-drop

Page 67: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

We need the keydown event, because arrow keys are special keys.

Page 68: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

obj.onmousemove = obj.onkeydown = moveElement;

Page 69: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

obj.onmousemove = obj.onkeydown = moveElement;

Doesn't work.

Page 70: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

obj.onmousemove = obj.onkeydown = moveElement;

Mousemove expects mouse coordinates.The layer moves to these coordinates.

Page 71: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

obj.onmousemove = obj.onkeydown = moveElement;

The key events expect a keystroke.

Page 72: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

obj.onkeydown = function (e) {e = e || window.event;var key = e.keyCode;switch (key) {

case 37: // leftcase 38: // upcase 39: // rightcase 40: // down

return false;default:

return true;}

}

Page 73: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

But what does “user hits right arrow once” mean?

10px? 50px?“Move to next receptor element?”Something else that fits your interface?

Page 74: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

We have to program for two totally different situations.We need separate scripts.

obj.onmousemove = moveByMouse;obj.onkeydown = moveByKeys;

Page 75: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

Yes, that's more work.

But if you do it right you've got a generic drag and drop module you can use anywhere.

Page 76: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Separate concepts

Drag-and-drop

Besides, I created a first draft for you.

http://quirksmode.org/js/dragdrop.html

Page 77: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,
Page 78: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

change

Page 79: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

The change event fires when the value of a form field is changed.

This could be a very useful event; after all it fires only when the user actually changes somethinginstead of whenever he focuses on a form field

Page 80: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Page 81: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

focus

blur

No change event. The value hasn't been modified.

Page 82: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

focus

blur

Change event. The value has been modified.

Page 83: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Mouse:

Click on select

Page 84: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Mouse:

Click on new optionCHANGE

Page 85: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Keyboard:

focus

Focus on select

Page 86: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Keyboard:

focus arrow

Arrow keys to move to other optionCHANGE

Page 87: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Arrow keys to move to other optionCHANGE

This is a BUG!

Page 88: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Keyboard:

focus arrow

Arrow keys to move to other option

Page 89: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

Keyboard:

focus arrow blur

Blur select box.CHANGE

Page 90: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

click

CHANGE when the checked property changes.

Page 91: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

click

...

Page 92: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

click blur

CHANGE when the element loses the focus.

Page 93: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

- text fields- select boxes- checkboxes and radios

CHANGE when the element loses the focus.

This is a BUG!

Page 94: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

http://quirksmode.org/dom/events/

Page 95: JavaScript Events - Quirks Mode · 2009-04-28 · Works in all browsers. Dropdown menu  Problem: Every mouseover or mouseout event bubbles up. ... load, change, submit,

Questions?

Ask away.

Or ask me on Twitterhttp://twitter.com/ppkor on my sitehttp://quirksmode.org