SlideShare a Scribd company logo
jQuery and Standards
                  John Resig
 http://ejohn.org/ - http://twitter.com/jeresig
jQuery
✦   A JavaScript library designed to hide
    painful cross-browser compatibility issues
    while presenting a solid, usable, API.
Simple API
✦   $(ā€œdiv > spanā€).addClass(ā€œfooā€);
    ✦ ā€œFind some elementsā€
    ✦ ā€œDo something with themā€

✦   Makes complex manipulation of web pages
    simple
Space
✦   Highly competitive space
✦   Released Jan. 2006 - already a dominant
    player: Prototype JavaScript Library
✦   (Bundled with Ruby on Rails, had some
    nice coattail growth.)
✦   Other libraries: Dojo, Yahoo UI,
    MooTools
jQuery and the W3C
jQuery and the W3C
Specifications
✦   A few specifications that matter to us:
    ✦ DOM
    ✦ HTML
    ✦ CSS
    ✦ ECMAScript

✦   DOM more than anything else.
Concerns
✦   Performance.
✦   Performance.
✦   Performance.
✦   Usability.
✦   Any standards/browser addition that gives
    us performance benefits we’ll leap on.
New Standards We’ve Used
✦   Selectors API
    ✦ querySelectorAll

✦   Selectors API 2
    ✦ matchesSelector

✦   Animation Timing
    ✦ requestAnimationFrame

✦   ECMAScript
    ✦ bind
Selectors API
✦   A bit of a failure
✦   Didn’t listen to the needs of libraries
✦   Missed a number of important features/
    bug fixes:
    ✦ Contextual searching is messed up
    ✦ Error reporting is non-existent
    ✦ Implementations are inconsistent

✦   But it’s very fast, so we use it.
Matches Selector
✦   Selectors API 2 gave us matchesSelector
✦   We petitioned browsers to implement this
✦   They did, then it became a standard
✦   Makes our event delegation much faster
Smooth Animation
✦   requestAnimationFrame was created
✦   Scales animations based upon load
✦   Unfortunately this broke user expectations
    (expected certain frame rates)
✦   We just backed it out, will have to try
    again later
Needs
HTML string -> DOM support
✦   No good way to do this now
✦   Have to create a DOM element and use
    innerHTML
✦   Clunky and quite slow
✦   We want:
    ✦ someMethod(ā€œ<b>stuff</b>ā€) ->
      ✦ [ <b> ]
Access to event callbacks
✦   We want to be able to remove individual
    callbacks
✦   We want to be able to clone callbacks
✦   We want to be able to trigger specific
    callbacks
✦   All of this requires access to callbacks
An event for when stylesheets load
✦   Right now we have an event for DOM
    loaded
✦   And an event for window loaded
✦   But no event for when all the stylesheets
    load (important for looking at computed
    styles)
Will an element fire an event?
✦   For example - if I have a <form> element I
    want to be able to ask it:
    ✦ ā€œWill you ever, natively, trigger a submit
      event?ā€ (true)
✦   If I ask a <div> if it will trigger a submit
    event, it will return false.
Unique ID for DOM nodes
✦   We have to manage callbacks and data that
    we attach to DOM nodes
✦   To do this we have to assign the nodes a
    unique ID
✦   It’d be much better to have a property that
    took care of this for us
ā€œLate Eventsā€
✦   There is no way to ask the browser:
    ✦ ā€œDid an event [foo] already fire on this
      element?ā€
✦   For example:
    ✦ Did the load event already fire on
      window?
    ✦ Did the submit event already fire on this
      form?
    ✦ etc.
Fast DOM mutation events
✦   I know this is being worked on right now
    (yay!)
✦   A way to have fast DOM mutation events
    would be awesome
✦   It could allow for some really slick
    restructuring of applications
✦   And make it easier for us to possibly do
    caching
mouseenter/mouseleave
✦   Internet Explorer provides these events
✦   They’re terribly useful (make it so that you
    don’t have to deal with event bubbling
    weirdness)
✦   Should be in browsers
✦   Need to verify DOM 3 Events spec
getComputedStyle
✦   A complete mess right now
✦   There is no consensus over what results
    should be returned and when
