SlideShare a Scribd company logo
1 of 81
Download to read offline
Hell is other browsers - Sartre




     The principles of
unobtrusive JavaScript
                 Peter-Paul Koch (ppk)
                http://quirksmode.org
An Event Apart Boston, June 24th, 2008
Unobtrusive JavaScript
Wikipedia:
“an emerging paradigm in the
JavaScript programming language.”

Me:
it's just a good idea.
Unobtrusive JavaScript
It's not a technique

It's more like a philosophy
for using JavaScript in its context:

usable, accessible, standards-
compliant web pages
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
   - Separate them
   - Connect them
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
   - Separate them
   - Connect them
Separate them

Separation of HTML and CSS:

<div style=”position: relative”>
Separate them

Separation of HTML and CSS:

<div style=”position: relative”>

No inline styles!
Separate them

Separation of HTML and CSS:

<div class=”container”>

div.container {
  position: relative;
}
Separate them

Separation of HTML and JavaScript:

<input onmouseover=”doSomething()” />
Separate them

Separation of HTML and JavaScript:

<input onmouseover=”doSomething()” />

No inline event handlers!
Separate them

Separation of HTML and JavaScript:
<input id=”special” />

$('special').onmouseover =
  function () {
     doSomething();
  }
Separate them

Advantages

- Ease of maintenance
Separate them

Separation of HTML and JavaScript:
<input id=”special” />

$('special').onmouseover =
  function () {
     doSomething();
  }
Separate them

Separation of HTML and JavaScript:
<input id=”special” />

$('special').onmouseover = $('special').onfocus =
  function () {
     doSomething();
  }
Separate them

Advantages

- Ease of maintenance
- The CSS and JavaScript layers can
  be edited simultaneously
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
   - Separate them
   - Connect them
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
   - Separate them
   - Connect them
Connect them

Hooks
Connect them

- id

document.getElementById();
Connect them

- id

document.getElementById('special').
  onmouseover = doSomething;
Connect them

- id

var el = document.getElementById('special');
if (el) {
   el.onmouseover = doSomething;
}

“Is this element available?”
Connect them

- id
- class

getElementsByClassName();
or a library function
Connect them

- id
- class

var els =
document.getElementsByClassName('special')
if (els.length) {
   // go through all elements and do something
}
Connect them

- id
- class

Use the same hook for presentation
and behavior; for CSS and JavaScript.
Connect them
<ol class=”dropdown“>

Now what would this <ol> be?

Surprise:
it's a dropdown menu
Connect them
<ol class=”dropdown“>

The class is a hook for both layers.

ol.dropdown {
   // presentation layer
}
Connect them
<ol class=”dropdown“>

The class is a hook for both layers.

var dropdowns = $('dropdown');
if (dropdowns.length) {
   // initialize behavior layer
}
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
   - Separate them
   - Connect them
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
    - “JavaScript is always available”
   - “Everybody uses a mouse”
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
    - “JavaScript is always available”
   - “Everybody uses a mouse”
JavaScript is always available



           Nonsense!
JavaScript is always available

- Primitive cell phones don't support
  it (sufficiently)

- Speech browsers' support may be
 spotty

- Company networks may filter out
  <script> tags
JavaScript is always available

Make sure that the content and
navigation of the site can be used
without JavaScript.
JavaScript is always available

Make sure that the content and
navigation of the site can be used
without JavaScript.

The page will remain accessible in all
circumstances.
JavaScript is always available

Make sure that the content and
navigation of the site can be used
without JavaScript.

You can use JavaScript for nice
extras, though.
JavaScript is always available

However...

Without JavaScript the page will
become less user-friendly.

Can't be helped.
JavaScript is always available

However...

Without JavaScript the page will
become less user-friendly.

After all, the purpose of JavaScript is
to add interactivity to a page.
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
    - “JavaScript is always available”
   - “Everybody uses a mouse”
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything
    - “JavaScript is always available”
   - “Everybody uses a mouse”
Everybody uses a mouse




          Nonsense!
Device
independence
Take a dropdown menu:

var dropdown = {
  setEventHandlers: function (obj) {
     obj.onmouseover = this.over;
     obj.onmouseout = this.out;
  },
  over: function () {
     // code
  },
  // etc
}
It doesn't work without a mouse.

