SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Developing
                 JavaScript
             Widgets



Konstantin
Käfer
1   Functions

    2   Drupal’s JavaScript facilities

    3   Widgets

    4   Debugging & Analyzing


2                                        Konstantin Käfer
Functions
        Functions are first class entities
    ‣

        – Store in variables, pass as parameters, return from
          functions
        – Can be defined at any place

        Functions can contain properties
    ‣

        Anonymous functions
    ‣




3                                                           Konstantin Käfer
Functions (II)
    var foo = function(callback) {
      callback();
      return function() {
        print(quot;Returned function calledquot;);
      };
    };

    foo(function() {
      print(quot;Passed function calledquot;);
    })();

    foo.bar = quot;bazquot;;


4                                            Konstantin Käfer
Prototypal OOP
        JavaScript doesn’t have classes
    ‣

        Prototype of a function used as base class
    ‣

        var Foo = function() { /* ... */ };

        Foo.prototype = {
          'bar': function() { /* ... */ },
          'baz': function() { /* ... */ }
        };

        var instance = new Foo();
        instance.bar();
        instance.baz();
5                                                    Konstantin Käfer
Prototypal OOP (II)
        Function is constructor
    ‣

        “Instances” have an implicit link to the base
    ‣
        class
        var Foo = function() { /* ... */ };
        Foo.prototype = {
          'bar': function() { /* ... */ }
        };

        var instance = new Foo();
        instance.bar();

        Foo.prototype.baz = function() { /* ... */ };
        instance.baz();
6                                                       Konstantin Käfer
Prototypal OOP (III)
        Any objects can be extended/changed at any
    ‣
        time
    Number.prototype.celsiusToFahrenheit = function() {
      return (this * 9 / 5) + 32;
    };

    js> (34).celsiusToFahrenheit();
    93.2
    js> (0).celsiusToFahrenheit();
    32



7                                                    Konstantin Käfer
1   Functions

    2   Drupal’s JavaScript facilities

    3   Widgets

    4   Debugging & Analyzing


8                                        Konstantin Käfer
AJAX Callbacks
        In the menu system:
    ‣
        $items['mymodule/js'] = array(
          'title' => 'JavaScript callback',
          'page callback' => 'mymodule_js',
          'access callback' => TRUE,
          'type' => MENU_CALLBACK,
        );

        Menu callback:
    ‣
        function mymodule_js() {
          // Generate $data...
          drupal_json($data);
        }
9                                             Konstantin Käfer
Translation
         Similar to PHP
     ‣

         Drupal.t('This is a string.');
     ‣


         Drupal.t('Do you really want to delete %object?',
     ‣
           { '%object': object.name });

         Drupal.formatPlural(count,
     ‣
           '1 comment', '@count comments');

         POT extractor and Drupal parse JavaScript files
     ‣




10                                                    Konstantin Käfer
Behaviors
         All functions in Drupal.behaviors are executed
     ‣
         onready (when the DOM is ready)

         Functions have to be non-destructive
     ‣

         Functions get a context parameter to act on
     ‣

         Advantage: Can be called later as well
     ‣

         Drupal.behaviors.foo = function(context) {
     ‣

           $('.foo:not(.foo-processed)', context).each(
             function() { … }
           );
         };
11                                                     Konstantin Käfer
Theming
         Theme functions for HTML code
     ‣

         Advantage: Themes can change markup
     ‣

         In the module’s JavaScript:
     ‣
         var elem = Drupal.theme('mymodule');
         $('body').append(elem);

         Drupal.theme.prototype.mymodule = function() { /*...*/ }

         In the theme’s JavaScript:
     ‣
         Drupal.theme.mymodule = function() {
           return $('<div class=quot;mymodulequot;></div>');
         }

12                                                          Konstantin Käfer
1   Functions

     2   Drupal’s JavaScript facilities

     3   Widgets

     4   Debugging & Analyzing


13                                        Konstantin Käfer
Compatibility