✦   There needs to be something declared
    here - probably a joint venture between
    the CSS and DOM working groups.
✦   Test suite for getComputedStyle
isCSSAuto
✦   There is no way of determining if a CSS
    property is currently set to ā€œautoā€
✦   This should be resolved, makes it much
    easier to do some types of animations
A way to sanely toggle visibility
✦   If we’re given an element that is display:
    none and we want to make it visible
    (display: block, perhaps)
✦   It is very hard to determine what the right
    ā€œvisibleā€ style should be
✦   Especially if someone does:
    ✦ div { display: none; }

✦   Hint: It involves nasty use of iframes
contains() method
✦   We have compareDocumentPosition
✦   This is OK but contains() is very easy to
    use (in IE)
✦   Easy enough to implement, should be a
    standard
Better way of sorting nodes
✦   We have to use
    compareDocumentPosition now
✦   This is very very slow
✦   A numerical index property on nodes
    would be very useful (like in IE)
Is a node in an XML document
✦   A number of behaviors change when you’re
    in an XML document
✦   (IDs no longer resolve, some properties
    may not exist - like innerHTML, etc.)
✦   A way to determine if we’re working
    against an XML document would help
Support Tests
Questions?
✦   Questions?
    ✦ jeresig@gmail.com
    ✦ http://ejohn.org/
    ✦ http://twitter.com/jeresig

More Related Content

PPTX
jQuery Conference Austin Sept 2013
dmethvin
Ā 
PDF
Why and How to Use Virtual DOM
Daiwei Lu
Ā 
KEY
ARTDM 170, Week 3: Rollovers
Gilbert Guerrero
Ā 
PDF
The Onion
Jƶrn Zaefferer
Ā 
PPTX
001. Introduction about React
Binh Quan Duc
Ā 
PPTX
Javascipt
Shreyans Gandhi
Ā 
PDF
Using WordPress as a Backend for Your React Project
Adam Rasheed
Ā 
PDF
Beyond the Standards
Paul Bakaus
Ā 
jQuery Conference Austin Sept 2013
dmethvin
Ā 
Why and How to Use Virtual DOM
Daiwei Lu
Ā 
ARTDM 170, Week 3: Rollovers
Gilbert Guerrero
Ā 
The Onion
Jƶrn Zaefferer
Ā 
001. Introduction about React
Binh Quan Duc
Ā 
Javascipt
Shreyans Gandhi
Ā 
Using WordPress as a Backend for Your React Project
Adam Rasheed
Ā 
Beyond the Standards
Paul Bakaus
Ā 

What's hot (20)