var dropdown = {
  setEventHandlers: function (obj) {
     obj.onmouseover = this.over;
     obj.onmouseout = this.out;
  },
  over: function () {
     // code
  },
  // etc
}
var dropdown = {
  setEventHandlers: function (obj) {
We need evens that are fired when
     obj.onmouseover = this.over;
the obj.onmouseout = this.out; a link by
     user “enters” or “leaves”
using the keyboard.
  },
  over: function () {
focus code blur
     // and
  },
  // etc
}
var dropdown = {
  setEventHandlers: function (obj) {
     obj.onmouseover = obj.onfocus = this.over;
     obj.onmouseout = obj.onblur = this.out;
  },
  over: function () {
     // code
  },
  // etc
}
Restriction:
var dropdown = { be able to gain the
the object must
  setEventHandlers: function (obj) {
keyboard focus.
      obj.onmouseover = obj.onfocus = this.over;
      obj.onmouseout = obj.onblur = this.out;
- links
  },
- formfunction () {
  over: fields
      // code
    },
    // etc
}
Restriction:
var dropdown = { be able to gain the
the object must
  setEventHandlers: function (obj) {
keyboard focus.
      obj.onmouseover = obj.onfocus = this.over;
      obj.onmouseout = obj.onblur = this.out;
- links
  },
- formfunction () {
  over: fields
     // code
- elements with tabindex
    },
    // etc
}
And what about click?

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

click should be called activate.
And what about click?

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

Restriction:
the object must be able to gain the
keyboard focus.
Click as activate

arrow.onclick = showMenu;
Click as activate

arrow.onclick = showMenu;




1) Mouse click on the arrow
Click as activate

arrow.onclick = showMenu;




1) Mouse click on the arrow
2) a) Keyboard focus on the arrow
Click as activate

arrow.onclick = showMenu;




1) Mouse click on the arrow
2) a) Keyboard focus on the arrow
   b) Space bar on the arrow

That's two actions.
Click as activate

arrow.onclick = arrow.onfocus = showMenu;




1) Mouse click on the arrow
2) Keyboard focus on the arrow
   b) Space bar on the arrow
Click as activate

arrow.onclick = arrow.onfocus = showMenu;




1) Mouse click on the arrow
2) Keyboard focus on the arrow
The next tab will focus on the sub-menu. The
user won't be able to skip it.
Click as activate

arrow.onclick = arrow.onfocus = showMenu;




Generally, keyboard users need more actions
to achieve the same goals as mouse users.

Don't interfere too much. There are reasons for
this behavior, and keyboard users are used to
it.
Separate concepts

Drag-and-drop
uses the mousemove event
Separate concepts

Drag-and-drop
uses the mousemove event

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

it's moving the mouse
Separate concepts

Drag-and-drop
uses the mousemove event

How do we make this accessible?

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

Drag-and-drop

For detecting arrow keys (or other
special keys) we need the keydown
event.

Not keypress. (Doesn't work in IE and
Safari)
Separate concepts

Drag-and-drop

For detecting arrow keys (or other
special keys) we need the keydown
event.

Not keypress. (Doesn't work in IE and
Safari)
Separate concepts

Drag-and-drop

obj.onmousemove =
 obj.onkeydown = moveElement;
Separate concepts

Drag-and-drop

obj.onmousemove =
 obj.onkeydown = moveElement;

Doesn't work.
Separate concepts

Drag-and-drop

obj.onmousemove =
 obj.onkeydown = moveElement;

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

Drag-and-drop

obj.onmousemove =
 obj.onkeydown = moveElement;

The key events expect a keystroke.

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

Drag-and-drop

obj.onmousemove =
 obj.onkeydown = moveElement;

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

Drag-and-drop

obj.onmousemove =
 obj.onkeydown = moveElement;

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

Drag-and-drop

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

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

Drag-and-drop

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

Yes, that's more work.
Separate concepts

Drag-and-drop

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

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

Drag-and-drop

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

Besides, I created a first draft for you.
Separate concepts

Drag-and-drop

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

Besides, I created a first draft for you.
Unobtrusive JavaScript
Two fundamental principles:

