SlideShare uma empresa Scribd logo
1 de 202
Adding Interactivity to
   your Plone Site
Me
Me
• Eric Steele
Me
• Eric Steele
 • Programmer @ WebLion
Me
• Eric Steele
 • Programmer @ WebLion
 • Plone Products
Me
• Eric Steele
 • Programmer @ WebLion
 • Plone Products
   • Faculty/Staff Directory
Me
• Eric Steele
 • Programmer @ WebLion
 • Plone Products
   • Faculty/Staff Directory
   • GloWorm
Me
• Eric Steele
 • Programmer @ WebLion
 • Plone Products
   • Faculty/Staff Directory
   • GloWorm
 • Plone 4 release manager
Adding Interactivity to
   your Plone Site
or...
I Suck at JavaScript...
   and So Can You
I Suck at JavaScript...
   and So Can You
          ~
I Suck at JavaScript...
   and So Can You
               ~
 A half-assed guide to interactive
            JavaScript
The Stuff
The Stuff
• The Boring Stuff
  • Resources
The Stuff
• The Boring Stuff   • The Fun Stuff
  • Resources          • KSS
                       • jQuery
Resources
Resources

• JavaScript
• CSS
• KSS
Including JavaScripts
<tal:block metal:fill-slot="javascript_head_slot">
  <script type="text/javascript" src="myscript.js" />
</tal:block>
Including JavaScripts
<tal:block metal:fill-slot="javascript_head_slot">
  <script type="text/javascript" src="myscript.js" />
</tal:block>




• Only need script on one page/template
Including JavaScripts
<tal:block metal:fill-slot="javascript_head_slot">
  <script type="text/javascript" src="myscript.js" />
</tal:block>




• Only need script on one page/template
• Performance isn’t an issue
Resource Registries
Resource Registries
Resource Registries

• Control inclusion, order
Resource Registries

• Control inclusion, order
• Automatic merging, compression
Resource Registries

• Control inclusion, order
• Automatic merging, compression
• Improved cacheability
Generic Setup
                             jsregistry.xml
<?xml version="1.0"?>
<object name="portal_javascripts">

 <javascript cacheable="True" compression="safe" cookable="True"
enabled="True"
   expression="" id="myscripts.js" inline="False"
   insert-after="dropdown.js"/>

</object>
External Scripts
External Scripts
<javascript ... id="http://ajax.googleapis.com/
ajax/libs/jquery/1.2.6/jquery.min.js" ... />
External Scripts
<javascript ... id="http://ajax.googleapis.com/
ajax/libs/jquery/1.2.6/jquery.min.js" ... />


• New in Plone 3.3
External Scripts
<javascript ... id="http://ajax.googleapis.com/
ajax/libs/jquery/1.2.6/jquery.min.js" ... />


• New in Plone 3.3
• Include JavaScript from external sources
Google AJAX Libraries
Google AJAX Libraries
 http://code.google.com/apis/ajaxlibs/
Google AJAX Libraries
     http://code.google.com/apis/ajaxlibs/

•   jQuery                 •   Dojo

•   jQuery UI              •   SWFObjectNew

•   Prototype              •   Yahoo! User Interface
                               Library (YUI)
•   script.aculo.us

•   MooTools
Browser Resources
Browser Resources
•   Component Architecture (Zope 3) way of defining
    resources
Browser Resources
Browser Resources
  <browser:resource
      name="myscript.js"
      image="myscript.js"
      />
Browser Resources
       <browser:resource
           name="myscript.js"
           image="myscript.js"
           />


http://myplonesite/++resource++myscript.js
Browser Resources
<?xml version="1.0"?>
                             jsregistry.xml
<object name="portal_javascripts">

 <javascript cacheable="True" compression="safe" cookable="True"
enabled="True"
   expression="" id="++resource++myscript.js" inline="False"
   insert-after="dropdown.js"/>

</object>
Browser Resources
Browser Resources
<browser:resource
    name="myscript.js"
    image="myscript.js"
    for="..interfaces.IMyCustomType”
    />
Browser Resources
<browser:resource
    name="myscript.js"
    image="myscript.js"
    for="..interfaces.IMyCustomType”
    />
<browser:resource
    name="myscript.js"
    image="myscript.js"
    layer="..interfaces.IMySkinLayer”
    />
Browser Resources
Browser Resources
<browser:resourceDirectory
      name="myResources"
     directory="stuff" />
Browser Resources
       <browser:resourceDirectory
             name="myResources"
            directory="stuff" />

http://myplonesite/++resource++myResources/
checkout.png
JavaScript Libraries
A JavaScript library is a library of
pre-written JavaScript controls which
allow for easier development of
JavaScript-based applications, especially
for AJAX and other web-centric
technologies.
    http://en.wikipedia.org/wiki/JavaScript_library
Why?
Why?

• Save time
Why?

• Save time
• Reuse existing code
Why?

• Save time
• Reuse existing code
• You don’t need to be an expert
Why?

• Save time
• Reuse existing code
• You don’t need to be an expert
• Browser “quirks”
Two Types


• Easy
• “Right”
KSS
KSS

• “Kinetic Style Sheets”
• JavaScript/AJAX framework
• Declare behaviors using CSS format
• Built into Plone 3.0+
• Also works with Grok, Pylons, Django
KSS Rules

#mykssbutton:click {
  action-client: alert;
  alert-message: ‘Hello World!’;
}
KSS Rules
CSS Selector
    #mykssbutton:click {
      action-client: alert;
      alert-message: ‘Hello World!’;
    }
KSS Rules
Action Type
   #mykssbutton:click {
     action-client: alert;
     alert-message: ‘Hello World!’;
   }
KSS Rules
             Action

#mykssbutton:click {
  action-client: alert;
  alert-message: ‘Hello World!’;
}
KSS Rules
          Action Parameter
#mykssbutton:click {
  action-client: alert;
  alert-message: ‘Hello World!’;
}          name         value
KSS Rules

evt-click-preventdefault: True;
KSS Rules
        #mykssbutton:click {
          evt-click-preventdefault: True;
          action-client: alert;
          alert-message: ‘Hello World!’;
        }