PDF
jQuery in the [Aol.] Enterprise
Dave Artz
Ā 
PPTX
Cross-platform JavaScript
Hristo Chakarov
Ā 
PDF
Saigon Ruby Meetup 06/10/2015 - Changeful Gem
Futureworkz
Ā 
ZIP
Contextual jQuery
Doug Neiner
Ā 
PDF
Smooth Animations for Web & Hybrid
FITC
Ā 
PPTX
JS digest. April 2018
ElifTech
Ā 
PPTX
Lesson 203 18 sep13-1500-ay
Codecademy Ren
Ā 
KEY
New Perspectives on Performance
mennovanslooten
Ā 
PDF
jQuery Conference San Diego 2014 - Web Performance
dmethvin
Ā 
PDF
Intro to jQuery @ Startup Institute
Rafael Gonzaque
Ā 
PDF
Stripe con 2021 UI stack
MaximeRainville1
Ā 
PPT
Java script202
Wasiq Zia
Ā 
PPTX
Unobtrusive js
bretticus
Ā 
PDF
Understanding Page Load / Ziling Zhao (Google)
Ontico
Ā 
PPT
AngularJS for Legacy Apps
Peter Drinnan
Ā 
PPT
Angularjs for kolkata drupal meetup
Goutam Dey
Ā 
PDF
Web workers and service workers
Nitish Phanse
Ā 
PPTX
ReactJS Code Impact
Raymond McDermott
Ā 
PPTX
HTML5 Web Workers-unleashed
Peter Lubbers
Ā 
PDF
HTML5+CSS3 (兄門編)
博史 高木
Ā 
jQuery in the [Aol.] Enterprise
Dave Artz
Ā 
Cross-platform JavaScript
Hristo Chakarov
Ā 
Saigon Ruby Meetup 06/10/2015 - Changeful Gem
Futureworkz
Ā 
Contextual jQuery
Doug Neiner
Ā 
Smooth Animations for Web & Hybrid
FITC
Ā 
JS digest. April 2018
ElifTech
Ā 
Lesson 203 18 sep13-1500-ay
Codecademy Ren
Ā 
New Perspectives on Performance
mennovanslooten
Ā 
jQuery Conference San Diego 2014 - Web Performance
dmethvin
Ā 
Intro to jQuery @ Startup Institute
Rafael Gonzaque
Ā 
Stripe con 2021 UI stack
MaximeRainville1
Ā 
Java script202
Wasiq Zia
Ā 
Unobtrusive js
bretticus
Ā 
Understanding Page Load / Ziling Zhao (Google)
Ontico
Ā 
AngularJS for Legacy Apps
Peter Drinnan
Ā 
Angularjs for kolkata drupal meetup
Goutam Dey
Ā 
Web workers and service workers
Nitish Phanse
Ā 
ReactJS Code Impact
Raymond McDermott
Ā 
HTML5 Web Workers-unleashed
Peter Lubbers
Ā 
HTML5+CSS3 (兄門編)
博史 高木
Ā 
Ad

Similar to jQuery and the W3C (20)

PDF
Advanced guide to develop ajax applications using dojo
Fu Cheng
Ā 
PDF
In the DOM, no one will hear you scream
Mario Heiderich
Ā 
PDF
fuser interface-development-using-jquery
Kostas Mavridis
Ā 
PDF
jQuery for beginners
Siva Arunachalam
Ā 
KEY
User Interface Development with jQuery
colinbdclark
Ā 
PDF
Advancing JavaScript with Libraries (Yahoo Tech Talk)
jeresig
Ā 
PPTX
WEB TECHNOLOGY Unit-4.pptx
karthiksmart21
Ā 
PDF
jQuery Features to Avoid
dmethvin
Ā 
PPTX
JavaScript!
RTigger
Ā 
PDF
Web Components v1
Mike Wilcox
Ā 
PDF
JavaScript - Chapter 12 - Document Object Model
WebStackAcademy
Ā 
PDF
Introduction to jQuery
Nagaraju Sangam
Ā 
PPTX
Learning About JavaScript (…and its little buddy, JQuery!)
Julie Meloni
Ā 
PPT
Document_Object_Model_in_javaScript..................................ppt
rahamatmandal2005
Ā 
PPTX
Art of Javascript
Tarek Yehia
Ā 
PPT
Jquery
Girish Srivastava
Ā 
PPTX
Iniciando com jquery
Danilo Sousa
Ā 
PPTX
Getting Started with jQuery
Akshay Mathur
Ā 
KEY
An in-depth look at jQuery
Paul Bakaus
Ā 
PPTX
025444215.pptx
RiyaJenner1
Ā 
Advanced guide to develop ajax applications using dojo
Fu Cheng
Ā 
In the DOM, no one will hear you scream
Mario Heiderich
Ā 
fuser interface-development-using-jquery
Kostas Mavridis
Ā 
jQuery for beginners
Siva Arunachalam
Ā 
User Interface Development with jQuery
colinbdclark
Ā 
Advancing JavaScript with Libraries (Yahoo Tech Talk)
jeresig
Ā 
WEB TECHNOLOGY Unit-4.pptx
karthiksmart21
Ā 
jQuery Features to Avoid
dmethvin
Ā 
JavaScript!
RTigger
Ā 
Web Components v1
Mike Wilcox
Ā 
JavaScript - Chapter 12 - Document Object Model
WebStackAcademy
Ā 
Introduction to jQuery
Nagaraju Sangam
Ā 
Learning About JavaScript (…and its little buddy, JQuery!)
Julie Meloni
Ā 
Document_Object_Model_in_javaScript..................................ppt
rahamatmandal2005
Ā 
Art of Javascript
Tarek Yehia
Ā 
Iniciando com jquery
Danilo Sousa
Ā 
Getting Started with jQuery
Akshay Mathur
Ā 
An in-depth look at jQuery
Paul Bakaus
Ā 
025444215.pptx
RiyaJenner1
Ā 
Ad