1) Separation of structure,
   presentation, and behavior
2) The script doesn't assume
   anything.
Unobtrusive
JavaScript
It's not that hard
Need help?
Chris Heilmann:
http://onlinetools.org/articles/unobtrusivejavascript/
http://icant.co.uk/articles/seven-rules-of-unobtrusive-javascript/


Jeremy Keith:
http://www.alistapart.com/articles/behavioralseparation

and of course quirksmode.org
Questions?

More Related Content

What's hot

Functionality Focused Code Organization
Functionality Focused Code OrganizationFunctionality Focused Code Organization
Functionality Focused Code OrganizationRebecca Murphey
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overviewjeresig
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorialClaude Tech
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Chris Alfano
 
Arquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaArquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaEduardo Shiota Yasuda
 
Ionic tabs template explained
Ionic tabs template explainedIonic tabs template explained
Ionic tabs template explainedRamesh BN
 
Marionette: the Backbone framework
Marionette: the Backbone frameworkMarionette: the Backbone framework
Marionette: the Backbone frameworkfrontendne
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do MoreRemy Sharp
 
jQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't KnowjQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't Knowgirish82
 
Yearning jQuery
Yearning jQueryYearning jQuery
Yearning jQueryRemy Sharp
 
Getting the Most Out of jQuery Widgets
Getting the Most Out of jQuery WidgetsGetting the Most Out of jQuery Widgets
Getting the Most Out of jQuery Widgetsvelveeta_512
 
jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)Addy Osmani
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todaygerbille
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonKris Wallsmith
 
Randomising css animations
Randomising css animationsRandomising css animations
Randomising css animationsasjb
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009Remy Sharp
 
Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Acquia
 
New text documentfsdfs
New text documentfsdfsNew text documentfsdfs
New text documentfsdfsAh Lom
 

What's hot (20)

Drupal, meet Assetic
Drupal, meet AsseticDrupal, meet Assetic
Drupal, meet Assetic
 
Functionality Focused Code Organization
Functionality Focused Code OrganizationFunctionality Focused Code Organization
Functionality Focused Code Organization
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overview
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorial
 
YUI 3
YUI 3YUI 3
YUI 3
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011
 
Arquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaArquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga Escala
 
Ionic tabs template explained
Ionic tabs template explainedIonic tabs template explained
Ionic tabs template explained
 
Marionette: the Backbone framework
Marionette: the Backbone frameworkMarionette: the Backbone framework
Marionette: the Backbone framework
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
 
jQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't KnowjQuery - 10 Time-Savers You (Maybe) Don't Know
jQuery - 10 Time-Savers You (Maybe) Don't Know
 
Yearning jQuery
Yearning jQueryYearning jQuery
Yearning jQuery
 
Getting the Most Out of jQuery Widgets
Getting the Most Out of jQuery WidgetsGetting the Most Out of jQuery Widgets
Getting the Most Out of jQuery Widgets
 
jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of today
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-london
 
Randomising css animations
Randomising css animationsRandomising css animations
Randomising css animations
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
 
Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1
 
New text documentfsdfs
New text documentfsdfsNew text documentfsdfs
New text documentfsdfs
 

Similar to An Event Apart Boston: Principles of Unobtrusive JavaScript

The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuerycolinbdclark
 
WebGL: GPU acceleration for the open web
WebGL: GPU acceleration for the open webWebGL: GPU acceleration for the open web
WebGL: GPU acceleration for the open webpjcozzi
 
Advanced Topics in Continuous Deployment
Advanced Topics in Continuous DeploymentAdvanced Topics in Continuous Deployment
Advanced Topics in Continuous DeploymentMike Brittain
 
Learning jQuery @ MIT
Learning jQuery @ MITLearning jQuery @ MIT
Learning jQuery @ MITjeresig
 
EP2016 - Moving Away From Nodejs To A Pure Python Solution For Assets
EP2016 - Moving Away From Nodejs To A Pure Python Solution For AssetsEP2016 - Moving Away From Nodejs To A Pure Python Solution For Assets
EP2016 - Moving Away From Nodejs To A Pure Python Solution For AssetsAlessandro Molina
 