14                   Konstantin Käfer
Reusability



15                 Konstantin Käfer
Flexibility



16                 Konstantin Käfer
Encapsulation



17                   Konstantin Käfer
Speed



18           Konstantin Käfer
Initializing
     Drupal.behaviors.horizscroll =
                                 function(context) {
       $('.horizscroll:not(.horizscroll-processed)',
           context).each(function() {

        // <<< Initialize the horizscroll >>>

       }).addClass('horizscroll-processed');
     };




19                                              Konstantin Käfer
Constructor
     Drupal.horizscroll = function(options) {
       var that = this;

      $.extend(this, options);

       //   Store references to elements.
       //   Set first element as the quot;target item.quot;
       //   Initialize left and right buttons.
       //   Initialize the button status.
     };


20                                               Konstantin Käfer
Methods
     Drupal.horizScroll.prototype = {
       // Update the button status based on the
       // position of the content.
       'updateButtons': function() { },

      // Moves the content box to an item.
      'scrollToItem': function() { },

       // Calculate the next target item.
       'findTarget': function() { }
     };

21                                                Konstantin Käfer
1   Functions

     2   Drupal’s JavaScript facilities

     3   Widgets

     4   Debugging & Analyzing


22                                        Konstantin Käfer
Advanced JavaScript console
     ‣

         Logging to the console (console.log())
     ‣

         DOM inspector
     ‣

         JavaScript debugger (with backtrace!)
     ‣

         Profile JavaScript activity
     ‣



         http://getfirebug.com
     ‣

23                                                Konstantin Käfer
JavaScript debugger for IE
     ‣

         Free of charge
     ‣

         Some configuration work needed
     ‣



         http://msdn.microsoft.com/vstudio/express/
     ‣
         vwd/



24                                                Konstantin Käfer
WebDevHelper
         JavaScript console for IE
     ‣

         HTTP Logger
     ‣

         JavaScript backtracer
     ‣



         http://projects.nikhilk.net/WebDevHelper/
     ‣
         Default.aspx




25                                                   Konstantin Käfer
JavaScript Lint
         Lint = tool for analyzing code
     ‣

         Discovers sloppy coding
     ‣

         Command line interface
     ‣

         Use as pre-commit hook for <insert RCS>
     ‣



         http://javascriptlint.com
     ‣

         TextMate bundle: http://andrewdupont.net/
     ‣
         2006/10/01/javascript-tools-textmate-bundle/
26                                                 Konstantin Käfer
Thanks! Questions?



        Konstantin Käfer
          mail@kkaefer.com




27                           Konstantin Käfer
Further reading
         Example taken from
     ‣
         “Front End Drupal”


         Pre-order on Amazon!
     ‣

         Now on Safari Online
     ‣

         In stores in April
     ‣




28                              Konstantin Käfer

Contenu connexe

Tendances

Virtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profitVirtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profitAndreas Heim
 
Advanced JavaScript Concepts
Advanced JavaScript ConceptsAdvanced JavaScript Concepts
Advanced JavaScript ConceptsNaresh Kumar
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinNelson Glauber Leal
 
Kotlin For Android - Basics (part 1 of 7)
Kotlin For Android - Basics (part 1 of 7)Kotlin For Android - Basics (part 1 of 7)
Kotlin For Android - Basics (part 1 of 7)Gesh Markov
 
ClojureScript: The Good Parts
ClojureScript: The Good PartsClojureScript: The Good Parts
ClojureScript: The Good PartsKent Ohashi
 
Kotlin For Android - Constructors and Control Flow (part 2 of 7)
Kotlin For Android - Constructors and Control Flow (part 2 of 7)Kotlin For Android - Constructors and Control Flow (part 2 of 7)
Kotlin For Android - Constructors and Control Flow (part 2 of 7)Gesh Markov
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackNelson Glauber Leal
 
Reactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwiftReactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwiftFlorent Pillet
 