<a href=”front-page” id=”mykssbutton”>Click me!
</a>
`
Client Actions
Client Actions
• alert
Client Actions
• alert
• addClass / removeClass / toggleClass
Client Actions
• alert
• addClass / removeClass / toggleClass
• setAttribute
Client Actions
• alert
• addClass / removeClass / toggleClass
• setAttribute
• setStyle
Client Actions
• alert
• addClass / removeClass / toggleClass
• setAttribute
• setStyle
• replaceInnerHTML
Client Actions
• alert
• addClass / removeClass / toggleClass
• setAttribute
• setStyle
• replaceInnerHTML
• log
Parameter Providers
Parameter Providers

• nodeAttr
Parameter Providers

• nodeAttr
• nodeContent
Parameter Providers

• nodeAttr
• nodeContent
• currentFormVar
Parameter Providers

• nodeAttr
• nodeContent
• currentFormVar
• formVar
Tying Them Together
Tying Them Together
<form id="myForm">
 <input name="color" />
 <input type="submit" class="submit" />
</form>

<div tal:define="color request/form/color|string:nothing;">
  You chose
  <span id="selectedColor"
      tal:content="color">
  </span>.
</div>
Tying Them Together
<form id="myForm">
 <input name="color" />
 <input type="submit" class="submit" />
</form>

<div tal:define="color request/form/color|string:nothing;">
  You chose
  <span id="selectedColor"
      tal:content="color">
  </span>.
</div>

#myForm .submit:click {
  evt-click-preventdefault: True;
  action-client: replaceInnerHTML;
  replaceInnerHTML-kssSelector: '#selectedColor';
  replaceInnerHTML-html: currentFormVar(color);
}
Tying Them Together
<form id="myForm">
 <input name="color" />
 <input type="submit" class="submit" />
</form>

<div tal:define="color request/form/color|string:nothing;">
  You chose
  <span id="selectedColor"
      tal:content="color">
  </span>.
</div>

#myForm .submit:click {
  evt-click-preventdefault: True;
  action-client: replaceInnerHTML;
  replaceInnerHTML-kssSelector: '#selectedColor';
  replaceInnerHTML-html: currentFormVar(color);
}
Fallback
Server Actions
Server Actions
#myForm .submit:click {
  evt-click-preventdefault: True;
  action-server: transformColor;
  transformColor-color: currentFormVar(color);
}
Server Actions
#myForm .submit:click {
  evt-click-preventdefault: True;
  action-server: transformColor;
  transformColor-color: currentFormVar(color);
}

transformColor.py
from kss.core.ttwapi import (startKSSCommands,
getKSSCommandSet, renderKSSCommands)
startKSSCommands(context, context.REQUEST)

uColor = color.upper()
core = getKSSCommandSet('core')
core.replaceInnerHTML('#selectedColor', uColor)
return renderKSSCommands()
Server Actions
#myForm .submit:click {
  evt-click-preventdefault: True;
  action-server: transformColor;
  transformColor-color: currentFormVar(color);
}

transformColor.py
from kss.core.ttwapi import (startKSSCommands,
getKSSCommandSet, renderKSSCommands)
startKSSCommands(context, context.REQUEST)

uColor = color.upper()
core = getKSSCommandSet('core')
core.replaceInnerHTML('#selectedColor', uColor)
return renderKSSCommands()
Command Sets
•   Core                 •   Zope

    •   getCssSelector       •   refreshProvider

    •   addClass             •   refreshViewlet

    •   removeClass      •   Plone

                             •   issuePortalMessage

                             •   refreshPortlet
Registering KSS


• portal_kss registry
kssregistry.xml
<?xml version="1.0"?>
   <object name="portal_kss" meta_type="KSS Registry">
      <kineticstylesheet cacheable="True" compression="safe"
     cookable="True"
  enabled="1" expression="" id="mykssrules.kss"/>
</object>
Debugging KSS
Debugging KSS

• Firebug
Debugging KSS

• Firebug
• Firebug
Debugging KSS

• Firebug
• Firebug
• Firebug
Debugging KSS

• Firebug
• Firebug
• Firebug
 • Or Firebug Lite (getfirebug.com/lite.html)
Debugging KSS

• KSS fails silently
• Turn on debugging in portal_javascript
• Messages will appear in Firebug console
Debugging KSS
Debugging KSS
• Firekiss
  http://kssproject.org/download/firekiss.xpi/
KSS Plugins
•   kss.plugin.cacheabilty   •   kss.plugin.jsmath

•   kss.plugin.cns           •   kss.plugin.timer

•   kss.plugin.fadeeffect    •   kss.plugin.yuidnd

•   kss.plugin.history
Documentation


• http://kssproject.org/
• http://plone.org/events/regional/plone-
  symposium-2008/skinning-with-plone-3
KSS Recap


• Simple, CSS-style syntax
• JavaScript, without the JavaScript
But here’s the thing...
It’s not really the best
        solution
Huh?
WTF?
• It’s huge
• It’s huge
• Lack of adoption
• It’s huge
• Lack of adoption
• Sparse documentation
• It’s huge
• Lack of adoption
• Sparse documentation
• Will be dropped as a core component
  (at some point)
jQuery
jQuery
jQuery

• DOM-focused
jQuery

• DOM-focused
• Simple syntax
jQuery

• DOM-focused
• Simple syntax
• Extensible
jQuery

• DOM-focused
• Simple syntax
• Extensible
• 19K
jQuery

• DOM-focused
• Simple syntax
• Extensible
• 19K
• Well-documented
Factory
Factory

• jQuery()
• $()
• jq()
Selectors
Selectors

• CSS
Selectors

• CSS
 • Tag name: jq(‘p’)
Selectors

• CSS
 • Tag name: jq(‘p’)
 • Id: jq(‘#itemId’)
Selectors

• CSS
 • Tag name: jq(‘p’)
 • Id: jq(‘#itemId’)
 • Class: jq(‘.someClass’)
Selectors

• CSS
 • Tag name: jq(‘p’)
 • Id: jq(‘#itemId’)
 • Class: jq(‘.someClass’)
• XPath: jq(‘a[title]’)
Pseudo-Selectors
Pseudo-Selectors
• :first and :last
Pseudo-Selectors
• :first and :last
• :not
  jq(‘#portal-column-content p:not(.discreet)’)
Pseudo-Selectors
• :first and :last
• :not
  jq(‘#portal-column-content p:not(.discreet)’)

• :first-child, :nth-child, and :last-child
  jq(‘ul li:nth-child(2)’)
Pseudo-Selectors
• :first and :last
• :not
  jq(‘#portal-column-content p:not(.discreet)’)

• :first-child, :nth-child, and :last-child
  jq(‘ul li:nth-child(2)’)

• :even and :odd
  jq(‘#myTable tr:odd’)
Sets
Sets

• “Implicit iteration”
Sets

• “Implicit iteration”
 • jq(‘#myDiv’).hide()
Sets

• “Implicit iteration”
 • jq(‘#myDiv’).hide()
 • jq(‘.someDivs’).hide()
Chaining
Chaining

• Operations always return a result
Chaining

• Operations always return a result
• So instead of...
  obj.doSomething()
  obj.doSomethingElse(‘blah’)
Chaining

• Operations always return a result
• So instead of...
  obj.doSomething()
  obj.doSomethingElse(‘blah’)

• We can write...
  jq(‘#myElement’).parent().addClass(‘blah’)
Chaining
Chaining

• One one line...
  jq(‘#faq’).find(‘dd’).hide().end().find(‘dt’).click(function(){...});
Chaining

• One one line...
  jq(‘#faq’).find(‘dd’).hide().end().find(‘dt’).click(function(){...});


• Or several...
  jq('#faq')               // Find the element with id ‘faq’
    .find('dd')             // Get all dd elements within
    .hide()               // Hide those elements
    .end()                // Jump back to the ‘faq’ element
    .find('dt')            // Find all dt elements within
    .click(function() {...}); // And assign an click event.
Events
Events
function foo(){
  alert(‘foo’);
}
window.onload = foo;
Events
function foo(){
  alert(‘foo’);
}
window.onload = foo;
function bar(){
  alert(‘bar’);
}
window.onload = bar;
Events
function foo(){
  alert(‘foo’);
}
window.onload = foo;
function bar(){
  alert(‘bar’);
}
window.onload = bar;
Events
Events


jq(document).ready(function) {
  alert(‘bar’);
});
Events
jq(document).ready(function) {
  alert(‘foo’);
});
    jq(document).ready(function) {
      alert(‘bar’);
    });
Events
jq(document).ready(function) {
  alert(‘foo’);
            jq(document).ready(function) {
});           alert(‘baz’);
    jq(document).ready(function) {
            });
      alert(‘bar’);
   });
Events
jq(document).ready(function) {
  alert(‘foo’);
            jq(document).ready(function) {
});           alert(‘baz’);
    jq(document).ready(function) {
            });
      alert(‘bar’);
    jq(document).ready(function) {
   });
       alert(‘blort’);
    });
Events
jq(document).ready(function) {
  alert(‘foo’);
             jq(document).ready(function) {
});            alert(‘baz’);
    jq(document).ready(function) {
               jq(document).ready(function) {
             });
      alert(‘bar’);
                 alert(‘smoo’);
     jq(document).ready(function) {
    });        });
        alert(‘blort’);
     });
Events
jq(document).ready(function) {
  alert(‘foo’);
             jq(document).ready(function) {
});            alert(‘baz’);
    jq(document).ready(function) {
               jq(document).ready(function) {
             });
      alert(‘bar’);
                 alert(‘smoo’);
jq(document).ready(function) {
     jq(document).ready(function) {
    });        });
  alert(‘floob’);
        alert(‘blort’);
}); });
Events
         #mykssbutton:click {
           evt-click-preventdefault: True;
           action-client: alert;
           alert-message: ‘Hello World!’;
         }
<a href=”front-page” id=”mykssbutton”>Click me!
</a>
Events
      jq(document).ready(function) {
        jq(‘#mykssbutton’).click(function(){
          alert(‘Hello World!);
        });
      });

<a href=”front-page” id=”mykssbutton”>Click me!
</a>
Another Example

jq(document).ready(function() {
   jq(‘a[@href$=”.pdf”]’).addclass(‘pdflink’);
});

a.pdflink { background:url(‘pdficon.gif’) no-repeat;
            padding-left:25px;
          }
AJAX Calls
AJAX Calls
#myForm .submit:click {
  evt-click-preventdefault: True;
  action-server: transformColor;
  transformColor-color: currentFormVar(color);
}
AJAX Calls
#myForm .submit:click {
  evt-click-preventdefault: True;
  action-server: transformColor;
  transformColor-color: currentFormVar(color);
}

from kss.core.ttwapi import (startKSSCommands,
getKSSCommandSet, renderKSSCommands)
startKSSCommands(context, context.REQUEST)

uColor = color.upper()
core = getKSSCommandSet('core')
core.replaceInnerHTML('#selectedColor', uColor)
return renderKSSCommands()
AJAX Calls
jq_transformColor
  return color.upper()




jq(document).ready(function(){
    jq('#myForm').submit(function(){
        var color = jq('input[name=color]').val();
        jq('#selectedColor').load('jq_transformColor?color=' + color);
        return false;
    });
});
jQuery in Plone

• Built into Plone 3.1+
• ‘jq’ instead of ‘$’
• Now use ‘jq’ method instead of ‘cssQuery’
  or ‘registerPloneFunction’
Integrating jQuery
               Plugins
http://plugins.jquery.com/
Integrating jQuery
      Plugins
Integrating jQuery
          Plugins
• If the plugin uses ‘$’:
Integrating jQuery
          Plugins
• If the plugin uses ‘$’:
 • Place it between jquery.js and jquery-
    integration.js
    <javascript ... insert-before="jquery-integration.js"/>
Integrating jQuery
          Plugins
• If the plugin uses ‘$’:
 • Place it between jquery.js and jquery-
    integration.js
    <javascript ... insert-before="jquery-integration.js"/>


  • or wrap it {
    (function($)
       [your code here]
    })(jQuery);
Existing Behaviors
Collapsible Sections
<dl class=”collapsible”>
  <dt class=”collapsibleHeader”>
    A Title
  </dt>
  <dd class=”collapsibleContent”>
    Your hidable content.
  </dd>
</dl>
Collapsible Sections
<dl class=”collapsible”>
  <dt class=”collapsibleHeader”>
    A Title
  </dt>
  <dd class=”collapsibleContent”>
    Your hidable content.
  </dd>
</dl>
Dropdowns
<dl class=”actionMenu” id=”aUniqueId”>
  <dt class=”actionMenuHeader”>
      <a href=”some_destination”>A Title</
      a>
  </dt>
  <dd class=”actionMenuContent”>
      Your content
  </dd>
</dl>
Dropdowns
<dl class=”actionMenu” id=”aUniqueId”>
  <dt class=”actionMenuHeader”>
      <a href=”some_destination”>A Title</
      a>
  </dt>
  <dd class=”actionMenuContent”>
      Your content
  </dd>
</dl>
Sortable Tables
<table class=”listing” id=”someId”>
  <thead>
     <tr>
        <th>Table header</th>
     </tr>
  </thead>
  <tbody>
     <tr>
        <td>Table cell 1</td>
     </tr>
     <tr>
        <td>Table cell 2</td>
     </tr>
  </tbody>
</table>
Sortable Tables
<table class=”listing” id=”someId”>
  <thead>
     <tr>
        <th>Table header</th>
     </tr>
  </thead>
  <tbody>
     <tr>
        <td>Table cell 1</td>
     </tr>
     <tr>
        <td>Table cell 2</td>
     </tr>
  </tbody>
</table>
Sortable Tables

<th class=”nosort”>
  Unsortable Column
</th>
Sortable Tables

<th class=”nosort”>
  Unsortable Column
</th>
Products using jQuery
collective.flowplayer
                Turns code like:
<a class="autoFlowPlayer" href="path/to/video-file.flv">
  <img src="path/to/splashscreen.jpg" />
</a>
                       into:
Deco
Deco
Others

• Carousel
• Plone Slimbox
• FancyZoomView
• FadingNavigation
• plone.app.jqtools
plone.app.jqtools
plone.app.jqtools


• Included in Plone 4
plone.app.jqtools


• Included in Plone 4
• Yay SteveM!
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
plone.app.jquerytools
•   Tabs

•   Tooltips

•   Overlay

•   Exposé

•   Scrollable

•   Flashembed
jQuery Documentation

http://docs.jquery.com/
http://www.packtpub.com/jQuery/
Other Libraries

• Yahoo User Interface (YUI)
• extjs
• MochiKit
• MooTools
• Dojo
Conclusions
• JavaScript novice? – Use KSS
• JavaScript novice? – Use KSS
• Otherwise, use JQuery
Special thanks to...

•   David Glick
    http://wglick.org/jstalk.html

•   Joel Burton
    http://bit.ly/z1nLH
Questions?

Mais conteúdo relacionado

Mais procurados

jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009Remy Sharp
 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS EditionStyling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Editionbensmithett
 
Our application got popular and now it breaks
Our application got popular and now it breaksOur application got popular and now it breaks
Our application got popular and now it breaksColdFusionConference
 
Bcblackpool jquery tips
Bcblackpool jquery tipsBcblackpool jquery tips
Bcblackpool jquery tipsJack Franklin
 
jQuery Presentation
jQuery PresentationjQuery Presentation
jQuery PresentationRod Johnson
 
Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScriptbensmithett
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)Doris Chen
 
Web Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationWeb Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationAndrew Rota
 
HTML5, just another presentation :)
HTML5, just another presentation :)HTML5, just another presentation :)
HTML5, just another presentation :)François Massart
 
JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)jeresig
 
The Future of CSS with Web Components
The Future of CSS with Web ComponentsThe Future of CSS with Web Components
The Future of CSS with Web ComponentsColdFusionConference
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQueryAngel Ruiz
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單偉格 高
 
Advanced jQuery (Ajax Exp 2007)
Advanced jQuery (Ajax Exp 2007)Advanced jQuery (Ajax Exp 2007)
Advanced jQuery (Ajax Exp 2007)jeresig
 
A brave new web - A talk about Web Components
A brave new web - A talk about Web ComponentsA brave new web - A talk about Web Components
A brave new web - A talk about Web ComponentsMichiel De Mey
 
WAI-ARIA is More Than Accessibility
WAI-ARIA is More Than AccessibilityWAI-ARIA is More Than Accessibility
WAI-ARIA is More Than Accessibility偉格 高
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 

Mais procurados (20)

jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS EditionStyling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Edition
 
Our application got popular and now it breaks
Our application got popular and now it breaksOur application got popular and now it breaks
Our application got popular and now it breaks
 
Bcblackpool jquery tips
Bcblackpool jquery tipsBcblackpool jquery tips
Bcblackpool jquery tips
 
jQuery Presentation
jQuery PresentationjQuery Presentation
jQuery Presentation
 
Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScript
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
Web Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationWeb Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing Combination
 
DirectToWeb 2.0
DirectToWeb 2.0DirectToWeb 2.0
DirectToWeb 2.0
 
HTML5, just another presentation :)
HTML5, just another presentation :)HTML5, just another presentation :)
HTML5, just another presentation :)
 
JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)
 
jQuery Essentials
jQuery EssentialsjQuery Essentials
jQuery Essentials
 
The Future of CSS with Web Components
The Future of CSS with Web ComponentsThe Future of CSS with Web Components
The Future of CSS with Web Components
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQuery
 
Site optimization
Site optimizationSite optimization
Site optimization
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單
 
Advanced jQuery (Ajax Exp 2007)
Advanced jQuery (Ajax Exp 2007)Advanced jQuery (Ajax Exp 2007)
Advanced jQuery (Ajax Exp 2007)
 
A brave new web - A talk about Web Components
A brave new web - A talk about Web ComponentsA brave new web - A talk about Web Components
A brave new web - A talk about Web Components
 
WAI-ARIA is More Than Accessibility
WAI-ARIA is More Than AccessibilityWAI-ARIA is More Than Accessibility
WAI-ARIA is More Than Accessibility
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 

Destaque

Plone Interactivity
Plone InteractivityPlone Interactivity
Plone InteractivityEric Steele
 
The State of Plone – Plone Conference 2012
The State of Plone – Plone Conference 2012The State of Plone – Plone Conference 2012
The State of Plone – Plone Conference 2012Eric Steele
 
Plone Conference 2010 – Where we go from here
Plone Conference 2010 – Where we go from herePlone Conference 2010 – Where we go from here
Plone Conference 2010 – Where we go from hereEric Steele
 
Continuous Integration Testing for Plone Using Hudson
Continuous Integration Testing for Plone Using HudsonContinuous Integration Testing for Plone Using Hudson
Continuous Integration Testing for Plone Using HudsonEric Steele
 
Eric Steele – World Plone Day 2010 – Plone 4 Overview
Eric Steele – World Plone Day 2010 – Plone 4 OverviewEric Steele – World Plone Day 2010 – Plone 4 Overview
Eric Steele – World Plone Day 2010 – Plone 4 OverviewEric Steele
 
A Look at Plone 4
A Look at Plone 4A Look at Plone 4
A Look at Plone 4Eric Steele
 

Destaque (8)

Plone Interactivity
Plone InteractivityPlone Interactivity
Plone Interactivity
 
The State of Plone – Plone Conference 2012
The State of Plone – Plone Conference 2012The State of Plone – Plone Conference 2012
The State of Plone – Plone Conference 2012
 
Plone Conference 2010 – Where we go from here
Plone Conference 2010 – Where we go from herePlone Conference 2010 – Where we go from here
Plone Conference 2010 – Where we go from here
 
Continuous Integration Testing for Plone Using Hudson
Continuous Integration Testing for Plone Using HudsonContinuous Integration Testing for Plone Using Hudson
Continuous Integration Testing for Plone Using Hudson
 
Iterating Plone
Iterating PloneIterating Plone
Iterating Plone
 
Eric Steele – World Plone Day 2010 – Plone 4 Overview
Eric Steele – World Plone Day 2010 – Plone 4 OverviewEric Steele – World Plone Day 2010 – Plone 4 Overview
Eric Steele – World Plone Day 2010 – Plone 4 Overview
 
A Look at Plone 4
A Look at Plone 4A Look at Plone 4
A Look at Plone 4
 
The headless CMS
The headless CMSThe headless CMS
The headless CMS
 

Semelhante a Plone Interactivity

Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014Rob Gietema
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014Ramon Navarro
 
Simple blog wall creation on Java
Simple blog wall creation on JavaSimple blog wall creation on Java
Simple blog wall creation on JavaMax Titov
 
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)David Giard
 
前端MVC之BackboneJS
前端MVC之BackboneJS前端MVC之BackboneJS
前端MVC之BackboneJSZhang Xiaoxue
 
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level
MWLUG 2015 - AD114 Take Your XPages Development to the Next LevelMWLUG 2015 - AD114 Take Your XPages Development to the Next Level
MWLUG 2015 - AD114 Take Your XPages Development to the Next Levelbalassaitis
 
GDI Seattle - Intro to JavaScript Class 4
GDI Seattle - Intro to JavaScript Class 4GDI Seattle - Intro to JavaScript Class 4
GDI Seattle - Intro to JavaScript Class 4Heather Rock
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Arun Gupta
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksJavascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksHjörtur Hilmarsson
 
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
 
JavaScript front end performance optimizations
JavaScript front end performance optimizationsJavaScript front end performance optimizations
JavaScript front end performance optimizationsChris Love
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutionswoutervugt
 
SharePoint & jQuery Guide - SPSNashville 2014
SharePoint & jQuery Guide - SPSNashville 2014SharePoint & jQuery Guide - SPSNashville 2014
SharePoint & jQuery Guide - SPSNashville 2014Mark Rackley
 
JavaScript For People Who Don't Code
JavaScript For People Who Don't CodeJavaScript For People Who Don't Code
JavaScript For People Who Don't CodeChristopher Schmitt
 
Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Thinqloud
 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Arun Gupta
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortalJennifer Bourey
 

Semelhante a Plone Interactivity (20)

Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014
 
Simple blog wall creation on Java
Simple blog wall creation on JavaSimple blog wall creation on Java
Simple blog wall creation on Java
 
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
 
前端MVC之BackboneJS
前端MVC之BackboneJS前端MVC之BackboneJS
前端MVC之BackboneJS
 
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level
MWLUG 2015 - AD114 Take Your XPages Development to the Next LevelMWLUG 2015 - AD114 Take Your XPages Development to the Next Level
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level
 
GDI Seattle - Intro to JavaScript Class 4
GDI Seattle - Intro to JavaScript Class 4GDI Seattle - Intro to JavaScript Class 4
GDI Seattle - Intro to JavaScript Class 4
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksJavascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & Tricks
 
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...
 
JavaScript front end performance optimizations
JavaScript front end performance optimizationsJavaScript front end performance optimizations
JavaScript front end performance optimizations
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutions
 
SharePoint & jQuery Guide - SPSNashville 2014
SharePoint & jQuery Guide - SPSNashville 2014SharePoint & jQuery Guide - SPSNashville 2014
SharePoint & jQuery Guide - SPSNashville 2014
 
Jquery fundamentals
Jquery fundamentalsJquery fundamentals
Jquery fundamentals
 
JavaScript For People Who Don't Code
JavaScript For People Who Don't CodeJavaScript For People Who Don't Code
JavaScript For People Who Don't Code
 
Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...
 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortal
 
JavaScript
JavaScriptJavaScript
JavaScript
 

Último

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 

Último (20)

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 

Plone Interactivity

Notas do Editor

  1. So what kind of stuff are we going to talk about? We&amp;#x2019;ll get the boring stuff out of the way first and then we&amp;#x2019;ll move on to more interesting things like KSS and jQuery. There&amp;#x2019;s a lot to cover, we&amp;#x2019;ll hold questions until the end. And any of these slides that I don&amp;#x2019;t get to, I&amp;#x2019;ll just cut out of Plone 4.
  2. So what kind of stuff are we going to talk about? We&amp;#x2019;ll get the boring stuff out of the way first and then we&amp;#x2019;ll move on to more interesting things like KSS and jQuery. There&amp;#x2019;s a lot to cover, we&amp;#x2019;ll hold questions until the end. And any of these slides that I don&amp;#x2019;t get to, I&amp;#x2019;ll just cut out of Plone 4.
  3. Plone considers
  4. You might use a block of code like this to include a script in your Plone template if you only need it on one page or one template or performance isn&amp;#x2019;t really something you&amp;#x2019;re concerned about.
  5. You might use a block of code like this to include a script in your Plone template if you only need it on one page or one template or performance isn&amp;#x2019;t really something you&amp;#x2019;re concerned about.
  6. Plone, however, provides Resource Registries for keeping track of things like CSS, JavaScript, and KSS.
  7. So what makes resource registries useful? Control which scripts are included on a page and in what order they&amp;#x2019;ll render. It gives you automatic merging and compression of your scripts. And makes JavaScript more cacheable.
  8. So what makes resource registries useful? Control which scripts are included on a page and in what order they&amp;#x2019;ll render. It gives you automatic merging and compression of your scripts. And makes JavaScript more cacheable.
  9. So what makes resource registries useful? Control which scripts are included on a page and in what order they&amp;#x2019;ll render. It gives you automatic merging and compression of your scripts. And makes JavaScript more cacheable.
  10. And its easy for third-party products to add scripts to portal_javascript using Generic Setup. We can control all of the settings from here and even specify where it should wind up in the ordering.
  11. And now, in Plone 3.3, we can use portal_javascript to include JavaScript being hosted on external servers.
  12. And now, in Plone 3.3, we can use portal_javascript to include JavaScript being hosted on external servers.
  13. And now, in Plone 3.3, we can use portal_javascript to include JavaScript being hosted on external servers.
  14. And that&amp;#x2019;s handy because of sites like Google&amp;#x2019;s AJAX libraries API. Google hosts the libraries, you pull them into your site as needed. They&amp;#x2019;ve got a number of the more-popular JavaScript libraries.
  15. And that&amp;#x2019;s handy because of sites like Google&amp;#x2019;s AJAX libraries API. Google hosts the libraries, you pull them into your site as needed. They&amp;#x2019;ve got a number of the more-popular JavaScript libraries.
  16. These can be registered with the resource registries in the same manner as before. This time we&amp;#x2019;ll use that ++resource++ path to point to the file we&amp;#x2019;re after.
  17. We can also register these to be available only for specific content types or browser layers so that they&amp;#x2019;ll only appear in certain portions of a site.
  18. We can also register these to be available only for specific content types or browser layers so that they&amp;#x2019;ll only appear in certain portions of a site.
  19. There&amp;#x2019;s also a resourceDirectory ZCML directive that will allow you to register an entire folder of files, rather than registering each one individually. The url would look like this.
  20. There&amp;#x2019;s also a resourceDirectory ZCML directive that will allow you to register an entire folder of files, rather than registering each one individually. The url would look like this.
  21. So, what are Javascript libraries?
  22. So why might we use one? It&amp;#x2019;s faster. You&amp;#x2019;ve got better things to do with your time. Chances are someone&amp;#x2019;s already done what you want to do, and done it better. It removes the need to know everything there is to know about writing JavaScript. And you can largely ignore browser compatibility issues.
  23. So why might we use one? It&amp;#x2019;s faster. You&amp;#x2019;ve got better things to do with your time. Chances are someone&amp;#x2019;s already done what you want to do, and done it better. It removes the need to know everything there is to know about writing JavaScript. And you can largely ignore browser compatibility issues.
  24. So why might we use one? It&amp;#x2019;s faster. You&amp;#x2019;ve got better things to do with your time. Chances are someone&amp;#x2019;s already done what you want to do, and done it better. It removes the need to know everything there is to know about writing JavaScript. And you can largely ignore browser compatibility issues.
  25. So why might we use one? It&amp;#x2019;s faster. You&amp;#x2019;ve got better things to do with your time. Chances are someone&amp;#x2019;s already done what you want to do, and done it better. It removes the need to know everything there is to know about writing JavaScript. And you can largely ignore browser compatibility issues.
  26. So let&amp;#x2019;s start with Plone&amp;#x2019;s built-in library, KSS.
  27. This is what a typical KSS rule might look like. Note that it looks very much like something we&amp;#x2019;d see in a stylesheet.
  28. One of the things you&amp;#x2019;ll use most when writing KSS rules will be this bit. Essentially, we&amp;#x2019;re telling KSS that we want to ignore the default click event of whatever element the rule applies to.
  29. This means that if our rule applies to this link, we&amp;#x2019;ll ignore the default action &amp;#x2013;&amp;#xA0;actually going to the front-page &amp;#x2013;&amp;#xA0;and instead apply our own actions, which in this case would be popping up a &amp;#x201C;Hello World!&amp;#x201D; alert message.
  30. And that&amp;#x2019;d look something like this.
  31. So in that example, we used the &amp;#x201C;alert&amp;#x201D; client action. There are others we can use too.
  32. So in that example, we used the &amp;#x201C;alert&amp;#x201D; client action. There are others we can use too.
  33. So in that example, we used the &amp;#x201C;alert&amp;#x201D; client action. There are others we can use too.
  34. So in that example, we used the &amp;#x201C;alert&amp;#x201D; client action. There are others we can use too.
  35. So in that example, we used the &amp;#x201C;alert&amp;#x201D; client action. There are others we can use too.
  36. So in that example, we used the &amp;#x201C;alert&amp;#x201D; client action. There are others we can use too.
  37. Parameter providers let us pull data out of the current page so that we can use it in an action. NodeAttr lets you pull out the value of an HTML attribute of the selected element. NodeContent will return the text content of the selected element. currentFormVar and formVar pull values out of form fields.
  38. Parameter providers let us pull data out of the current page so that we can use it in an action. NodeAttr lets you pull out the value of an HTML attribute of the selected element. NodeContent will return the text content of the selected element. currentFormVar and formVar pull values out of form fields.
  39. Parameter providers let us pull data out of the current page so that we can use it in an action. NodeAttr lets you pull out the value of an HTML attribute of the selected element. NodeContent will return the text content of the selected element. currentFormVar and formVar pull values out of form fields.
  40. Parameter providers let us pull data out of the current page so that we can use it in an action. NodeAttr lets you pull out the value of an HTML attribute of the selected element. NodeContent will return the text content of the selected element. currentFormVar and formVar pull values out of form fields.
  41. So let&amp;#x2019;s tie all of these concepts together. I&amp;#x2019;ve created a simple html page with a form that accepts a color name and has a submit button. There&amp;#x2019;s also a div that will tell the user what they&amp;#x2019;ve just typed in. Complex stuff, I know. The KSS is rule says that when the user clicks on the submit button in our form, it&amp;#x2019;ll ignore the default action (which would be to submit the form) and instead replace the content of the page element with the id #selectedColor with the value of the color field. Let&amp;#x2019;s see this in action.
  42. So let&amp;#x2019;s tie all of these concepts together. I&amp;#x2019;ve created a simple html page with a form that accepts a color name and has a submit button. There&amp;#x2019;s also a div that will tell the user what they&amp;#x2019;ve just typed in. Complex stuff, I know. The KSS is rule says that when the user clicks on the submit button in our form, it&amp;#x2019;ll ignore the default action (which would be to submit the form) and instead replace the content of the page element with the id #selectedColor with the value of the color field. Let&amp;#x2019;s see this in action.
  43. So let&amp;#x2019;s tie all of these concepts together. I&amp;#x2019;ve created a simple html page with a form that accepts a color name and has a submit button. There&amp;#x2019;s also a div that will tell the user what they&amp;#x2019;ve just typed in. Complex stuff, I know. The KSS is rule says that when the user clicks on the submit button in our form, it&amp;#x2019;ll ignore the default action (which would be to submit the form) and instead replace the content of the page element with the id #selectedColor with the value of the color field. Let&amp;#x2019;s see this in action.
  44. So what happens if JavaScript is disabled for whatever reason? KSS makes sure that if that&amp;#x2019;s the case, then the click event override we&amp;#x2019;ve created doesn&amp;#x2019;t get registered and the page will fall back to its default functionality. So disabling javascript on this page, reloading and trying again, we get the same result. KSS makes this very easy, with only a minimal amount of planning on my part.
  45. Alright, now let&amp;#x2019;s get into some actual AJAX. Doing things on the client side is fine, but what if we want to do something a bit more involved with the data. So in this example, I&amp;#x2019;m going to switch to using action-server. We&amp;#x2019;ll call a python script I&amp;#x2019;ve created. This could also be a browser view if we were creating this as a filesystem product. The script is expecting a parameter named &amp;#x201C;color&amp;#x201D;, so we&amp;#x2019;ll need to pass that along as well. Looking at the script itself, there&amp;#x2019;s a lot of boilerplate that you don&amp;#x2019;t really need to be concerned about. Just trust that it&amp;#x2019;s there for a reason and move on with your life. The important bits are the remaining three lines. First of all, we&amp;#x2019;ll do a simple bit of Python and change the color name the script has received into uppercase. Next we&amp;#x2019;ll grab the core kss commandset. Core essentially holds all of those action-client methods we could call directly from KSS, and provides them to Python. So in this case, we&amp;#x2019;re going to replace the inner HTML of the element with the selectedColor id with the capitalized color name. Looking at this in action, we see that providing &amp;#x2018;blue&amp;#x2019; displays it in the page in uppercase, all without reloading the page.
  46. Alright, now let&amp;#x2019;s get into some actual AJAX. Doing things on the client side is fine, but what if we want to do something a bit more involved with the data. So in this example, I&amp;#x2019;m going to switch to using action-server. We&amp;#x2019;ll call a python script I&amp;#x2019;ve created. This could also be a browser view if we were creating this as a filesystem product. The script is expecting a parameter named &amp;#x201C;color&amp;#x201D;, so we&amp;#x2019;ll need to pass that along as well. Looking at the script itself, there&amp;#x2019;s a lot of boilerplate that you don&amp;#x2019;t really need to be concerned about. Just trust that it&amp;#x2019;s there for a reason and move on with your life. The important bits are the remaining three lines. First of all, we&amp;#x2019;ll do a simple bit of Python and change the color name the script has received into uppercase. Next we&amp;#x2019;ll grab the core kss commandset. Core essentially holds all of those action-client methods we could call directly from KSS, and provides them to Python. So in this case, we&amp;#x2019;re going to replace the inner HTML of the element with the selectedColor id with the capitalized color name. Looking at this in action, we see that providing &amp;#x2018;blue&amp;#x2019; displays it in the page in uppercase, all without reloading the page.
  47. Alright, now let&amp;#x2019;s get into some actual AJAX. Doing things on the client side is fine, but what if we want to do something a bit more involved with the data. So in this example, I&amp;#x2019;m going to switch to using action-server. We&amp;#x2019;ll call a python script I&amp;#x2019;ve created. This could also be a browser view if we were creating this as a filesystem product. The script is expecting a parameter named &amp;#x201C;color&amp;#x201D;, so we&amp;#x2019;ll need to pass that along as well. Looking at the script itself, there&amp;#x2019;s a lot of boilerplate that you don&amp;#x2019;t really need to be concerned about. Just trust that it&amp;#x2019;s there for a reason and move on with your life. The important bits are the remaining three lines. First of all, we&amp;#x2019;ll do a simple bit of Python and change the color name the script has received into uppercase. Next we&amp;#x2019;ll grab the core kss commandset. Core essentially holds all of those action-client methods we could call directly from KSS, and provides them to Python. So in this case, we&amp;#x2019;re going to replace the inner HTML of the element with the selectedColor id with the capitalized color name. Looking at this in action, we see that providing &amp;#x2018;blue&amp;#x2019; displays it in the page in uppercase, all without reloading the page.
  48. We saw that &amp;#x201C;getCommandSet&amp;#x201D; line... there are 3 different command sets that come with KSS out of the box. I mentioned &amp;#x2018;core&amp;#x2019;, that essentially provides all of the action-client calls available in our KSS rules. The second is the Zope command set, which allows us to redraw providers -- things like viewlet managers and portlet managers -- or to redraw individual viewlets. Third is the Plone command set, which lets us do things like display portal messages or refresh portlets. All of these let us interact with the browser window from Python. So KSS has allowed JavaScript to talk to Python and Python to talk to JavaScript.
  49. So how do we register a kss file? We&amp;#x2019;re going to use one of the resource registries we talked about earlier -- portal_kss.
  50. Typically, that&amp;#x2019;s done from GenericSetup, using an kssregistry.xml file. This looks almost exactly like the JavaScript registration we looked at earlier.
  51. So how do you go about debugging KSS? Firebug. Firebug. Firebug. Or, if you&amp;#x2019;re debugging in something that&amp;#x2019;s not Firefox, try Firebug Lite.
  52. So how do you go about debugging KSS? Firebug. Firebug. Firebug. Or, if you&amp;#x2019;re debugging in something that&amp;#x2019;s not Firefox, try Firebug Lite.
  53. So how do you go about debugging KSS? Firebug. Firebug. Firebug. Or, if you&amp;#x2019;re debugging in something that&amp;#x2019;s not Firefox, try Firebug Lite.
  54. So how do you go about debugging KSS? Firebug. Firebug. Firebug. Or, if you&amp;#x2019;re debugging in something that&amp;#x2019;s not Firefox, try Firebug Lite.
  55. A side-effect of KSS&amp;#x2019;s no-javascript failover is that if there&amp;#x2019;s an error, your page&amp;#x2019;s KSS will fail to load. Which means that it will typically fail silently. So, essentially, all of the KSS functionality on that page will fail to work if there is a syntax error. I spent a day chasing down what turned out to be a missing semicolon in my ruleset. But, if you turn on javascript debugging in portal_javascript, KSS debugging information will appear in Firebug&amp;#x2019;s console window. And there&amp;#x2019;s a lot of it.
  56. And this is what that debugging output will look like. Firebug will show all of the rules being processed, any XMLRPC calls being passed around, and detailed error messages that may crop up.
  57. There&amp;#x2019;s also &amp;#x201C;Firekiss&amp;#x201D;, a Firebug extension from the KSS folks. It&amp;#x2019;ll show your KSS rules and allow you to change debug mode and log level from within Firebug.
  58. There are a number of KSS addons available. kss.plugin.cacheability which enables KSS requests to be cached. kss.plugin.cns provides a number of new client actions. kss.plugin.fadeeffect adds image fading and substitution. kss.plugin.history allows you to modify the browser location in an effort to add backward and forward navigation to a javascript application. kss.plugin.jsmath uses the jsmath library to display complex mathematical functions. kss.plugin.timer displays a timer. kss.plugin.yuidnd integrates the Yahoo User Interface drag-and-drop library.
  59. Quick recap: What is KSS? It uses a simple, css-style syntax. Basically, it&amp;#x2019;s Javascript, without the JavaScript, which for someone like me who hates writing Javascript, is really awesome.
  60. It&amp;#x2019;s not really the best solution.
  61. So now you&amp;#x2019;re thinking
  62. Why?
  63. So here&amp;#x2019;s why... It&amp;#x2019;s huge. The relevant scripts check in at over 100 k. It&amp;#x2019;s been slow to catch on, both within and outside of the Plone project. And the documentation is somewhat lacking. I really like KSS and relied on it heavily to build GloWorm. I think I made it about 90% of the way through to the final release before I actually had to write a line of JavaScript code myself, KSS handled the large majority of what I wanted to do. KSS was revolutionary when it was introduced, but since then there have been some fantastic developments in other areas. Because of that and the fact that the current direction that Plone core development is taking is to make Plone itself ship as a much leaner product, KSS will probably be dropped as a core component in the near future. Most likely in Plone 5.
  64. So here&amp;#x2019;s why... It&amp;#x2019;s huge. The relevant scripts check in at over 100 k. It&amp;#x2019;s been slow to catch on, both within and outside of the Plone project. And the documentation is somewhat lacking. I really like KSS and relied on it heavily to build GloWorm. I think I made it about 90% of the way through to the final release before I actually had to write a line of JavaScript code myself, KSS handled the large majority of what I wanted to do. KSS was revolutionary when it was introduced, but since then there have been some fantastic developments in other areas. Because of that and the fact that the current direction that Plone core development is taking is to make Plone itself ship as a much leaner product, KSS will probably be dropped as a core component in the near future. Most likely in Plone 5.
  65. So here&amp;#x2019;s why... It&amp;#x2019;s huge. The relevant scripts check in at over 100 k. It&amp;#x2019;s been slow to catch on, both within and outside of the Plone project. And the documentation is somewhat lacking. I really like KSS and relied on it heavily to build GloWorm. I think I made it about 90% of the way through to the final release before I actually had to write a line of JavaScript code myself, KSS handled the large majority of what I wanted to do. KSS was revolutionary when it was introduced, but since then there have been some fantastic developments in other areas. Because of that and the fact that the current direction that Plone core development is taking is to make Plone itself ship as a much leaner product, KSS will probably be dropped as a core component in the near future. Most likely in Plone 5.
  66. So here&amp;#x2019;s why... It&amp;#x2019;s huge. The relevant scripts check in at over 100 k. It&amp;#x2019;s been slow to catch on, both within and outside of the Plone project. And the documentation is somewhat lacking. I really like KSS and relied on it heavily to build GloWorm. I think I made it about 90% of the way through to the final release before I actually had to write a line of JavaScript code myself, KSS handled the large majority of what I wanted to do. KSS was revolutionary when it was introduced, but since then there have been some fantastic developments in other areas. Because of that and the fact that the current direction that Plone core development is taking is to make Plone itself ship as a much leaner product, KSS will probably be dropped as a core component in the near future. Most likely in Plone 5.
  67. So that brings us to jQuery, the JavaScript library with which we&amp;#x2019;re slowly replacing KSS functionality in Plone core.
  68. So why use jQuery It&amp;#x2019;s a DOM-focused library, and by that, I mean that it&amp;#x2019;s less of a &amp;#x201C;make JavaScript a real language&amp;#x201D; library, and more of a &amp;#x201C;get stuff done&amp;#x201D; library. It&amp;#x2019;s got a very simple syntax. It&amp;#x2019;s easy to add on to the core functionality and there are lots of plugins available that do so. It&amp;#x2019;s quite small. And there&amp;#x2019;s a large amount of good documentation.
  69. So why use jQuery It&amp;#x2019;s a DOM-focused library, and by that, I mean that it&amp;#x2019;s less of a &amp;#x201C;make JavaScript a real language&amp;#x201D; library, and more of a &amp;#x201C;get stuff done&amp;#x201D; library. It&amp;#x2019;s got a very simple syntax. It&amp;#x2019;s easy to add on to the core functionality and there are lots of plugins available that do so. It&amp;#x2019;s quite small. And there&amp;#x2019;s a large amount of good documentation.
  70. So why use jQuery It&amp;#x2019;s a DOM-focused library, and by that, I mean that it&amp;#x2019;s less of a &amp;#x201C;make JavaScript a real language&amp;#x201D; library, and more of a &amp;#x201C;get stuff done&amp;#x201D; library. It&amp;#x2019;s got a very simple syntax. It&amp;#x2019;s easy to add on to the core functionality and there are lots of plugins available that do so. It&amp;#x2019;s quite small. And there&amp;#x2019;s a large amount of good documentation.
  71. So why use jQuery It&amp;#x2019;s a DOM-focused library, and by that, I mean that it&amp;#x2019;s less of a &amp;#x201C;make JavaScript a real language&amp;#x201D; library, and more of a &amp;#x201C;get stuff done&amp;#x201D; library. It&amp;#x2019;s got a very simple syntax. It&amp;#x2019;s easy to add on to the core functionality and there are lots of plugins available that do so. It&amp;#x2019;s quite small. And there&amp;#x2019;s a large amount of good documentation.
  72. So why use jQuery It&amp;#x2019;s a DOM-focused library, and by that, I mean that it&amp;#x2019;s less of a &amp;#x201C;make JavaScript a real language&amp;#x201D; library, and more of a &amp;#x201C;get stuff done&amp;#x201D; library. It&amp;#x2019;s got a very simple syntax. It&amp;#x2019;s easy to add on to the core functionality and there are lots of plugins available that do so. It&amp;#x2019;s quite small. And there&amp;#x2019;s a large amount of good documentation.
  73. The basis of all jQuery calls is known as the jQuery factory function. Typically shortened as a dollar sign. In Plone, it&amp;#x2019;s aliased as &amp;#x201C;jq&amp;#x201D;. We&amp;#x2019;ll get into that a bit more later, but for now all of my examples will use the &amp;#x201C;jq&amp;#x201D; alias since that&amp;#x2019;s what you can expect to use when writing scripts for Plone.
  74. We can pass all sorts of selectors to the factory function. Most of the time, we&amp;#x2019;ll use a CSS selector, like a tag, id, or class. But can also use XPath statements to select particular elements of the HTML document we&amp;#x2019;re interacting with.
  75. We can pass all sorts of selectors to the factory function. Most of the time, we&amp;#x2019;ll use a CSS selector, like a tag, id, or class. But can also use XPath statements to select particular elements of the HTML document we&amp;#x2019;re interacting with.
  76. We can pass all sorts of selectors to the factory function. Most of the time, we&amp;#x2019;ll use a CSS selector, like a tag, id, or class. But can also use XPath statements to select particular elements of the HTML document we&amp;#x2019;re interacting with.
  77. We can pass all sorts of selectors to the factory function. Most of the time, we&amp;#x2019;ll use a CSS selector, like a tag, id, or class. But can also use XPath statements to select particular elements of the HTML document we&amp;#x2019;re interacting with.
  78. We can pass all sorts of selectors to the factory function. Most of the time, we&amp;#x2019;ll use a CSS selector, like a tag, id, or class. But can also use XPath statements to select particular elements of the HTML document we&amp;#x2019;re interacting with.
  79. jQuery is fully CSS3 compliant, so we get all sorts of new CSS pseudo-selectors. We can select the first or last instance of a selector. We can get content that does not meet certain criteria. We can get the first, last, or nnth element of a group. And also defines some of its own (:even/:odd).
  80. jQuery is fully CSS3 compliant, so we get all sorts of new CSS pseudo-selectors. We can select the first or last instance of a selector. We can get content that does not meet certain criteria. We can get the first, last, or nnth element of a group. And also defines some of its own (:even/:odd).
  81. jQuery is fully CSS3 compliant, so we get all sorts of new CSS pseudo-selectors. We can select the first or last instance of a selector. We can get content that does not meet certain criteria. We can get the first, last, or nnth element of a group. And also defines some of its own (:even/:odd).
  82. jQuery is fully CSS3 compliant, so we get all sorts of new CSS pseudo-selectors. We can select the first or last instance of a selector. We can get content that does not meet certain criteria. We can get the first, last, or nnth element of a group. And also defines some of its own (:even/:odd).
  83. Whether our selector finds one, many, or no page elements, jQuery&amp;#x2019;s &amp;#x201C;Implicit Iteration&amp;#x201D; means that methods assume that the selector&amp;#x2019;s result is a set of elements and will run accordingly. That lets us call methods without worrying about the number of results.
  84. Whether our selector finds one, many, or no page elements, jQuery&amp;#x2019;s &amp;#x201C;Implicit Iteration&amp;#x201D; means that methods assume that the selector&amp;#x2019;s result is a set of elements and will run accordingly. That lets us call methods without worrying about the number of results.
  85. Whether our selector finds one, many, or no page elements, jQuery&amp;#x2019;s &amp;#x201C;Implicit Iteration&amp;#x201D; means that methods assume that the selector&amp;#x2019;s result is a set of elements and will run accordingly. That lets us call methods without worrying about the number of results.
  86. Operations on an element will always return a result. That result could be the same element, another element, or a set of elements. So instead of calling methods on an object over and over. We can chain commands, performing operations on the previous command&amp;#x2019;s result.
  87. Operations on an element will always return a result. That result could be the same element, another element, or a set of elements. So instead of calling methods on an object over and over. We can chain commands, performing operations on the previous command&amp;#x2019;s result.
  88. Operations on an element will always return a result. That result could be the same element, another element, or a set of elements. So instead of calling methods on an object over and over. We can chain commands, performing operations on the previous command&amp;#x2019;s result.
  89. We can chain as much as we like, doing it all on one line, or several. Splitting it across several lines allows us to provide much more in the way of comments.
  90. We can chain as much as we like, doing it all on one line, or several. Splitting it across several lines allows us to provide much more in the way of comments.
  91. Typically, in JavaScript land, we might define a function that would run once the page has finished loading. The problem is that if we do it this way, each new function we add would overwrite the others and prevent them from running.
  92. Typically, in JavaScript land, we might define a function that would run once the page has finished loading. The problem is that if we do it this way, each new function we add would overwrite the others and prevent them from running.
  93. Typically, in JavaScript land, we might define a function that would run once the page has finished loading. The problem is that if we do it this way, each new function we add would overwrite the others and prevent them from running.
  94. Using jQuery, we could rewrite the this function like this, by assigning a new function to jQuery&amp;#x2019;s document ready event. And since jQuery implements an event queue, we can do this as many times as we&amp;#x2019;d like without worrying that registering one will override another.
  95. Using jQuery, we could rewrite the this function like this, by assigning a new function to jQuery&amp;#x2019;s document ready event. And since jQuery implements an event queue, we can do this as many times as we&amp;#x2019;d like without worrying that registering one will override another.
  96. Using jQuery, we could rewrite the this function like this, by assigning a new function to jQuery&amp;#x2019;s document ready event. And since jQuery implements an event queue, we can do this as many times as we&amp;#x2019;d like without worrying that registering one will override another.
  97. Using jQuery, we could rewrite the this function like this, by assigning a new function to jQuery&amp;#x2019;s document ready event. And since jQuery implements an event queue, we can do this as many times as we&amp;#x2019;d like without worrying that registering one will override another.
  98. Using jQuery, we could rewrite the this function like this, by assigning a new function to jQuery&amp;#x2019;s document ready event. And since jQuery implements an event queue, we can do this as many times as we&amp;#x2019;d like without worrying that registering one will override another.
  99. Using jQuery, we could rewrite the this function like this, by assigning a new function to jQuery&amp;#x2019;s document ready event. And since jQuery implements an event queue, we can do this as many times as we&amp;#x2019;d like without worrying that registering one will override another.
  100. If you remember back to that first KSS action we wrote, we created an action that overrode a link with the id &amp;#x201C;mykssbutton&amp;#x201D; and instead popped up a &amp;#x201C;hello world&amp;#x201D; alert box. Let&amp;#x2019;s rewrite that in jQuery....
  101. So it&amp;#x2019;ll look like this... We&amp;#x2019;ll use the document ready event to signal that a new function should be assigned to click event of the element with an id of #mykssbutton. That new function will present an alert window stating &amp;#x201C;Hello World!&amp;#x201D;
  102. Example... create a script that adds a pdf icon to all links on the page pointing to pdfs.
  103. And we can do our AJAX calls too. This was our KSS AJAX script.
  104. And we can do our AJAX calls too. This was our KSS AJAX script.
  105. And this is how it&amp;#x2019;d look in jQuery. Our python script is going to be a lot simpler, now it just returns the data we&amp;#x2019;re after instead of handling the changing of the page content. Then, we&amp;#x2019;ll tell the selectedColor element to load the response from our jq_transformColor script. Our jQuery will override the submit method of the form. We&amp;#x2019;ll grab the value of the color field. The last line is a bit of voodoo... In order to prevent the form from actually submitting, we return a false value. If we returned true, it&amp;#x2019;d go ahead and complete the action.
  106. jQuery core is now included with Plone as of version 3.1. Plone uses jq instead of the dollar sign shortcut to avoid potential conflicts with other javascript libraries. And if you&amp;#x2019;ve been using &amp;#x2018;cssQuery&amp;#x2019; or &amp;#x2018;registerPloneFunction&amp;#x2019;, you should now be using &amp;#x2018;jq&amp;#x2019; instead.
  107. There are over a thousand jQuery plugins available to handle things like animation, layout, forms, and AJAX.
  108. So how might you integrate one of these into Plone? If the plugin uses the &amp;#x2018;$&amp;#x2019; factory alias, you&amp;#x2019;ll need to place it between jquery.js and jquery-integration.js in the portal_javascript registry. Using GenericSetup, that&amp;#x2019;d look something like this -- specifying that the script should be inserted before jquery-integration.js in the ordering. Or you can wrap it in a function like this.
  109. So how might you integrate one of these into Plone? If the plugin uses the &amp;#x2018;$&amp;#x2019; factory alias, you&amp;#x2019;ll need to place it between jquery.js and jquery-integration.js in the portal_javascript registry. Using GenericSetup, that&amp;#x2019;d look something like this -- specifying that the script should be inserted before jquery-integration.js in the ordering. Or you can wrap it in a function like this.
  110. So how might you integrate one of these into Plone? If the plugin uses the &amp;#x2018;$&amp;#x2019; factory alias, you&amp;#x2019;ll need to place it between jquery.js and jquery-integration.js in the portal_javascript registry. Using GenericSetup, that&amp;#x2019;d look something like this -- specifying that the script should be inserted before jquery-integration.js in the ordering. Or you can wrap it in a function like this.
  111. So let&amp;#x2019;s look at some existing behaviors that Plone provides through jQuery...
  112. And there are quite a few Plone products currently making use of jQuery.
  113. collective.flowplayer will turn links to flash videos or mp3s into inline players.
  114. Deco, which will be the content layout and editing tool in Plone 5 makes extensive use of jQuery to handle layout and interaction.
  115. jQuery has some excellent documentation available. I highly recommend checking it out.
  116. I&amp;#x2019;m a fan of the &amp;#x201C;Learning jQuery&amp;#x201D; book from Packt.
  117. And I just want to mention a few other libraries that you can use with Plone. They&amp;#x2019;re each focused on different tasks or approaches to writing interactive applications.
  118. If you&amp;#x2019;re not comfortable with JavaScript or are pressed for time, KSS is the way to go. It&amp;#x2019;s easy. Otherwise, your best bet is to use JQuery.
  119. If you&amp;#x2019;re not comfortable with JavaScript or are pressed for time, KSS is the way to go. It&amp;#x2019;s easy. Otherwise, your best bet is to use JQuery.
  120. Any questions?