He stopped using for/while loops, you won't believe what happened next!
He stopped using for/while loops, you won't believe what happened next!He stopped using for/while loops, you won't believe what happened next!
He stopped using for/while loops, you won't believe what happened next!François-Guillaume Ribreau
 
JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...
JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...
JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...JavaScripters Community
 
The Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowAll Things Open
 
Understanding Framework Architecture using Eclipse
Understanding Framework Architecture using EclipseUnderstanding Framework Architecture using Eclipse
Understanding Framework Architecture using Eclipseanshunjain
 
Building Better Web Apps with Angular.js (SXSW 2014)
Building Better Web Apps with Angular.js (SXSW 2014)Building Better Web Apps with Angular.js (SXSW 2014)
Building Better Web Apps with Angular.js (SXSW 2014)kbekessy
 
JavaScript for ASP.NET programmers (webcast) upload
JavaScript for ASP.NET programmers (webcast) uploadJavaScript for ASP.NET programmers (webcast) upload
JavaScript for ASP.NET programmers (webcast) uploadRuss Fustino
 
Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)Gabor Varadi
 
Building a JavaScript Library
Building a JavaScript LibraryBuilding a JavaScript Library
Building a JavaScript Libraryjeresig
 
Zend server 6 using zf2, 2013 webinar
Zend server 6 using zf2, 2013 webinarZend server 6 using zf2, 2013 webinar
Zend server 6 using zf2, 2013 webinarYonni Mendes
 

Similar to An Event Apart Boston: Principles of Unobtrusive JavaScript (20)

The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
 
jQuery UI and Plugins
jQuery UI and PluginsjQuery UI and Plugins
jQuery UI and Plugins
 
WebGL: GPU acceleration for the open web
WebGL: GPU acceleration for the open webWebGL: GPU acceleration for the open web
WebGL: GPU acceleration for the open web
 
Advanced Topics in Continuous Deployment
Advanced Topics in Continuous DeploymentAdvanced Topics in Continuous Deployment
Advanced Topics in Continuous Deployment
 
Learning jQuery @ MIT
Learning jQuery @ MITLearning jQuery @ MIT
Learning jQuery @ MIT
 
EP2016 - Moving Away From Nodejs To A Pure Python Solution For Assets
EP2016 - Moving Away From Nodejs To A Pure Python Solution For AssetsEP2016 - Moving Away From Nodejs To A Pure Python Solution For Assets
EP2016 - Moving Away From Nodejs To A Pure Python Solution For Assets
 
JQuery introduction
JQuery introductionJQuery introduction
JQuery introduction
 
He stopped using for/while loops, you won't believe what happened next!
He stopped using for/while loops, you won't believe what happened next!He stopped using for/while loops, you won't believe what happened next!
He stopped using for/while loops, you won't believe what happened next!
 
JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...
JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...
JavaScripters Event Oct 22, 2016 · 2:00 PM: Common Mistakes made by Angular D...
 
The Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To Know
 
Os Haase
Os HaaseOs Haase
Os Haase
 
Intro to AngularJs
Intro to AngularJsIntro to AngularJs
Intro to AngularJs
 
Understanding Framework Architecture using Eclipse
Understanding Framework Architecture using EclipseUnderstanding Framework Architecture using Eclipse
Understanding Framework Architecture using Eclipse
 
Building Better Web Apps with Angular.js (SXSW 2014)
Building Better Web Apps with Angular.js (SXSW 2014)Building Better Web Apps with Angular.js (SXSW 2014)
Building Better Web Apps with Angular.js (SXSW 2014)
 
JavaScript for ASP.NET programmers (webcast) upload
JavaScript for ASP.NET programmers (webcast) uploadJavaScript for ASP.NET programmers (webcast) upload
JavaScript for ASP.NET programmers (webcast) upload
 
Wt unit 2 ppts client sied technology
Wt unit 2 ppts client sied technologyWt unit 2 ppts client sied technology
Wt unit 2 ppts client sied technology
 
Wt unit 2 ppts client side technology
Wt unit 2 ppts client side technologyWt unit 2 ppts client side technology
Wt unit 2 ppts client side technology
 
Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)
 