Introduction to reactive programming & ReactiveCocoa
Introduction to reactive programming & ReactiveCocoaIntroduction to reactive programming & ReactiveCocoa
Introduction to reactive programming & ReactiveCocoaFlorent Pillet
 
Swift Sequences & Collections
Swift Sequences & CollectionsSwift Sequences & Collections
Swift Sequences & CollectionsCocoaHeads France
 
Functional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event SystemsFunctional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event SystemsLeonardo Borges
 
Cascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the StreamsCascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the Streamsmattpodwysocki
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jscacois
 
Callbacks and control flow in Node js
Callbacks and control flow in Node jsCallbacks and control flow in Node js
Callbacks and control flow in Node jsThomas Roch
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsPiotr Pelczar
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRAMBLER&Co
 
Realm.io par Clement Sauvage
Realm.io par Clement SauvageRealm.io par Clement Sauvage
Realm.io par Clement SauvageCocoaHeads France
 

Tendances (20)

Virtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profitVirtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profit
 
Advanced JavaScript Concepts
Advanced JavaScript ConceptsAdvanced JavaScript Concepts
Advanced JavaScript Concepts
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com Kotlin
 
Kotlin For Android - Basics (part 1 of 7)
Kotlin For Android - Basics (part 1 of 7)Kotlin For Android - Basics (part 1 of 7)
Kotlin For Android - Basics (part 1 of 7)
 
Map kit light
Map kit lightMap kit light
Map kit light
 
Kotlin wonderland
Kotlin wonderlandKotlin wonderland
Kotlin wonderland
 
ClojureScript: The Good Parts
ClojureScript: The Good PartsClojureScript: The Good Parts
ClojureScript: The Good Parts
 
Kotlin For Android - Constructors and Control Flow (part 2 of 7)
Kotlin For Android - Constructors and Control Flow (part 2 of 7)Kotlin For Android - Constructors and Control Flow (part 2 of 7)
Kotlin For Android - Constructors and Control Flow (part 2 of 7)
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e Jetpack
 
Reactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwiftReactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwift
 
Introduction to reactive programming & ReactiveCocoa
Introduction to reactive programming & ReactiveCocoaIntroduction to reactive programming & ReactiveCocoa
Introduction to reactive programming & ReactiveCocoa
 
Swift Sequences & Collections
Swift Sequences & CollectionsSwift Sequences & Collections
Swift Sequences & Collections
 
Functional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event SystemsFunctional Reactive Programming / Compositional Event Systems
Functional Reactive Programming / Compositional Event Systems
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Cascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the StreamsCascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the Streams
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.js
 
Callbacks and control flow in Node js
Callbacks and control flow in Node jsCallbacks and control flow in Node js
Callbacks and control flow in Node js
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по Dip
 
Realm.io par Clement Sauvage
Realm.io par Clement SauvageRealm.io par Clement Sauvage
Realm.io par Clement Sauvage
 

Similaire à Developing JavaScript Widgets

Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...
Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...
Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...Techsylvania
 
What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?Christophe Porteneuve
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...Atlassian
 
Introduction to Javascript
Introduction to JavascriptIntroduction to Javascript
Introduction to JavascriptAmit Tyagi
 
W3C HTML5 KIG-How to write low garbage real-time javascript
W3C HTML5 KIG-How to write low garbage real-time javascriptW3C HTML5 KIG-How to write low garbage real-time javascript
W3C HTML5 KIG-How to write low garbage real-time javascriptChanghwan Yi
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...go_oh
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS AggregatorShengyou Fan
 
Advanced javascript
Advanced javascriptAdvanced javascript
Advanced javascriptDoeun KOCH
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxbobmcwhirter
 
Building High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 FirestarterBuilding High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 FirestarterMithun T. Dhar
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCpootsbook
 

Similaire à Developing JavaScript Widgets (20)

Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...
Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...
Cristiano Betta (Betta Works) - Lightweight Libraries with Rollup, Riot and R...
 