More from jeresig (20)

PDF
Does Coding Every Day Matter?
jeresig
Ā 
PDF
Accidentally Becoming a Digital Librarian
jeresig
Ā 
PDF
2014: John's Favorite Thing (Neo4j)
jeresig
Ā 
PDF
Computer Vision as Art Historical Investigation
jeresig
Ā 
PDF
Hacking Art History
jeresig
Ā 
PDF
Using JS to teach JS at Khan Academy
jeresig
Ā 
PDF
Applying Computer Vision to Art History
jeresig
Ā 
PDF
NYARC 2014: Frick/Zeri Results
jeresig
Ā 
PDF
EmpireJS: Hacking Art with Node js and Image Analysis
jeresig
Ā 
PDF
Applying Computer Vision to Art History
jeresig
Ā 
PDF
JavaScript Libraries (Ajax Exp 2006)
jeresig
Ā 
PDF
Introduction to jQuery (Ajax Exp 2006)
jeresig
Ā 
PDF
jQuery Recommendations to the W3C (2011)
jeresig
Ā 
PDF
jQuery Open Source Process (RIT 2011)
jeresig
Ā 
PDF
jQuery Open Source Process (Knight Foundation 2011)
jeresig
Ā 
PDF
jQuery Mobile
jeresig
Ā 
PDF
jQuery Open Source (Fronteer 2011)
jeresig
Ā 
PDF
Holistic JavaScript Performance
jeresig
Ā 
PDF
New Features Coming in Browsers (RIT '09)
jeresig
Ā 
PDF
Introduction to jQuery (Ajax Exp 2007)
jeresig
Ā 
Does Coding Every Day Matter?
jeresig
Ā 
Accidentally Becoming a Digital Librarian
jeresig
Ā 
2014: John's Favorite Thing (Neo4j)
jeresig
Ā 
Computer Vision as Art Historical Investigation
jeresig
Ā 
Hacking Art History
jeresig
Ā 
Using JS to teach JS at Khan Academy
jeresig
Ā 
Applying Computer Vision to Art History
jeresig
Ā 
NYARC 2014: Frick/Zeri Results
jeresig
Ā 
EmpireJS: Hacking Art with Node js and Image Analysis
jeresig
Ā 
Applying Computer Vision to Art History
jeresig
Ā 
JavaScript Libraries (Ajax Exp 2006)
jeresig
Ā 
Introduction to jQuery (Ajax Exp 2006)
jeresig
Ā 
jQuery Recommendations to the W3C (2011)
jeresig
Ā 
jQuery Open Source Process (RIT 2011)
jeresig
Ā 
jQuery Open Source Process (Knight Foundation 2011)
jeresig
Ā 
jQuery Mobile
jeresig
Ā 
jQuery Open Source (Fronteer 2011)
jeresig
Ā 
Holistic JavaScript Performance
jeresig
Ā 
New Features Coming in Browsers (RIT '09)
jeresig
Ā 
Introduction to jQuery (Ajax Exp 2007)
jeresig
Ā 

Recently uploaded (20)

PDF
Enable Enterprise-Ready Security on IBM i Systems.pdf
Precisely
Ā 
PPTX
The Power of IoT Sensor Integration in Smart Infrastructure and Automation.pptx
Rejig Digital
Ā 
PDF
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
Ā 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
Ā 
PDF
Make GenAI investments go further with the Dell AI Factory - Infographic
Principled Technologies
Ā 
PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
Ā 
PPTX
How to Build a Scalable Micro-Investing Platform in 2025 - A Founder’s Guide ...
Third Rock Techkno
Ā 
PDF
CIFDAQ'S Market Insight: BTC to ETH money in motion
CIFDAQ
Ā 
PDF
Software Development Methodologies in 2025
KodekX
Ā 
PDF
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
Ā 
PDF
Why Your AI & Cybersecurity Hiring Still Misses the Mark in 2025
Virtual Employee Pvt. Ltd.
Ā 
PPTX
Smart Infrastructure and Automation through IoT Sensors
Rejig Digital
Ā 
PDF
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
Ā 
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
AVTRON Technologies LLC
Ā 
PDF
Google’s NotebookLM Unveils Video Overviews
SOFTTECHHUB
Ā 
DOCX
Top AI API Alternatives to OpenAI: A Side-by-Side Breakdown
vilush
Ā 
PDF
Test Bank, Solutions for Java How to Program, An Objects-Natural Approach, 12...
famaw19526
Ā 
PDF
CIFDAQ's Teaching Thursday: Moving Averages Made Simple
CIFDAQ
Ā 
PDF
Cloud-Migration-Best-Practices-A-Practical-Guide-to-AWS-Azure-and-Google-Clou...
Artjoker Software Development Company
Ā 
PDF
BLW VOCATIONAL TRAINING SUMMER INTERNSHIP REPORT
codernjn73
Ā 
Enable Enterprise-Ready Security on IBM i Systems.pdf
Precisely
Ā 
The Power of IoT Sensor Integration in Smart Infrastructure and Automation.pptx
Rejig Digital
Ā 
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
Ā 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
Ā 
Make GenAI investments go further with the Dell AI Factory - Infographic
Principled Technologies
Ā 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
Ā 
How to Build a Scalable Micro-Investing Platform in 2025 - A Founder’s Guide ...
Third Rock Techkno
Ā 
CIFDAQ'S Market Insight: BTC to ETH money in motion
CIFDAQ
Ā 
Software Development Methodologies in 2025
KodekX
Ā 
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
Ā 
Why Your AI & Cybersecurity Hiring Still Misses the Mark in 2025
Virtual Employee Pvt. Ltd.
Ā 
Smart Infrastructure and Automation through IoT Sensors
Rejig Digital
Ā 
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
Ā 
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
AVTRON Technologies LLC
Ā 
Google’s NotebookLM Unveils Video Overviews
SOFTTECHHUB
Ā 
Top AI API Alternatives to OpenAI: A Side-by-Side Breakdown
vilush
Ā 
Test Bank, Solutions for Java How to Program, An Objects-Natural Approach, 12...
famaw19526
Ā 
CIFDAQ's Teaching Thursday: Moving Averages Made Simple
CIFDAQ
Ā 
Cloud-Migration-Best-Practices-A-Practical-Guide-to-AWS-Azure-and-Google-Clou...
Artjoker Software Development Company
Ā 
BLW VOCATIONAL TRAINING SUMMER INTERNSHIP REPORT
codernjn73
Ā 

jQuery and the W3C

  • 1. jQuery and Standards John Resig http://ejohn.org/ - http://twitter.com/jeresig
  • 2. jQuery ✦ A JavaScript library designed to hide painful cross-browser compatibility issues while presenting a solid, usable, API.
  • 3. Simple API ✦ $(ā€œdiv > spanā€).addClass(ā€œfooā€); ✦ ā€œFind some elementsā€ ✦ ā€œDo something with themā€ ✦ Makes complex manipulation of web pages simple
  • 4. Space ✦ Highly competitive space ✦ Released Jan. 2006 - already a dominant player: Prototype JavaScript Library ✦ (Bundled with Ruby on Rails, had some nice coattail growth.) ✦ Other libraries: Dojo, Yahoo UI, MooTools
  • 7. Specifications ✦ A few specifications that matter to us: ✦ DOM ✦ HTML ✦ CSS ✦ ECMAScript ✦ DOM more than anything else.
  • 8. Concerns ✦ Performance. ✦ Performance. ✦ Performance. ✦ Usability. ✦ Any standards/browser addition that gives us performance benefits we’ll leap on.
  • 9. New Standards We’ve Used ✦ Selectors API ✦ querySelectorAll ✦ Selectors API 2 ✦ matchesSelector ✦ Animation Timing ✦ requestAnimationFrame ✦ ECMAScript ✦ bind
  • 10. Selectors API ✦ A bit of a failure ✦ Didn’t listen to the needs of libraries ✦ Missed a number of important features/ bug fixes: ✦ Contextual searching is messed up ✦ Error reporting is non-existent ✦ Implementations are inconsistent ✦ But it’s very fast, so we use it.
  • 11. Matches Selector ✦ Selectors API 2 gave us matchesSelector ✦ We petitioned browsers to implement this ✦ They did, then it became a standard ✦ Makes our event delegation much faster
  • 12. Smooth Animation ✦ requestAnimationFrame was created ✦ Scales animations based upon load ✦ Unfortunately this broke user expectations (expected certain frame rates) ✦ We just backed it out, will have to try again later
  • 13. Needs
  • 14. HTML string -> DOM support ✦ No good way to do this now ✦ Have to create a DOM element and use innerHTML ✦ Clunky and quite slow ✦ We want: ✦ someMethod(ā€œ<b>stuff</b>ā€) -> ✦ [ <b> ]
  • 15. Access to event callbacks ✦ We want to be able to remove individual callbacks ✦ We want to be able to clone callbacks ✦ We want to be able to trigger specific callbacks ✦ All of this requires access to callbacks
  • 16. An event for when stylesheets load ✦ Right now we have an event for DOM loaded ✦ And an event for window loaded ✦ But no event for when all the stylesheets load (important for looking at computed styles)
  • 17. Will an element fire an event? ✦ For example - if I have a <form> element I want to be able to ask it: ✦ ā€œWill you ever, natively, trigger a submit event?ā€ (true) ✦ If I ask a <div> if it will trigger a submit event, it will return false.
  • 18. Unique ID for DOM nodes ✦ We have to manage callbacks and data that we attach to DOM nodes ✦ To do this we have to assign the nodes a unique ID ✦ It’d be much better to have a property that took care of this for us
  • 19. ā€œLate Eventsā€ ✦ There is no way to ask the browser: ✦ ā€œDid an event [foo] already fire on this element?ā€ ✦ For example: ✦ Did the load event already fire on window? ✦ Did the submit event already fire on this form? ✦ etc.
  • 20. Fast DOM mutation events ✦ I know this is being worked on right now (yay!) ✦ A way to have fast DOM mutation events would be awesome ✦ It could allow for some really slick restructuring of applications ✦ And make it easier for us to possibly do caching
  • 21. mouseenter/mouseleave ✦ Internet Explorer provides these events ✦ They’re terribly useful (make it so that you don’t have to deal with event bubbling weirdness) ✦ Should be in browsers ✦ Need to verify DOM 3 Events spec
  • 22. getComputedStyle ✦ A complete mess right now ✦ There is no consensus over what results should be returned and when ✦ There needs to be something declared here - probably a joint venture between the CSS and DOM working groups. ✦ Test suite for getComputedStyle
  • 23. isCSSAuto ✦ There is no way of determining if a CSS property is currently set to ā€œautoā€ ✦ This should be resolved, makes it much easier to do some types of animations
  • 24. A way to sanely toggle visibility ✦ If we’re given an element that is display: none and we want to make it visible (display: block, perhaps) ✦ It is very hard to determine what the right ā€œvisibleā€ style should be ✦ Especially if someone does: ✦ div { display: none; } ✦ Hint: It involves nasty use of iframes
  • 25. contains() method ✦ We have compareDocumentPosition ✦ This is OK but contains() is very easy to use (in IE) ✦ Easy enough to implement, should be a standard
  • 26. Better way of sorting nodes ✦ We have to use compareDocumentPosition now ✦ This is very very slow ✦ A numerical index property on nodes would be very useful (like in IE)
  • 27. Is a node in an XML document ✦ A number of behaviors change when you’re in an XML document ✦ (IDs no longer resolve, some properties may not exist - like innerHTML, etc.) ✦ A way to determine if we’re working against an XML document would help
  • 29. Questions? ✦ Questions? ✦ [email protected] ✦ http://ejohn.org/ ✦ http://twitter.com/jeresig