Building a JavaScript Library
Building a JavaScript LibraryBuilding a JavaScript Library
Building a JavaScript Library
 
Zend server 6 using zf2, 2013 webinar
Zend server 6 using zf2, 2013 webinarZend server 6 using zf2, 2013 webinar
Zend server 6 using zf2, 2013 webinar
 

More from Peter-Paul Koch

Rethinking the mobile web
Rethinking the mobile webRethinking the mobile web
Rethinking the mobile webPeter-Paul Koch
 
The mobile browser world
The mobile browser worldThe mobile browser world
The mobile browser worldPeter-Paul Koch
 
The future of the mobile web
The future of the mobile webThe future of the mobile web
The future of the mobile webPeter-Paul Koch
 
The mobile browser world
The mobile browser worldThe mobile browser world
The mobile browser worldPeter-Paul Koch
 
The touch events - WebExpo
The touch events - WebExpoThe touch events - WebExpo
The touch events - WebExpoPeter-Paul Koch
 
The Mobile Web - Fronteers 2009
The Mobile Web - Fronteers 2009The Mobile Web - Fronteers 2009
The Mobile Web - Fronteers 2009Peter-Paul Koch
 
State of the Mobile Browsers
State of the Mobile BrowsersState of the Mobile Browsers
State of the Mobile BrowsersPeter-Paul Koch
 
Voices That Matter: JavaScript Events
Voices That Matter: JavaScript EventsVoices That Matter: JavaScript Events
Voices That Matter: JavaScript EventsPeter-Paul Koch
 
The Ajax Experience: State Of The Browsers
The Ajax Experience: State Of The BrowsersThe Ajax Experience: State Of The Browsers
The Ajax Experience: State Of The BrowsersPeter-Paul Koch
 
Google presentation: The Open Web goes mobile
Google presentation: The Open Web goes mobileGoogle presentation: The Open Web goes mobile
Google presentation: The Open Web goes mobilePeter-Paul Koch
 
Yahoo presentation: JavaScript Events
Yahoo presentation: JavaScript EventsYahoo presentation: JavaScript Events
Yahoo presentation: JavaScript EventsPeter-Paul Koch
 

More from Peter-Paul Koch (16)

Rethinking the mobile web
Rethinking the mobile webRethinking the mobile web
Rethinking the mobile web
 
The mobile browser world
The mobile browser worldThe mobile browser world
The mobile browser world
 
The future of the mobile web
The future of the mobile webThe future of the mobile web
The future of the mobile web
 
The mobile browser world
The mobile browser worldThe mobile browser world
The mobile browser world
 
The touch events
The touch eventsThe touch events
The touch events
 
JSON over SMS
JSON over SMSJSON over SMS
JSON over SMS
 
The touch events - WebExpo
The touch events - WebExpoThe touch events - WebExpo
The touch events - WebExpo
 
Samsung
SamsungSamsung
Samsung
 
The touch events
The touch eventsThe touch events
The touch events
 
The Mobile Web - Fronteers 2009
The Mobile Web - Fronteers 2009The Mobile Web - Fronteers 2009
The Mobile Web - Fronteers 2009
 
State of the Mobile Browsers
State of the Mobile BrowsersState of the Mobile Browsers
State of the Mobile Browsers
 
Vodafone Widget Camp
Vodafone Widget CampVodafone Widget Camp
Vodafone Widget Camp
 
Voices That Matter: JavaScript Events
Voices That Matter: JavaScript EventsVoices That Matter: JavaScript Events
Voices That Matter: JavaScript Events
 
The Ajax Experience: State Of The Browsers
The Ajax Experience: State Of The BrowsersThe Ajax Experience: State Of The Browsers
The Ajax Experience: State Of The Browsers
 
Google presentation: The Open Web goes mobile
Google presentation: The Open Web goes mobileGoogle presentation: The Open Web goes mobile
Google presentation: The Open Web goes mobile
 
Yahoo presentation: JavaScript Events
Yahoo presentation: JavaScript EventsYahoo presentation: JavaScript Events
Yahoo presentation: JavaScript Events
 

Recently uploaded

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 

Recently uploaded (20)

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 

An Event Apart Boston: Principles of Unobtrusive JavaScript