Java script
Java scriptJava script
Java script
 
What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Swift core
Swift coreSwift core
Swift core
 
JS Essence
JS EssenceJS Essence
JS Essence
 
JavaScript Core
JavaScript CoreJavaScript Core
JavaScript Core
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
 
Introduction to Javascript
Introduction to JavascriptIntroduction to Javascript
Introduction to Javascript
 
W3C HTML5 KIG-How to write low garbage real-time javascript
W3C HTML5 KIG-How to write low garbage real-time javascriptW3C HTML5 KIG-How to write low garbage real-time javascript
W3C HTML5 KIG-How to write low garbage real-time javascript
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
 
Advanced javascript
Advanced javascriptAdvanced javascript
Advanced javascript
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBox
 
Building High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 FirestarterBuilding High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 Firestarter
 
From * to Symfony2
From * to Symfony2From * to Symfony2
From * to Symfony2
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 

Plus de Konstantin Käfer

Plus de Konstantin Käfer (6)

Instant Dynamic Forms with #states
Instant Dynamic Forms with #statesInstant Dynamic Forms with #states
Instant Dynamic Forms with #states
 
Front End Performance
Front End PerformanceFront End Performance
Front End Performance
 
Front End Performance
Front End PerformanceFront End Performance
Front End Performance
 
Front End Performance
Front End PerformanceFront End Performance
Front End Performance
 
Typography on the Web
Typography on the WebTypography on the Web
Typography on the Web
 
What's New in Web Development
What's New in Web DevelopmentWhat's New in Web Development
What's New in Web Development
 

Dernier

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
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
 
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
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
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
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 

Dernier (20)

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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
 
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
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
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
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 

Developing JavaScript Widgets

  • 1. Developing JavaScript Widgets Konstantin Käfer
  • 2. 1 Functions 2 Drupal’s JavaScript facilities 3 Widgets 4 Debugging & Analyzing 2 Konstantin Käfer
  • 3. Functions Functions are first class entities ‣ – Store in variables, pass as parameters, return from functions – Can be defined at any place Functions can contain properties ‣ Anonymous functions ‣ 3 Konstantin Käfer
  • 4. Functions (II) var foo = function(callback) { callback(); return function() { print(quot;Returned function calledquot;); }; }; foo(function() { print(quot;Passed function calledquot;); })(); foo.bar = quot;bazquot;; 4 Konstantin Käfer
  • 5. Prototypal OOP JavaScript doesn’t have classes ‣ Prototype of a function used as base class ‣ var Foo = function() { /* ... */ }; Foo.prototype = { 'bar': function() { /* ... */ }, 'baz': function() { /* ... */ } }; var instance = new Foo(); instance.bar(); instance.baz(); 5 Konstantin Käfer
  • 6. Prototypal OOP (II) Function is constructor ‣ “Instances” have an implicit link to the base ‣ class var Foo = function() { /* ... */ }; Foo.prototype = { 'bar': function() { /* ... */ } }; var instance = new Foo(); instance.bar(); Foo.prototype.baz = function() { /* ... */ }; instance.baz(); 6 Konstantin Käfer
  • 7. Prototypal OOP (III) Any objects can be extended/changed at any ‣ time Number.prototype.celsiusToFahrenheit = function() { return (this * 9 / 5) + 32; }; js> (34).celsiusToFahrenheit(); 93.2 js> (0).celsiusToFahrenheit(); 32 7 Konstantin Käfer
  • 8. 1 Functions 2 Drupal’s JavaScript facilities 3 Widgets 4 Debugging & Analyzing 8 Konstantin Käfer
  • 9. AJAX Callbacks In the menu system: ‣ $items['mymodule/js'] = array( 'title' => 'JavaScript callback', 'page callback' => 'mymodule_js', 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); Menu callback: ‣ function mymodule_js() { // Generate $data... drupal_json($data); } 9 Konstantin Käfer
  • 10. Translation Similar to PHP ‣ Drupal.t('This is a string.'); ‣ Drupal.t('Do you really want to delete %object?', ‣ { '%object': object.name }); Drupal.formatPlural(count, ‣ '1 comment', '@count comments'); POT extractor and Drupal parse JavaScript files ‣ 10 Konstantin Käfer
  • 11. Behaviors All functions in Drupal.behaviors are executed ‣ onready (when the DOM is ready) Functions have to be non-destructive ‣ Functions get a context parameter to act on ‣ Advantage: Can be called later as well ‣ Drupal.behaviors.foo = function(context) { ‣ $('.foo:not(.foo-processed)', context).each( function() { … } ); }; 11 Konstantin Käfer
  • 12. Theming Theme functions for HTML code ‣ Advantage: Themes can change markup ‣ In the module’s JavaScript: ‣ var elem = Drupal.theme('mymodule'); $('body').append(elem); Drupal.theme.prototype.mymodule = function() { /*...*/ } In the theme’s JavaScript: ‣ Drupal.theme.mymodule = function() { return $('<div class=quot;mymodulequot;></div>'); } 12 Konstantin Käfer
  • 13. 1 Functions 2 Drupal’s JavaScript facilities 3 Widgets 4 Debugging & Analyzing 13 Konstantin Käfer
  • 14. Compatibility 14 Konstantin Käfer
  • 15. Reusability 15 Konstantin Käfer
  • 16. Flexibility 16 Konstantin Käfer
  • 17. Encapsulation 17 Konstantin Käfer
  • 18. Speed 18 Konstantin Käfer
  • 19. Initializing Drupal.behaviors.horizscroll = function(context) { $('.horizscroll:not(.horizscroll-processed)', context).each(function() { // <<< Initialize the horizscroll >>> }).addClass('horizscroll-processed'); }; 19 Konstantin Käfer
  • 20. Constructor Drupal.horizscroll = function(options) { var that = this; $.extend(this, options); // Store references to elements. // Set first element as the quot;target item.quot; // Initialize left and right buttons. // Initialize the button status. }; 20 Konstantin Käfer
  • 21. Methods Drupal.horizScroll.prototype = { // Update the button status based on the // position of the content. 'updateButtons': function() { }, // Moves the content box to an item. 'scrollToItem': function() { }, // Calculate the next target item. 'findTarget': function() { } }; 21 Konstantin Käfer
  • 22. 1 Functions 2 Drupal’s JavaScript facilities 3 Widgets 4 Debugging & Analyzing 22 Konstantin Käfer
  • 23. Advanced JavaScript console ‣ Logging to the console (console.log()) ‣ DOM inspector ‣ JavaScript debugger (with backtrace!) ‣ Profile JavaScript activity ‣ http://getfirebug.com ‣ 23 Konstantin Käfer
  • 24. JavaScript debugger for IE ‣ Free of charge ‣ Some configuration work needed ‣ http://msdn.microsoft.com/vstudio/express/ ‣ vwd/ 24 Konstantin Käfer
  • 25. WebDevHelper JavaScript console for IE ‣ HTTP Logger ‣ JavaScript backtracer ‣ http://projects.nikhilk.net/WebDevHelper/ ‣ Default.aspx 25 Konstantin Käfer
  • 26. JavaScript Lint Lint = tool for analyzing code ‣ Discovers sloppy coding ‣ Command line interface ‣ Use as pre-commit hook for <insert RCS> ‣ http://javascriptlint.com ‣ TextMate bundle: http://andrewdupont.net/ ‣ 2006/10/01/javascript-tools-textmate-bundle/ 26 Konstantin Käfer
  • 27. Thanks! Questions? Konstantin Käfer mail@kkaefer.com 27 Konstantin Käfer
  • 28. Further reading Example taken from ‣ “Front End Drupal” Pre-order on Amazon! ‣ Now on Safari Online ‣ In stores in April ‣ 28 Konstantin Käfer