+ All Categories
Home > Documents > Manual ExtCore 3

Manual ExtCore 3

Date post: 04-Apr-2018
Category:
Upload: jorge-segundino-ponce-delacruz
View: 221 times
Download: 0 times
Share this document with a friend

of 44

Transcript
  • 7/30/2019 Manual ExtCore 3

    1/44

    ExtCore 3.0 Manual

    Written by techbughttp://techbug.tistory.com

    http://extjs.com/products/extcore/manual/index.php.

    http://techbug.tistory.com/http://extjs.com/products/extcore/manual/index.phphttp://extjs.com/products/extcore/manual/index.phphttp://extjs.com/products/extcore/manual/index.phphttp://techbug.tistory.com/
  • 7/30/2019 Manual ExtCore 3

    2/44

    ExtCore Overview

    Ext Core is a lightweight and feature rich core JavaScript library available under an MIT license. Ext Core is packed

    full of exciting features intended to allow for rapid web development while encouraging well designed and scalable

    code. This library provides abstractions for DOM manipulation/traversal, Ajax, Events and custom events,animations, templating, OO mechanisms and more. Ext Core is released under an MIT license and is perfect for

    inclusion in a dynamic webpage or even a small application.

    Download

    Ext Core can be downloadedhereand the latest information can be found on theExt Core Project Page.

    Including Ext Core

    Ext Core ships with both a debug version as well as a production version. The production version has been minified

    (whitespace, carriage returns and comments removed) and obfuscated (all local variables have been renamed to

    shorter versions) using YUI Compressor. You should always use the -debug version when developing since you'll

    receive more informative (ie: unobfuscated) error messages.

    To include the Ext Core library's development version, simply include the following JavaScript file:

    And for the production version (25k compressed and gzipped), simply remove "-debug":

    That's it. There is no css file to include with Ext Core.

    Simple Example

    After you have included Ext Core to your web page, try out the following code to check if everything working

    correctly

    Ext.onReady(function() {

    Ext.DomHelper.append(document.body, {tag: 'p', cls: 'some-class'});

    Ext.select('p.some-class').update('Ext Core successfully injected');

    });

    About

    The Ext Core Manual was authored by Tommy Maintz, Aaron Conran, James Donaghue, Jamie Avins & Evan

    Trimboli. Thank you to all reviewers who reviewed the manual prior to its release. We are currently looking for

    translations to all other languages.

    The Ext Core Manual is licensed under the GNU FDL,GNU Free Documentation License.

    Copyright (C) 2009 Ext JS, LLC.

    Permission is granted to copy, distribute and/or modify this document

    under the terms of the GNU Free Documentation License, Version 1.3

    or any later version published by the Free Software Foundation;

    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

    A copy of the license is included in the section entitled "GNUFree Documentation License".

    http://extjs.com/products/extcore/download.phphttp://extjs.com/products/extcore/download.phphttp://extjs.com/products/extcore/download.phphttp://extjs.com/products/extcore/http://extjs.com/products/extcore/http://extjs.com/products/extcore/http://www.gnu.org/copyleft/fdl.htmlhttp://www.gnu.org/copyleft/fdl.htmlhttp://www.gnu.org/copyleft/fdl.htmlhttp://www.gnu.org/copyleft/fdl.htmlhttp://extjs.com/products/extcore/http://extjs.com/products/extcore/download.php
  • 7/30/2019 Manual ExtCore 3

    3/44

  • 7/30/2019 Manual ExtCore 3

    4/44

    Ext.Elements

    Getting Ext.Elements

    An HTML Document typically consists of a lot of html markup. When the browser loads your html document, each

    tag in your markup get translated into an HTMLElement and the browser builds aDocument Object Model(DOM)

    tree of the markup. This DOM tree is saved in the browser's global scope in a variable called document. This

    document variable holds a reference to every piece of markup which has been loaded on the page.

    The documentobject provides an important method namedgetElementById. This method allows you to retrieve

    the underlyingHTMLElementin any browser. However, you should be mindful that there are many differences

    among browsers when directly manipulating the DOM. Ext Core implements a class named Ext.Element

    which wraps around typical HTMLElement's providing you cross-browser support.

    Ext.Element has the most methods out of any class in the Ext Core library. These methods can be categorized as

    follows:

    CSS & Styling

    (eg: setStyle, addClass)

    Dom Querying or Traversal

    (eg: query, select, findParent)

    Dom Manipulation

    (eg: createChild, remove)

    Dimensions

    (eg: getHeight, getWidth)

    You can use the method Ext.get to create an instance of an Ext.Element which wraps around any HTMLElement.

    For example, if your markup had an element with an id of 'myElementId' you could retrieve it like this.

    var el = Ext.get('myElementId');

    UsingFirebug, try executing the following code. Observe the methods exposed by Ext.Element. Remember that

    because you are looking at the raw JS Object, both public as well as private methods are visible. When in doubt,

    consult the API documentation.

    var el = Ext.get('myElementId');

    console.dir(el);

    console.diris a method provided by Firebug which will dump out the contents of an object in an easily viewable

    format. It also allows you to expand and collapse sub-objects which have additional properties. Properties are

    shown in the color black. Methods/Functions are green; constructors or classes in red.

    Now let's try interacting with the paragraph above which has an id ofmyElementId.

    var el = Ext.get('myElementId');

    el.addClass('error');

    https://developer.mozilla.org/En/DOMhttps://developer.mozilla.org/En/DOMhttps://developer.mozilla.org/En/DOMhttps://developer.mozilla.org/en/DOM/document.getElementByIdhttps://developer.mozilla.org/en/DOM/document.getElementByIdhttps://developer.mozilla.org/en/DOM/document.getElementByIdhttps://developer.mozilla.org/en/DOM/elementhttps://developer.mozilla.org/en/DOM/elementhttps://developer.mozilla.org/en/DOM/elementhttp://www.getfirebug.com/http://www.getfirebug.com/http://www.getfirebug.com/http://getfirebug.com/console.htmlhttp://getfirebug.com/console.htmlhttp://getfirebug.com/console.htmlhttp://www.getfirebug.com/https://developer.mozilla.org/en/DOM/elementhttps://developer.mozilla.org/en/DOM/document.getElementByIdhttps://developer.mozilla.org/En/DOM
  • 7/30/2019 Manual ExtCore 3

    5/44

    After executing this code, the font color in the paragraph above will change to red. This page has a CSS rule which

    changes all elements with a class of error to the color red. The CSS rule looks like this:

    .error {

    color: red;

    }

    The next section on Ext.Element (CSS Classes & Styling) will cover many ways to interact with with your elements'

    CSS classes and styling.

    Introducing the Flyweight

    TheFlyweight Design Patternis a pattern used to minimize memory usage by creating a single global object and

    then re-using that object over and over again. Ext creates a global Ext.Element to use as the Flyweight when it

    starts up. This global flyweight instance can then be used to target any node in the Dom. To access this flyweight

    object you can use the Ext.fly method. Those new to Ext often express confusion about whether to use Ext.get or

    Ext.fly:

    Whenever a reference to an Ext.Element is required to be saved for later use, use the Ext.get method. For times

    when you don't need to store a reference to the element, you can use the shared flyweight Ext.Element across the

    library. To access this flyweight object, use the method Ext.fly(elementId).

    Let's remove the error class from the paragraph above.

    Ext.fly('myElementId').removeClass('error');

    When this code was executed, Ext was able to re-use the existing shared flyweight object and did not have to

    instantiate a brand new instance of an Ext.Element. The fly method is appropriate in situations executing a single,

    one-lined, atomic operation. You never want to try to store a reference to the flyweight object, since it is subject

    to change by some other snippet of code. For an example, let's take a look at the following example.

    var el = Ext.fly('foo');

    Ext.fly('bar').frame();el.addClass('error');

    frame is a highlighting effect that is included in the animation package of Ext.Element. What do you think the

    results would be?

    The answer is that the element with an id of bar will have the frame effect applied to it and then immediately after

    it will also have the CSS class of error applied to it. Nothing will happen to the element with an id of foo, because

    the reference elpoints to the global flyweight which was overwritten when we used the frame effect on bar. If you

    did not expect this, re-read the section about flyweights as it is an important concept if you wish to use the Ext.fly

    method.

    Ext.getExt.get takes an HTMLElement, Ext.Element, String id as a parameter and returns a new instance of an

    Ext.Element.

    All three of the following return an Ext.Element:

    var el1 = Ext.get('elId'); // takes an element id

    var el2 = Ext.get(el1); // takes an Ext.Element

    var el3 = Ext.get(el1.dom); // takes an HTMLElement

    Ext.flyExt.fly takes the same argument as Ext.get but it returns a reference to an internally managed flyweight instance

    of an Ext.Element. Never store a reference to the flyweight object as it will change per invocation of this method.

    It is intended purely as a mechanism to enhance performance by circumventing the need to instantiate a newExt.Element when a reference in not needed (eg: if you just want to perform an action).

    Here is an example of using Ext.fly:

    http://en.wikipedia.org/wiki/Flyweight_patternhttp://en.wikipedia.org/wiki/Flyweight_patternhttp://en.wikipedia.org/wiki/Flyweight_patternhttp://en.wikipedia.org/wiki/Flyweight_pattern
  • 7/30/2019 Manual ExtCore 3

    6/44

    // We want to perform only one discrete action on this element.

    Ext.fly('elId').hide();

    Ext.getDomExt.getDom returns a dom node for the passed in String (id), dom node, or Ext.Element.

    Here are some examples:

    // gets dom node based on id

    var elDom = Ext.getDom('elId');// gets dom node based on the dom node

    var elDom1 = Ext.getDom(elDom);

    // If we don't know if we are working with an

    // Ext.Element or a dom node use Ext.getDom

    function(el){

    var dom = Ext.getDom(el);

    // do something with the dom node

    }

    CSS Clases & Styling

    We have learned about markup, how that relates to the document and the methods that Ext Core provides making

    it easy to retrieve that data. What about the layout of the document though? How do we manipulate the layout

    and styling of the document? The answer is to useCascading Style Sheets (CSS)styling. CSS is the language by

    which we can control layout and visual information about our page. Ext Core makes it really easy to manipulate

    the style of elements in the document through classes or by modifying styles directly.

    myCls {

    color: #F00;

    }

    ...

    Hello

    In the example above the class 'myCls' is applied to the div giving the text 'Hello' a visual color of red (#F00).

    Now that we have already learned about firebug, take a look some more of the wonderful tools that it has to offer

    us. Right click on any element in the page and choose "Inspect Element". Now in firebug we can see the dom tree

    and where that element is located. If you look to the right of that tree you will see a panel with all of the styles

    applied to that element.

    If you're not yet familiar with using FireBug, pause now and learn all about it -- it's the oscilloscope of web-

    http://www.w3.org/Style/CSS/http://www.w3.org/Style/CSS/http://www.w3.org/Style/CSS/
  • 7/30/2019 Manual ExtCore 3

    7/44

    development. Inspect-element comes in handy for changing styles on an existing site or creating and debugging

    styles on a new site. So lets explore the methods that Ext Core provides to make css modifications easier for you.

    addClassTo easily add a class to an element:

    Ext.fly('elId').addClass('myCls'); // adds the class 'myCls' to the element

    radioClassAdd class in one element and remove that same class if it exists from all of its siblings in one call.

    // add the class 'myCls' to the element and remove that same class from

    // all sibilings.

    Ext.fly('elId').radioClass('myCls');

    removeClassRemove one or more classes from an element.

    Ext.fly('elId').removeClass('myCls'); // remove the class from the element

    toggleClassToggle a class on/off. If it isn't applied to the element it will be, it is is then it will be removed.

    Ext.fly('elId').toggleClass('myCls'); // the class is addedExt.fly('elId').toggleClass('myCls'); // the class is removed

    Ext.fly('elId').toggleClass('myCls'); // the class is added again

    hasClassCheck to see if the element has the class applied.

    if (Ext.fly('elId').hasClass('myCls')) {

    // it has the class

    }

    replaceClassReplace the class a with class b.

    Ext.fly('elId').replaceClass('myClsA', 'myClsB');

    getStyleGets a normalized (currentStyle and computed style) property from the element.

    var color = Ext.fly('elId').getStyle('color');

    var zIndx = Ext.fly('elId').getStyle('z-index');

    var fntFmly = Ext.fly('elId').getStyle('font-family');

    // ... etc.

    setStyleSet style properties on an element. Takes a string or an object literal.

    Ext.fly('elId').setStyle('color', '#FFFFFF');

    Ext.fly('elId').setStyle('z-index', 10);

    Ext.fly('elId').setStyle({

    display : 'block',

    overflow : 'hidden',

    cursor : 'pointer'

    });

    // animate the transition of color

    Ext.fly('elId').setStyle('color', '#FFFFFF', true);// animate the transition of color with a duration of .75 seconds

    Ext.fly('elId').setStyle('color', '#FFFFFF', {duration: .75});

    // ... etc.

  • 7/30/2019 Manual ExtCore 3

    8/44

    getColorGets a normalized (6 digit hex) color value for the passed in property, accepts a default value if the property is not

    set and a prefix (# is the default).

    Ext.fly('elId').getColor('background-color');

    Ext.fly('elId').getColor('color');

    Ext.fly('elId').getColor('border-color');

    // ... etc.

    setOpacitySets the opacity of the element.

    Ext.fly('elId').setOpacity(.5);

    Ext.fly('elId').setOpacity(.45, true); // animates

    // animates with a duration of half a second

    Ext.fly('elId').setOpacity(.45, {duration: .5});

    clearOpacityClears any opacity settings of the element.

    Ext.fly('elId').clearOpacity();

    Dom Traversal

    Frequently we want to navigate around the dom tree from any given position that we are working in. Ext Core

    provides many useful cross browser methods that give you trememndous power in traversing up, down and all

    around the dom. Again CSS comes to the rescue when we want to perform complex navigations rather easily. The

    use of CSS3 selectors has a powerful application in this domain. Take the following markup:

    .red {

    color: #F00;

    }

    ...

    a-one

    a-two

    a-three

    a-four

    b-one

    b-two

    b-three

    Now say you have a requirement to make every other list item have red text. Ext Core allows you to solve this

    elegantly with the following one-liner.

    Ext.fly('elId').select('li:nth-child(2n)').addClass('red');

    Here is the result:

  • 7/30/2019 Manual ExtCore 3

    9/44

    Now that we've seen some of the power in Ext Core's Dom Traversal API, lets explore more:

    isTests the current element to see if it matches the selector.

    var el = Ext.get('elId');

    if (el.is('p.myCls')) {

    // do something

    }

    findParentFinds a parent node that matches the selector, starts at the current node.

    Ext.fly('elId').findParent('div'); // returns a dom node

    Ext.fly('elId').findParent('div', 4); // looks up 4 parent nodes

    Ext.fly('elId').findParent('div', null, true); // returns an Ext.Element

    findParentNodeFinds a parent node that matches the selector, starts at the parent node.

    Ext.fly('elId').findParentNode('div');

    upFinds a parent node that matches the selector, starts at the parent node. This returns an Ext.Element

    Ext.fly('elId').up('div');

    Ext.fly('elId').up('div', 5); // only looks up 5 parents

    selectSelect takes a query and returns an Ext.CompositeElement or an array of Ext.Elements. Also if you call this from

    an element it is used as the root to start the query, if it is called from Ext.select the entire document is searched.

    // CompositeElement of results is returned

    Ext.fly('elId').select('div:nth-child(2)');

    // Array of elements is returned

    Ext.fly('elId').select('div:nth-child(2)', true);

    // Entire document is searchedExt.select('div:nth-child(2)');

    querySelect takes a query and returns an array of dom nodes. Takes an optional root element as a second argument, if

    this is not present it defaults to document root.

    Ext.query('div:nth-child(2)'); // Array of dom nodes that matched the selector

    childChild selects a single child at any given depth below the current element based on the passed in selector.

    Ext.fly('elId').child('p.highlight'); // returns an Ext.Element

    Ext.fly('elId').child('p.highlight', true); // returns a dom node

    downSelects a single direct child based on the passed in selector.

  • 7/30/2019 Manual ExtCore 3

    10/44

    Ext.fly('elId').down('span'); // returns an Ext.Element

    Ext.fly('elId').down('span', true); // returns a dom node

    parentGets the parent node for this element. If a selector is passed in it will go up the chain looking for a match.

    // grabs the parent node as and Ext.Element

    Ext.fly('elId').parent();

    // grabs the parent node as a dom nodeExt.fly('elId').parent("", true);

    // grabs the first parent that is a div, returns Ext.Element

    Ext.fly('elId').parent("div");

    nextGets the next sibling skipping text nodes. If a selector is passed in it will filter for that selector.

    // grabs the next sibling node as and Ext.Element

    Ext.fly('elId').next();

    // grabs the next sibling node as a dom node

    Ext.fly('elId').next("", true);// grabs the next sibling node that is a div, returns Ext.Element

    Ext.fly('elId').next("div");

    prevGets the previous sibling skipping text nodes. If a selector is passed in it will filter for that selector.

    // grabs the previous sibling node as and Ext.Element

    Ext.fly('elId').prev();

    // grabs the previous sibling node as a dom node

    Ext.fly('elId').prev("", true);

    // grabs the previous sibling node that is a div, returns Ext.Element

    Ext.fly('elId').prev("div");

    firstGets the first sibling skipping text nodes. If a selector is passed in it will filter for that selector.

    // grabs the first sibling node as and Ext.Element

    Ext.fly('elId').first();

    // grabs the first sibling node as a dom node

    Ext.fly('elId').first("", true);

    // grabs the first sibling node that is a div, returns Ext.Element

    Ext.fly('elId').first("div");

    lastGets the last sibling skipping text nodes. If a selector is passed in it will filter for that selector.

    // grabs the last sibling node as and Ext.Element

    Ext.fly('elId').last();

    // grabs the last sibling node as a dom node

    Ext.fly('elId').last("", true);

    // grabs the last sibling node that is a div, returns Ext.Element

    Ext.fly('elId').last("div");

  • 7/30/2019 Manual ExtCore 3

    11/44

    Manipulation

    Elements

    In a dynamic page one of the most frequent tasks is to create or remove elements in the DOM. Due to

    inconsistencies between browsers this can prove to be a challenging task. Ext Core provides a stong API that

    abstracts these cross browser inconsistencies and is internally optimized for efficiency. We can easily add, remove

    or replace nodes in the Dom tree at any position we want relative to siblings and parents using Ext Core's Dom

    Manipulation API. Let's take a look for ourselves -- observe the following markup:

    paragraph one

    paragraph two

    paragraph three

    Here is a screenshot of the markup:

    Lets create a new node and insert this as a first child of 'elId':

    Ext.fly('elId').insertFirst({

    tag: 'p',

    html: 'Hi I am the new first child'

    });

    Now we can see that our node was inserted:

    Easy enough! -- lets explore some of the more powerful mainuplation API's provided by Ext Core:

    appendChildAppends the passed element(s) to this element.

    var el = Ext.get('elId1');

    // append the dom node with this id.

    Ext.fly('elId').appendChild('elId2');

    // append an Ext.Element

    Ext.fly('elId').appendChild(el);

    // append the result of an array of selectors

    Ext.fly('elId').appendChild(['elId2','elId3']);

    // append a straight dom node

    Ext.fly('elId').appendChild(el.dom);

    // append a CompositeElement of all divs

    Ext.fly('elId').appendChild(Ext.select('div'));

    appendToAppends this element to the passed in element.

  • 7/30/2019 Manual ExtCore 3

    12/44

    var el = Ext.get('elId1');

    Ext.fly('elId').appendTo('elId2'); // append to the dom node with this id.

    Ext.fly('elId').appendTo(el); // append to the Ext.Element el

    insertBeforeInserts this element before the passed in element.

    var el = Ext.get('elId1');

    // inserts before the dom node with this id.

    Ext.fly('elId').insertBefore('elId2');

    // inserts before the Ext.Element el

    Ext.fly('elId').insertBefore(el);

    insertAfterInserts this element after the passed in element.

    var el = Ext.get('elId1');

    // inserts after the dom node with this id.

    Ext.fly('elId').insertAfter('elId2');

    // inserts after the Ext.Element el

    Ext.fly('elId').insertAfter(el);

    insertFirstTakes an element, id, or DomHelper config and inserts the existing node or creates a new element from the

    DomHelper config as the first child of this element.

    var el = Ext.get('elId1');

    // inserts the dom node with this id as the first child.

    Ext.fly('elId').insertFirst('elId2');

    // inserts the Ext.Element el as the first child

    Ext.fly('elId').insertFirst(el);

    // creates a new node with the DomHelper config and inserts

    // the result as the first child.

    Ext.fly('elId').insertFirst({

    tag: 'p',

    cls: 'myCls',html: 'Hi I am the new first child'

    });

    replaceReplace the passed in element with this element.

    var el = Ext.get('elId1');

    // replaces the element with id 'elId2' with 'elId'.

    Ext.fly('elId').replace('elId2');

    // replaces the element with id 'elId1' with 'elId'Ext.fly('elId').replace(el);

    replaceWithTakes an element, id, or DomHelper config and replaces this element with the existing node or the newly created

  • 7/30/2019 Manual ExtCore 3

    13/44

    element from the DomHelper config.

    var el = Ext.get('elId1');

    Ext.fly('elId').replaceWith('elId2'); // replaces 'elId' with 'elId2'.

    Ext.fly('elId').replaceWith(el); // replaces 'elId' with 'elId1'

    // creates a new node with the DomHelper config

    // and replaces 'elId' with this node.

    Ext.fly('elId').replaceWith({

    tag: 'p',

    cls: 'myCls',

    html: 'Hi I have replaced elId'

    });

    DomHelper configs

    In the examples above, perhaps you notice the following:

    .insertFirst({tag: 'p',

    html: 'Hi I am the new first child'

    });

    You may have wondered what the 1st argument to insertFirst is. This is a DomHelper config which represents the

    markup to be created. DomHelper configs support many properties for specifying child nodes, such as html

    fragments and DomNode attributes (css classes, url, src, id, etc). Here are some of the API's available on

    Ext.Element that allow you to interact directly with Ext.DomHelper:

    createChildCreates the passed DomHelper config and appends it to this element or optionally inserts it before the passed childelement.

    var el = Ext.get('elId');

    var dhConfig = {

    tag: 'p',

    cls: 'myCls',

    html: 'Hi I have replaced elId'

    };

    // creates a new node and appends it to 'elId'.

    el.createChild(dhConfig);

    // creates a new node and inserts before el's first child.

    el.createChild(dhConfig, el.first());

    wrapWraps this element with a newly created element

    Ext.fly('elId').wrap(); // wraps elId with a div

    // wraps elId with the newly create element

    Ext.fly('elId').wrap({

    tag: 'p',cls: 'myCls',

    html: 'Hi I have replaced elId'

    });

  • 7/30/2019 Manual ExtCore 3

    14/44

    Html Fragments

    Html fragments are just what they sound like, fragments of html markup. Ext Core provides the ability to modify

    the dom with html fragments, allowing you to focus upon just those fragments of markup that you intend to

    modify the dom with, freeing you from browser implementation and performance worries. Ext Core does all of that

    for you -- all you need to do is provide the markup. For example, given the following markup:

    onetwo

    three

    four

    What do you think the following Ext Core code will do?

    Ext.fly('elId').insertHtml('beforeBegin', '

    Hi

    ')

    Lets take a look at the markup afterward:

    Hi

    one

    two

    three

    four

    Suprised? That's because we are able to specify the relative position where we want this markup applied. We

    specified 'beforeBegin'. What about this:

    Ext.fly('elId').insertHtml('afterBegin', '

    Hi

    ')

    Lets take a look:

    Hi

    one

    two

    three

    four

    Now we will use 'beforeEnd'.

    Ext.fly('elId').insertHtml('beforeEnd', '

    Hi

    ')

    Lets take a look:

    one

    two

    three

    four

    Hi

    And finally lets look at 'afterEnd'.

  • 7/30/2019 Manual ExtCore 3

    15/44

    Ext.fly('elId').insertHtml('beforeEnd', '

    Hi

    ')

    Lets take a look:

    one

    two

    three

    four

    Hi

    The following API is yeaprovided for you to work with html fragments.

    insertHtmlInserts an html fragment into this element. You need to specify where (beforeBegin, beforeEnd, afterBegin,

    afterEnd) the fragment and can optionally specify if you want an Ext.Element returned instead of the dom node.

    Ext.fly('elId').insertHtml(

    'beforeBegin',

    '

  • 7/30/2019 Manual ExtCore 3

    16/44

    Event handling poses one of the most troublesome differences among the browsers. Ext Core abstracts the

    differences you would encounter to achieve cross-browser event handling. If you were to use each browser's

    native event handling mechanism you need to use different methods to register and unregister events in addition

    to a myriad of other frustrating inconsistencies.

    Ext Core provides a rich event model which frees one from these differences by using a single clean, consistent

    interface. Just as Ext.Element wraps around a native Dom node, Ext Core will also wrap the browser's native

    event-object with an instance of Ext.EventObject. Ext.EventObject normalizes cross-browser differences, such as

    which mouse button is clicked, keys pressed, mechanisms to stop event-propagation along with a method toprevent default actions from taking place.

    To tie an event handler to an element on the page we will use the on method of Ext.Element. The on method is a

    preferred shorthand for addListener. The first argument specifies which event to subscribe to and the second

    argument specifies the function to run when that event occurs.

    Ext.fly('myEl').on('click', function(e, t) {

    // perform an action on click of myEl

    // e is an Ext.EventObject describing what occured

    // t is the target HTMLElement

    });

    Ext Core normalizes the arguments of all Dom events. The event handler which is tied to the event will always

    receive a normalized event object (Ext.EventObject) and the target HTMLElement.

    Let's take a look at the API provided for Event Handling:

    addListener/onAppends an event handler to this element. The shorthand version on is equivalent and preferred for concise code.

    var el = Ext.get('elId');

    el.on('click', function(e,t) {

    // e is a normalized event object (Ext.EventObject)

    // t the target that was clicked, this is an Ext.Element.// this also points to t.

    });

    removeListener/unRemoves an event handler from this element. The shorthand version un is equivalent.

    var el = Ext.get('elId');

    el.un('click', this.handlerFn);

    // or

    el.removeListener('click', this.handlerFn);

    Ext.EventObjectEventObject exposes a cross-browser consistent event model mimicking the standard W3C methods if necessary.

    // e is not a standard event object, it is a Ext.EventObject

    function handleClick(e){

    e.preventDefault();

    var target = e.getTarget();

    ...

    }

    var myDiv = Ext.get('myDiv');

    myDiv.on("click", handleClick);

    //or

    Ext.EventManager.on('myDiv', 'click', handleClick);

    Ext.EventManager.addListener('myDiv', 'click', handleClick);

  • 7/30/2019 Manual ExtCore 3

    17/44

    Advanced Event Handling

    Ext Core has several convenience configurations for more advanced event handling techniques such as event

    delegation, buffering, and delays.

    delegationEvent delegation is a technique that is used to reduce memory consumption and prevent exposure to memory-

    leaks. The basic idea is this:

    Rather than registering an event handler for each element in a group of elements, register it once in a container

    element taking advantage of the bubbling phase in the event life-cycle and centralize the event-handling at the

    container level.

    This doesn't mean that you want to register one global handler on the body element, as any action on the page

    that fired an event would bubble up to that handler and probably have the reverse effect, actually degrading

    performance. This technique is extremely useful in situations like a drop-down, a calendar, etc. Anywhere you

    have a group of elements that can be directly or almost directly contained by a container element. Lets take a

    look:

    Take the following markup:

    Instead of registering a handler directly upon each list item as follows:

    Ext.fly('btn-edit').on('click, function(e,t) {

    // handle the event

    });

    Ext.fly('btn-delete').on('click, function(e,t) {

    // handle the event});

    Ext.fly('btn-cancel').on('click, function(e,t) {

    // handle the event

    });

    To use the event delegation technique instead, registering just one handler on the container along with

    accompanying logic:

    Ext.fly('actions').on('click, function(e,t) {

    switch(t.id) {

    case ''btn-edit':

    // handle the event

    break;

    case 'btn-delete':

    // handle the event

    break;

    case 'btn-cancel':

    // handle the event

    break;

    }

    });Because events bubble up the dom hierarchy, they will reach the handler that we registered on the 'actions' div.

    We then use a simple switch to execute the required code. This approach scales well because we can add many

    different child elements and still maintain a single event handler.

  • 7/30/2019 Manual ExtCore 3

    18/44

    delegateThis is a configuration option that you can pass along when registering a handler for an event to assist with event

    delegation. By setting this configuration option to a simple selector, Ext Core will filter the target or look for a

    descendant of the target.

    el.on('click', function(e,t) {

    // handle click

    }, this, {// will filter target to be a descendant with the class 'clickable'

    delegate: '.clickable'

    });

    hoverExt Core has a cross browser solution for creating a hover effect. The hover method will ensure that a function is

    run when the mouse enters an element and when the mouse leaves an element. mouseenter and mouseleave are

    native Internet Explorer events which will filter mouseout and mouseover events when you are when working with

    child elements. Ext Core implements these events for W3C compliant browsers so that you can use them in any

    browser.

    // handles when the mouse enters the elementfunction enter(e,t){

    t.toggleClass('red');

    }

    // handles when the mouse leaves the element

    function leave(e,t){

    t.toggleClass('red');

    }

    // subscribe to the hover

    el.hover(over, out); removeAllListeners

    Removes all previous added listeners from this element

    el.removeAllListeners();

    singleThis is a configuration option that you can pass along when registering a handler for the event. When set to true,

    the handler will fire just once then automatically remove itself.

    el.on('click', function(e,t) {

    // handle click

    }, this, {single: true// will remove the event after its first firing.

    });

    bufferThis is a configuration option that you can pass along when registering a hanlder for the event. This causes the

    handler to be scheduled to run in an Ext.util.DelayedTask delayed by the specified number of milliseconds. If the

    event fires again within that time, the original handler is not invoked, but the new handler is scheduled in its place.

    el.on('click', function(e,t) {

    // handle click

    }, this, {

    buffer: 1000 // will delay and buffer the firing of//this event after its initial fire 1000 miliseconds (or 1 second).

    });

    delay

  • 7/30/2019 Manual ExtCore 3

    19/44

    This is a configuration option that you can pass along when registering a hanlder for the event. The number of

    milliseconds to delay the invocation of the handler after te event fires.

    el.on('click', function(e,t) {

    // handle click

    }, this, {

    // will delay the firing of this event after its initial

    // fire 1000 miliseconds (or 1 second).

    delay: 1000

    });

    targetThis is a configuration option that you can pass along when registering a hanlder for the event. If you have a

    specific target that you want to handle for only, you can assign a reference of it to this config option and Ext Core

    will make sure that your handler gets only calls the handler when it has reached that node in its bubbling phase.

    el.on('click', function(e,t) {

    // handle click

    }, this, {// only handles the event when it has bubbled up to the first 'div'.

    target: el.up('div')

    });

    Dimensions & Sizing

    Often we need to retrieve or change the dimensions of some particular element on a page. Once again, Ext Core

    abstracts dimensioning through a clean API. Most of the setter-methods accept animation configurations or a

    straight boolean true to animate the action. Let's take a look:

    // changes the height to 200px and animates with default configuration

    Ext.fly('elId').setHeight(200, true);

    // changes the height to 150px and animates with a custom configuration

    Ext.fly('elId').setHeight(150, {

    duration : .5, // animation will have a duration of .5 seconds

    // will change the content to "finished"

    callback: function(){ this.update("finished"); }

    });

    Pull up firebug, inspect and element (right click and then click on 'Inspect Element') and take a look at the right

    panel and click on "layout". You should see something like this:

    This information is extremely useful since it provides all the dimensions of the inspected-element. Notice the

    element has a width of 895px, a height of 1669px, 0px padding all around, 0px border all around and 0px margin.

    All this information is available to you through Ext Core's Dimensioning API of Ext.Element!

  • 7/30/2019 Manual ExtCore 3

    20/44

    var dimSz = Ext.get('dim-sizing');

    var padding = dimSz.getPadding('lrtb'); // has value of 0px

    var border = dimSz.getBorderWidth('lrtb'); // has value of 0px

    var height = dimSz.getHeight(); // has value of 1691px

    var width = dimSz.getWidth(); // has value of 895px

    Grab this code and run it in firebug to see for yourself. In fact go a step further and try using the setters to modify

    the height and width and see what happens to the box in the firebug layout panel. (NOTE: if your height andwidth are different from the image, that is because of the dimensions of your browser. If you navigate of inspect

    that element in you actual browser the outputs should match.)

    Lets explore the rest of the API:

    getHeightReturns the offset height of the element

    var ht = Ext.fly('elId').getHeight();

    getWidthReturns the offset width of the element

    var wd = Ext.fly('elId').getWidth(); setHeight

    Set the height of the element

    Ext.fly('elId').setHeight();

    setWidthSet the width of the element

    Ext.fly('elId').setWidth();

    getBorderWidthGets the width of the border(s) for the specified side(s). Side can be t, l, r, b or any combination of those to add

    multiple values. For example, passing lr would get the border (l)eft width + the border (r)ight width.

    var bdr_wd = Ext.fly('elId').getBorderWidth('lr');

    getPaddingGets the width of the padding(s) for the specified side(s). Side can be t, l, r, b or any combination of those to add

    multiple values. For example, passing lr would get the padding (l)eft + the padding (r)ight

    var padding = Ext.fly('elId').getPadding('lr');

    clipStore the current overflow setting and clip overflow on the element - use unclip to remove

    Ext.fly('elId').clip();

    unclipReturn clipping (overflow) to original clipping before clip() was called

    Ext.fly('elId').unclip();

    isBorderBoxTrue if the detected browser is Internet Explorer running in non-strict mode.

    if (Ext.isBorderBox) {

    // do something

    }

    PositioningThrough Ext Core's positioning API it's a snap to get and set all aspects of an element's position across all

    browsers. Similar to the dimension API, most of the setters support animations, either through a boolean true (for

  • 7/30/2019 Manual ExtCore 3

    21/44

    defaults) or by passing an object-literal configuration object as the second argument. Lets see an example of what

    this looks like: Lets see an example of what this looks like:

    // changes the x-coord to 75px and animates with a custom configuration

    Ext.fly('elId').setX(75, {

    duration : .5, // animation will have a duration of .5 seconds

    // will change the content to "finished"

    callback: function(){ this.update("finished"); }});

    getXGets the current X position of the element based on page coordinates. Element must be part of the DOM tree to

    have page coordinates (display:none or elements not appended return false).

    var elX = Ext.fly('elId').getX()

    getYGets the current Y position of the element based on page coordinates. Element must be part of the DOM tree to

    have page coordinates (display:none or elements not appended return false).

    var elY = Ext.fly('elId').getY()

    getXYGets the current position of the element based on page coordinates. Element must be part of the DOM tree to

    have page coordinates (display:none or elements not appended return false).

    var elXY = Ext.fly('elId').getXY() // elXY is an array

    setXSets the X position of the element based on page coordinates. Element must be part of the DOM tree to have page

    coordinates (display:none or elements not appended return false).

    Ext.fly('elId').setX(10)

    setYSets the Y position of the element based on page coordinates. Element must be part of the DOM tree to have pagecoordinates (display:none or elements not appended return false).

    Ext.fly('elId').setY(10)

    setXYSets the position of the element in page coordinates, regardless of how the element is positioned. The element

    must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).

    Ext.fly('elId').setXY([20,10])

    getOffsetsToReturns the offsets of this element from the passed element. Both element must be part of the DOM tree and not

    have display:none to have page coordinates.

    var elOffsets = Ext.fly('elId').getOffsetsTo(anotherEl);

    getLeftGets the left X coordinate

    var elLeft = Ext.fly('elId').getLeft();

    getRightGets the right X coordinate of the element (element X position + element width)

    var elRight = Ext.fly('elId').getRight();

    getTopGets the top Y coordinate

    var elTop = Ext.fly('elId').getTop();

    getBottom

  • 7/30/2019 Manual ExtCore 3

    22/44

    Gets the bottom Y coordinate of the element (element Y position + element height)

    var elBottom = Ext.fly('elId').getBottom();

    setLeftSets the element's left position directly using CSS style (instead of setX).

    Ext.fly('elId').setLeft(25)

    setRightSets the element's CSS right style.

    Ext.fly('elId').setRight(15)

    setTopSets the element's top position directly using CSS style (instead of setY).

    Ext.fly('elId').setTop(12)

    setBottomSets the element's CSS bottom style.

    Ext.fly('elId').setBottom(15)

    setLocationSets the position of the element in page coordinates, regardless of how the element is positioned. The element

    must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).

    Ext.fly('elId').setLocation(15,32)

    moveToSets the position of the element in page coordinates, regardless of how the element is positioned. The element

    must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).

    Ext.fly('elId').moveTo(12,17)

    positionInitializes positioning on this element. If a desired position is not passed, it will make the the element positioned

    relative IF it is not already positioned.

    Ext.fly('elId').position("relative")

    clearPositioningClear positioning back to the default when the document was loaded

    Ext.fly('elId').clearPositioning()

    Ext.fly('elId').clearPositioning("top")

    getPositioningGets an object with all CSS positioning properties. Useful along with setPostioning to get snapshot before

    performing an update and then restoring the element.

    var pos = Ext.fly('elId').getPositioning()

    setPositioningSet positioning with an object returned by getPositioning().

    Ext.fly('elId').setPositioning({

    left: 'static',

    right: 'auto'

    })

    translatePointsTranslates the passed page coordinates into left/top css values for this element

    // {left:translX, top: translY}

    var points = Ext.fly('elId').translatePoints(15,18);

    Animations

  • 7/30/2019 Manual ExtCore 3

    23/44

    Ext Core has animation plugins available that give you a robust set of preconfigured animations that are alredy

    applied as methods to Ext.Element so you can do cool things like this:

    Ext.fly('slideEl').slideOut('r');

    Copy the above code, run it in FireBug and see what happens. You will see below that Ext has a full set of

    animations already built for you. Each animation takes a configuration object literal making it very customizable if

    you need more than the default behavior. Perhaps you want to add your own callback function to fire upon

    completion of the animation:

    Ext.fly('slideEl').slideOut('r', {

    callback : function(){

    alert('Finished sliding the element out');

    }

    });

    So you can see there are some really powerful animations here.

    Animations support 8-way anchoring, so you can choose from 8 different anchor points to either start or end your

    animation.

    ValueDescription

    tl The top left corner

    t The center of the top edge

    tr The top right corner

    l The center of the left edge

    r The center of the right edge

    bl The bottom left corner

    b The center of the bottom edge

    br The bottom right corner

    Lets explore the API further:

    slideIn/slideOutSlides the element into or out of view. An anchor point can be optionally passed to set the point of origin for the

    slide effect. This function automatically handles wrapping the element with a fixed-size container if needed. See

    the Fx class overview for valid anchor point options. Usage:

    // default: slide the element in from the top

    el.slideIn();

    // default: slide the element out from the bottom

    el.slideOut();

    // common config options shown with default values

    el.slideIn('t', {

    easing: 'easeOut',

    duration: .5

    });

    el.slideOut('t', {

    easing: 'easeOut',

    duration: .5,remove: false,

    useDisplay: false

    });

  • 7/30/2019 Manual ExtCore 3

    24/44

    puffFades the element out while slowly expanding it in all directions. When the effect is completed, the element will be

    hidden (visibility = 'hidden') but block elements will still take up space in the document. The element must be

    removed from the DOM using the 'remove' config option if desired. Usage:

    // default

    el.puff();

    // common config options shown with default valueel.puff({

    easing: 'easeOut',

    duration: .5,

    remove: false,

    useDisplay: false

    });

    switchOffBlinks the element as if it was clicked and then collapses on its center (similar to switching off a television). When

    the effect is completed, the element will be hidden (visibility = 'hidden') but block elements will still take up space

    in the document. The element must be removed from the DOM using the 'remove' config option if desired. Usage:

    // default

    el.switchOff();

    // all config options shown with default values

    el.switchOff({

    easing: 'easeIn',

    duration: .3,

    remove: false,

    useDisplay: false});

    highlightHighlights the Element by setting a color (applies to the background-color by default, but can be changed using

    the "attr" config option) and then fading back to the original color. If no original color is available, you should

    provide the "endColor" config option which will be cleared after the animation. Usage:

    // default: highlight background to yellow

    el.highlight();

    // common config options shown with default valuesel.highlight("ffff9c", {

    //can be any valid CSS property (attribute) that supports a color value

    attr: "background-color",

    endColor: (current color) or "ffffff",

    easing: 'easeIn',

    duration: 1

    });

    frameShows a ripple of exploding, attenuating borders to draw attention to an Element. Usage:

    // default: a single light blue ripple

    el.frame();

    // common config options shown with default values

  • 7/30/2019 Manual ExtCore 3

    25/44

    el.frame("C3DAF9", 1, {

    duration: 1 //duration of each individual ripple.

    // Note: Easing is not configurable and will be ignored if included

    });

    pauseCreates a pause before any subsequent queued effects begin. If there are no effects queued after the pause it will

    have no effect. Usage:

    el.pause(1);

    fadeIn/fadeOutFade an element in (from transparent to opaque). The ending opacity can be specified using the "endOpacity"

    config option. Or fade an element out (from opaque to transparent). The ending opacity can be specified using the

    "endOpacity" config option. Note that IE may require useDisplay:true in order to redisplay correctly. Usage:

    // default: fade in from opacity 0 to 100%

    el.fadeIn();

    el.fadeOut();

    // common config options shown with default values

    el.fadeIn({

    endOpacity: 1, //can be any value between 0 and 1 (e.g. .5)

    easing: 'easeOut',

    duration: .5

    });

    el.fadeOut({

    endOpacity: 0, //can be any value between 0 and 1 (e.g. .5)

    easing: 'easeOut',

    duration: .5,remove: false,

    useDisplay: false

    });

    scaleAnimates the transition of an element's dimensions from a starting height/width to an ending height/width. Usage:

    // change height and width to 100x100 pixels

    el.scale(100, 100);

    // common config options shown with default values. The height and width will// default to the element's existing values if passed as null.

    el.scale(

    [element's width],

    [element's height], {

    easing: 'easeOut',

    duration: .35

    }

    );

    shiftAnimates the transition of any combination of an element's dimensions, xy position and/or opacity. Any of these

    properties not specified in the config object will not be changed. This effect requires that at least one new

    dimension, position or opacity setting must be passed in on the config object in order for the function to have any

    effect. Usage:

  • 7/30/2019 Manual ExtCore 3

    26/44

    // slide the element horizontally to x position 200 while changing

    // the height and opacity

    el.shift({ x: 200, height: 50, opacity: .8 });

    // common config options shown with default values.

    el.shift({

    width: [element's width],

    height: [element's height],

    x: [element's x position],

    y: [element's y position],

    opacity: [element's opacity],

    easing: 'easeOut',

    duration: .35

    });

    ghostSlides the element while fading it out of view. An anchor point can be optionally passed to set the ending point of

    the effect. Usage:

    // default: slide the element downward while fading out

    el.ghost();

    // common config options shown with default values

    el.ghost('b', {

    easing: 'easeOut',

    duration: .5,

    remove: false,

    useDisplay: false});

    Complex animationsWe can also use the Ext Core animation system to build our own complex custom animations. Copy the following

    code into FireBug and see what it does:

    var el = Ext.get('complexEl')

    el.animate({

    borderWidth: {to: 3, from: 0},

    opacity: {to: .3, from: 1},

    height: {to: 50, from: el.getHeight()},

    width: {to: 300, from: el.getWidth()}

    });

    Miscellaneous

    The following are useful Ext.Element methods which don't fit in the previous sections but bear mentioning.

    focusTries to focus the element. Any exceptions are caught and ignored.

    el.focus();

    blurTries to blur the element. Any exceptions are caught and ignored

    el.blur();

    getValueReturns the value of the "value" attribute

  • 7/30/2019 Manual ExtCore 3

    27/44

    el.getValue();

    el.getValue(true); // parses the value as a number

    isBorderBoxTrue if the detected browser is Internet Explorer running in non-strict mode

    if (Ext.isBorderBox) { }

    getAttributeNSReturns the value of a namespaced attribute from the element's underlying DOM node.

    el.getAttributeNS("","name");

  • 7/30/2019 Manual ExtCore 3

    28/44

    Composite Element

    What is a Composite?

    "The Composite (Design pattern) allows a group of objects to be treated in the same way as a single instance of

    an object." (Wikipedia) Ext.CompositeElement allows you to work with a collection of zero to many elements as a

    single entity. CompositeElement uses the same interface as Ext.Element simplifying your job as a developer and

    eliminating the need for common run-time checks when dealing with a collection. CompositeElement's are typically

    retrieved by using the static methodExt.select. Ext.select uses DomQuery to search the entire document for any

    element which matches a particular selector.

    For example given the following markup:

    Sample A

    Lorem Ipsum

    Some additional content

    We could use the CSS selector '.title' to search the entire page and retrieve a CompositeElement that contains

    references to the div's first and third.

    var els = Ext.select('.title');

    Note: The element third also has an additional CSS class of secondCSSCls. HtmlElement's can have multiple CSS

    classes by separating them with a space. This selector does not require that only title is applied and therefore both

    'first' and 'third' will be returned.

    After obtained a CompositeElement we can now work with this collection of Elements as a single element. For

    Example, we could then add a CSS class of error to the collection.

    var els = Ext.select('.title');

    els.addClass('error');

    When you are aware of the location of the elements you want to retrieve relative to another element on the page

    you should first obtain a reference to that element and then search from there. This will make your search perform

    faster because it is searching a smaller subset of the entire document. Let's see what happens when we add an

    additional div with an id of 'accordion' wrapping around our first, second and third elements.

    Sample A

    Lorem Ipsum

    Some additional content

    http://en.wikipedia.org/wiki/Composite_patternhttp://en.wikipedia.org/wiki/Composite_patternhttp://en.wikipedia.org/wiki/Composite_patternhttp://extjs.com/deploy/dev/docs/?class=Ext&member=selecthttp://extjs.com/deploy/dev/docs/?class=Ext&member=selecthttp://extjs.com/deploy/dev/docs/?class=Ext&member=selecthttp://extjs.com/deploy/dev/docs/?class=Ext&member=selecthttp://en.wikipedia.org/wiki/Composite_pattern
  • 7/30/2019 Manual ExtCore 3

    29/44

    Since we know that the elements will be within a div with an id of accordion we can scope our search to only the

    accordion element.

    var accordion = Ext.get('accordion');

    accordion.select('title');

    Any time that you are aware of the location of the elements within your markup you should make sure that you

    scope your search like this to optimize performance.

    Other useful methods of CompositeElement are displayed in this code sample:

    var accordion = Ext.get('accordion');

    accordion.select('title');

    // firstItem now has an Ext.Element pointing to the first div

    var firstItem = accordion.item(0);

    // alerts 1 or the second position

    alert(accordion.indexOf('third'));

    // alerts 2

    alert(accordion.getCount());

    // Removes the element from the collection and from the DOM

    accordion.removeElement('one', true);

    Note: Methods which have been removed from CompositeElement which users of Ext JS may be familiar with:

    each, first, last, fill, contains, filter.

  • 7/30/2019 Manual ExtCore 3

    30/44

    Ajax Implementation

    Ajax Defined

    Asynchronous JavaScript and XML (coined AJAX in 2005), is a group of interrelated web development techniques

    used to create interactive web applications or rich Internet applications. With Ajax, web applications can retrieve

    data from the server asynchronously in the background without interfering with the display and behavior of the

    existing page. Data is retrieved using the XHR (XMLHttpRequest) object. Because of the complexity of handling

    cross-browser distinctions between XHR implementations, Ajax frameworks have emerged to abstract these

    differences into a set of reusable programming constructs. Within Ext, performing these functions is done within

    the Ext.Ajaxsingletonobject.

    Ext.Ajax

    Ext.Ajax extends the Ext.data.Connection class into a singleton and provides a centralized area to make Ajax

    requests with maximum flexibility. By using this singleton, all Ajax requests can be routed through one class and

    provide access to all functions, events, and parameters.

    Ext.Ajax Events

    Ext.Ajax exposes global Ajax events that can be handled on every request.

    beforerequest (conn, opts)Fires before any Ajax request is sent.

    requestcomplete (conn, response, opts)Fires after any Ajax request is completed successfully.

    requestexception (conn, response, opts)Fires if an error HTTP status was returned from the server.

    // Example: show a spinner during all Ajax requests

    Ext.Ajax.on('beforerequest', this.showSpinner, this);

    Ext.Ajax.on('requestcomplete', this.hideSpinner, this);Ext.Ajax.on('requestexception', this.hideSpinner, this);

    Ext.Ajax Properties

    Since Ext.Ajax is asingleton, you can set properties for it once and override them at the request function level

    only if necessary. Common properties you may want to set are:

    method: The default HTTP method to be used for requests. Note that this is case-sensitive and should be all caps(defaults to undefined; if not set but parms are present will use "POST," otherwise "GET.")

    extraParams: An object containing properties which are used as extra parameters to each request made by thisobject (defaults to undefined). Session information and other data that you need to pass with each request are

    commonly put here. url: The default URL to be used for requests to the server (defaults to undefined). If the server receives all

    requests through one URL, setting this once is easier entering it on every request.

    defaultHeaders: An object containing request headers which are added to each request made by this object(defaults to undefined).

    // Default headers to pass in every request

    Ext.Ajax.defaultHeaders = {

    'Powered-By': 'Ext Core'

    };

    Ext.Ajax.request

    Ext.Ajax.request is the function called to send and receive data to the server via Ajax. Success and failure

    functions can also be set up to handle theresponsereturned by the server. Note that these success/failure

    functions are asynchronous and will be called back when the server responds, while this is happening they

    webpage will continue to operate.

    http://www.adaptivepath.com/ideas/essays/archives/000385.phphttp://www.adaptivepath.com/ideas/essays/archives/000385.phphttp://www.adaptivepath.com/ideas/essays/archives/000385.phphttp://www.w3.org/TR/XMLHttpRequest/http://www.w3.org/TR/XMLHttpRequest/http://www.w3.org/TR/XMLHttpRequest/http://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://www.w3.org/TR/XMLHttpRequest/#response-entity-bodyhttp://www.w3.org/TR/XMLHttpRequest/#response-entity-bodyhttp://www.w3.org/TR/XMLHttpRequest/#response-entity-bodyhttp://www.w3.org/TR/XMLHttpRequest/#response-entity-bodyhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://extjs.com/learn/Manual:Intro:Patterns:Singletonhttp://www.w3.org/TR/XMLHttpRequest/http://www.adaptivepath.com/ideas/essays/archives/000385.php
  • 7/30/2019 Manual ExtCore 3

    31/44

    Ext.Ajax.request({

    url: 'ajax_demo/sample.json',

    success: function(response, opts) {

    var obj = Ext.decode(response.responseText);

    console.dir(obj);

    },

    failure: function(response, opts) {

    console.log('server-side failure with status code ' + response.status);

    }

    });

    Ext.Updater

    Another common use for Ajax is updating elements dynamically on a page without refreshing everything. The

    request method exposes an el configuration which will take the response from a request and set it to the

    innerHTML of an element. Developers can also use the Ext.TaskMgr to setup a recurring task to update the

    element periodically.

    Posting a form with Ajax

    Use the form configuration to post a form with Ext.Ajax.request

    Ext.Ajax.request({

    url: 'ajax_demo/sample.json',

    form: 'myForm',

    success: function(response, opts) {

    var obj = Ext.decode(response.responseText);

    console.dir(obj);

    },

    failure: function(response, opts) {console.log('server-side failure with status code ' + response.status);

    }

    });

  • 7/30/2019 Manual ExtCore 3

    32/44

    Ext.DomQuery

    What is DomQuery?

    DomQuery provides high performance selector/xpath processing. It works on HTML and XML documents (if a

    content node is passed in). DomQuery supports most of the CSS3 selectors spec, along with some custom

    selectors and basic XPath. A list of the full CSS3 selector spec can be foundhere.

    Multiple Selections

    You can select multiple sets of at elements with different criteria into a single result set.

    // Matches all divs with class foo and all spans with class bar

    Ext.select('div.foo, span.bar');

    Selection Root

    When using a selector, it is possible to specify an optional root node, if it is not specified it will default to the

    document body. This can be useful to increase performance, since specifying a root means there will be possibly

    less nodes to check.

    Ext.get('myEl').select('div.foo'); // These are equivalent

    Ext.select('div.foo', true, 'myEl');// These are equivalent

    Selection Chaining

    Selectors can be chained to match multiple criteria, which is useful if you need to execute a complex query.

    Chained attributes are processed in order

    // Matches a div with a class of foo, that has a title attribute bar, that is

    // the first child of its immediate parent.

    Ext.select('div.foo[title=bar]:first');

    Element selectors

    * any element E an element with the tag E E F All descendent elements of E that have the tag F E > F or E/F all direct children elements of E that have the tag F E + F all elements with the tag F that are immediately preceded by an element with the tag E E ~ F all elements with the tag F that are preceded by a sibling element with the tag E

    // Matches all div elements

    Ext.select('div');

    // Matches all span elements contained inside a div at any levelExt.select('div span');

    // Matches all li elements with a ul as their immediate parent

    Ext.select('ul > li');

    Attribute selectors

    E.foo has a class "foo" E[foo] has an attribute "foo" E[foo=bar] has an attribute "foo" that equals "bar" E[foo^=bar] has an attribute "foo" that starts with "bar" E[foo$=bar] has an attribute "foo" that ends with "bar" E[foo*=bar] has an attribute "foo" that contains the substring "bar" E[foo%=2] has an attribute "foo" that is evenly divisible by 2 E[foo!=bar] has an attribute "foo" that does not equal "bar"

    // Matches all div elements with the class news

    http://www.w3.org/TR/css3-selectors/http://www.w3.org/TR/css3-selectors/http://www.w3.org/TR/css3-selectors/http://www.w3.org/TR/css3-selectors/
  • 7/30/2019 Manual ExtCore 3

    33/44

    Ext.select('div.news');

    // Matches all a elements with an href that is http://extjs.com

    Ext.select('a[href=http://extjs.com]');

    // Matches all img elements that have an alt tag

    Ext.select('img[alt]');

    Pseudo selectors

    E:first-child E is the first child of its parent E:last-child E is the last child of its parent E:nth-child(n) E is the nth child of its parent (1 based as per the spec) E:nth-child(odd) E is an odd child of its parent E:nth-child(even) E is an even child of its parent E:only-child E is the only child of its parent E:checked E is an element that is has a checked attribute that is true (e.g. a radio or checkbox) E:first the first E in the resultset E:last the last E in the resultset E:nth(n) the nth E in the resultset (1 based) E:odd shortcut for :nth-child(odd) E:even shortcut for :nth-child(even) E:contains(foo) E's innerHTML contains the substring "foo" E:nodeValue(foo) E contains a textNode with a nodeValue that equals "foo" E:not(S) an E element that does not match simple selector S E:has(S) an E element that has a descendent that matches simple selector S E:next(S) an E element whose next sibling matches simple selector S E:prev(S) an E element whose previous sibling matches simple selector S

    // Matches the first div with a class of code

    Ext.select('div.code:first');

    // Matches spans that fall on an even index.

    Ext.select('span:even');// Matches all divs whos next sibling is a span with class header.

    Ext.select('div:next(span.header));

    CSS value selectors

    E{display=none} css value "display" that equals "none" E{display^=none} css value "display" that starts with "none" E{display$=none} css value "display" that ends with "none" E{display*=none} css value "display" that contains the substring "none" E{display%=2} css value "display" that is evenly divisible by 2 E{display!=none} css value "display" that does not equal "none"

  • 7/30/2019 Manual ExtCore 3

    34/44

    Generate Dynamic Markup

    DomHelper

    DomHelper (abbreviated DH) is a utility class used to dynamically generate markup and works around many cross-

    browser issues encountered when creating markup using raw DOM scripting. DH is intelligent enough to use HTML

    Fragments and innerHTML where appropriate to optimize speed without sacrificing compatibility. Since

    Ext.DomHelper is a singleton, all its methods can be accessed statically without instantiating a new instance of the

    class.

    Ext.DomHelper is a singleton. Therefore you can access all of its methods statically without instantiating a new

    instance of the class.

    markup

    Same as the deprecated createHtml

    insertHtml

    insertBefore

    insertAfter

    insertFirstappend

    overwrite

    DOM Scripting Ext.DomHelper

    var myEl = document.createElement('a');

    myEl.href = 'http://www.yahoo.com/';

    myEl.innerHTML = 'My Link';

    myEl.setAttribute('target', '_blank');

    var myDiv = document.createElement('div');myDiv.id = 'my-div';

    myDiv.appendChild(myEl);

    document.body.appendChild(myDiv);

    Ext.DomHelper.append(document.body, {

    id: 'my-div',

    cn: [{

    tag: 'a',

    href: 'http://www.yahoo.com/',

    html: 'My Link',target: '_blank'

    }]

    });

    DomHelper Configurations

    When dynamically generating markup with Ext.DomHelper, a DomHelper configuration is used to specify what

    markup to create and place in the page. A DomHelper configuration is a representation of any arbitrary

    HTMLElement to be created on the page.

    Markup DomHelper Configuration

    Ext JS

    {

    tag: 'a',

    href: 'http://www.extjs.com',

    html: 'Ext JS'

    }

    Template

    Tpl, formatting functions, static method from (importance of textarea)

    Template member methods

    Adding & executing member formatting functions

  • 7/30/2019 Manual ExtCore 3

    35/44

    Javascript Augmentation

    About JS Augmentation

    Javascript is a flexible lanaguage and it allows the programmer to add functions to existing base objects within

    Javascript. The reason for doing this is because there are a number of functions that are extremely useful to use

    on the base object, however they are either not implemented at all, or only implemented in certain browsers.

    When using multiple libraries, they may both implement functions on the base javascript objects. This overlap has

    the potential to cause conflicts when using these libraries together. For this reason, Ext adds only a few necessary

    functions onto the base objects. Here is an interesting comparison about different libraries and their javascript

    augmentation usage:Framework Scanner

    Function Augmentation

    The following functions have been added to the Function prototype (note that createSequence and

    createInterceptor have not been included):

    createCallbackCreates a callback function that can pass a series of arguments. These arguments can be dynamic and defined at

    runtime. This function ignores scope, if it's required you should use createDelegate. createCallback passes all the

    arguments passed to itself to the callback function.

    var sayHello = function(firstName, lastName){

    alert('Hello ' + firstName + ' ' + lastName);

    };

    Ext.get('myButton').on('click', sayHello.createCallback('John', 'Smith');

    createDelegateThis is similar to createCallback, however is slightly more powerful. It allows you to specify the scope that the

    function executes in. It also gives more control about the arguments that are passed to the callback function,especially if there are existing arguments for the event. The first parameter is the scope. The second parameter is

    an array of arguments to pass. The third parameter allows you to control how the arguments are passed. If true, it

    means append the arguments to the end of any arguments passed already (say in the case of an event object). If

    false, it means just pass the argument array, nothing else. If it's an integer, the arguments will be inserted at that

    specific index.

    var sayHello = function(firstName, lastName, e){

    alert('Hello ' + firstName + ' ' + lastName);

    };

    Ext.get('myButton').on(

    'click',

    sayHello.createDelegate(this, ['John', 'Smith'],

    //0 indicates we want to insert our arguments before any others.

    0

    );

    deferdefer allows you to specify a time period to wait before executing a function. The first argument is the amount of

    time, in milliseconds to wait. The second argument is the scope in which to execute the function.

    var whatsTheTime = function(){alert(new Date());

    };

    whatsTheTime.defer(3000); //Wait 3 seconds before executing.

    http://mankz.com/code/GlobalCheck.htmhttp://mankz.com/code/GlobalCheck.htmhttp://mankz.com/code/GlobalCheck.htmhttp://mankz.com/code/GlobalCheck.htm
  • 7/30/2019 Manual ExtCore 3

    36/44

    Array Augmentation

    The following methods are added to the Array prototype, if and only if they are not already implemented by the

    browser:

    indexOfFinds the first index in the array that matches the passed in parameter. If not found in the array, -1 is returned.

    var idx = [1, 2, 3, 4, 5].indexOf(3); //Returns 2.

    removeRemoves the first instance of the passed argument from the array, if found. Note that this modifies the array.

    var arr = [1, 2, 3, 4];

    arr.remove(2);

    var len = arr.length; // len is now 3.

    String Augmentation

    The String class has a single format method added. Note that it may conflict when using Ajax.NET.

    formatAllows you to define a tokenized string and pass an arbitrary number of arguments to replace the tokens. Each

    token must be unique, and must increment in the format {0}, {1}.

    var s = String.format(

    'Hey {0} {1}', how are you?',

    'John',

    'Smith'

    );

    //{0} is substituted with John, {1} is substituted with Smith.

  • 7/30/2019 Manual ExtCore 3

    37/44

    Utilities

    About Utilities

    Ext provides a series of general utility functions for working with Javascript and JSON. They vary in their

    functionality, but all of them aim to make your life as the developer easier.

    apply and applyIf

    applyThe apply function is used to copy the properties of one object literal to another. The first argument is the

    destination object. The second argument is the source to copy from. Note that all properties in the source will be

    copied over, even if they exists in the destination. Also, the destination object will be modified as a result of calling

    the method.

    var person = {

    name: 'John Smith',

    age: 30

    };

    Ext.apply(person, {

    hobby: 'Coding',

    city: 'London'

    }); // person literal now contains hobby and city as well

    applyIfThis function is very similar to apply. The only difference is that applyIf only copies properties that don't exist in

    the destination object. If they already exist in both, the destination object takes precedence and the property is

    not copied.

    var person = {

    name: 'John Smith',

    age: 30,

    hobby: 'Rock Band'

    };

    Ext.applyIf(person, {

    hobby: 'Coding',

    city: 'London'}); // hobby is not copied over

    Url Encoding/Decoding

    These methods are useful for transforming JSON data to a format that can be transmitted as part of a GET string

    and vice versa.

    urlEncodeConverts an object-literal into a string that can be passed as a parameter using a GET request. The string will be

    in the format key1=value1&key2=value2....

    var params = {foo: 'value1',

    bar: 100

    };

  • 7/30/2019 Manual ExtCore 3

    38/44

    var s = Ext.encode(params); // s is now foo=value1&bar=100

    urlDecodeThis method is the opposite of urlEncode. It takes a string in the form of key1=value1&key2=value and converts it

    into a JavaScript object.

    var s = 'foo=value1&bar=100';

    var o = Ext.decode(s); // o now contains 2 properties, foo and bar.

    alert(o.bar);

    Array Handling

    The core provides methods for working with arrays and other collections within Javascript.

    eachThe each method allows you to iterate over an array or other collections (including Nodelists or

    CompositeElements). eac takes a function as the first argument. This function is called for each member in the

    collection. Returning false at any point stops iteration.

    Ext.each([1, 2, 3, 4, 5], function(num){

    alert(num);

    });

    toArrayThis method converts an iterable collection (or single element) into an proper javascript array.

    var arr1 = Ext.toArray(1); // arr1 = [1];

    // arr2 now contains an array of Ext elements.

    var arr2 = Ext.toArray(Ext.select('div));

    JSON

    JSON stands for Javascript Object Notation. It is used as a data exchange format, where the data looks very

    similar to javascript object literals. When sending and retrieving data from the server, it is necessary to convert

    data to and from it's native javascript form. These helper functions assist you to do this. More information about

    JSON can be found atjson.org.

    encodeTakes a javascript object or array and encodes it as the string representation of the JSON that can be passed to an

    external source.

    var s = Ext.encode({

    foo: 1,

    bar: 2

    }); //s now contains '{foo=1,bar=2}'

    decodeThe opposite of encode, this is used to convert the string representation of JSON into a javascript object. This

    method is often called when reading the response from an Ajax callback.

    var s = '{foo=1,bar=2}';

    var o = Ext.decode(s); o is now an object with 2 properties, foo and bar.

    Browser & OS Detection

    http://json.org/http://json.org/http://json.org/http://json.org/
  • 7/30/2019 Manual ExtCore 3

    39/44

    JavaScript

    Ext offers a number of browser-detection features allowing developers to work around implementation issues due

    to differences between the major browsers. Ext provides detection in both javascript and css, to allow for greater

    functionality in both these areas.

    The following browser detection is available for javascript:

    Internet Explorer - Ext.isIE, Ext.isIE6, Ext.isIE7, Ext.isIE8 Firefox - Ext.isGecko, Ext.isGecko2, Ext.isGecko3 Opera - Ext.isOpera Chrome - Ext.isChrome Safari - Ext.isSafari, Ext.isSafari2, Ext.isSafari3 WebKit - Ext.isWebKit Operating Systems - Ext.isLinux, Ext.isWindows, Ext.isMac

    if(Ext.isIE){

    // Do browser specific code here

    }

    CSSA similar mechanism is applied in the CSS, various class names are added to the root element and the body

    depending on the current operating environment. This allows for easier style rules to get around browser quirks. If

    in strict mode, ext-strict is added to the root. The rest of these are added to the body when appropriate:

    .ext-ie, .ext-ie6, .ext-ie7, .ext-ie8 .ext-gecko, .ext-gecko2, .ext-gecko3 .ext-opera .ext-safari .ext-chrome .ext-mac, .ext-linux

    /* When in strict mode and using safari, change the font-size. */.ext-strict .ext-safari .sample-item{

    font-size: 20px;

    }

    Type Detection

    Since JavaScript is a loosely typed language, it is often necessary to interrogate variables to retrieve their type.

    Ext provides a series of methods for help in this regard:

    isEmptyChecks whether the passed value is empty, which includes undefined, null or an empty string.

    alert(Ext.isEmpty(''));

    isArrayChecks whether the passed value is an array.

    alert(Ext.isArray([1, 2, 3]));

    isObjectChecks whether the passed value is an object.

    alert(Ext.isObject({}));

    isFunctionChecks whether the passed value is a function.

  • 7/30/2019 Manual ExtCore 3

    40/44

    alert(Ext.isFunction(function(){

    }));

    Miscellaneous

    idReturns a string that contains a unique identifier. Any call to Ext.id() is guaranteed to return a new id that hasn't

    been used. The first parameter is an optional element, which the id is to be assigned to. The second optional

    parameter is a prefix for the id.

    var s = Ext.id(null, 'prefix'); // No element specified here

    var s = Ext.id(Ext.get(document.body)); // Assign the id to an element

  • 7/30/2019 Manual ExtCore 3

    41/44

    Timed Code Excution

    TaskMgr & TaskRunner

    The TaskRunner class is used to execute a function at a specified interval. This is useful when doing polling type

    operations, for example when reloading Ajax content every 30 seconds. The TaskMgr object is a singleton instance

    of TaskRunner, it can be used for quick access to a TaskRunner.

    var stop = false;

    var task = {

    run: function(){

    if(!stop){

    alert(new Date());

    }else{

    runner.stop(task); // we can stop the task here if we need to.

    }

    },interval: 30000 // every 30 seconds

    };

    var runner = new Ext.util.TaskRunner();

    runner.start(task);

    // Using TaskMgr

    Ext.TaskMgr.start({

    run: function(){

    },

    interval: 1000

    });

    DelayedTask

    The DelayedTask class provides a convenient way to "buffer" the execution of a method. When called, the task will

    wait the specified time period before executing. If durng that time period, the task is called again, the original call

    will be cancelled. This continues so that the function is only called a single time for each iteration. This method is

    especially useful for things like detecting whether a user has finished typing in a text field.

    var task = new Ext.util.DelayedTask(function(){

    alert(Ext.getDom('myInputField').value.length);});

    // Wait 500ms before calling our function. If the user presses another key

    // during that 500ms, it will be cancelled and we'll wait another 500ms.

    Ext.get('myInputField').on('keypress', function(){

    task.delay(500);

    });

    Note that we are using a DelayedTask here to illustrate a point. The configuration option buffer for addListener/onwill also setup a delayedtask for you to buffer events.

  • 7/30/2019 Manual ExtCore 3

    42/44

    Class System

    JavaScript Classes

    Javascript is prototype based, meaning that it differs from typical class based programming languages. In

    javascript, creating new classes is done by modifying the prototype of an object. Ext provides a number of

    functions that make it simple to create and work with classes. There is a good discussion on various javascript-

    based inheritance functionshere.

    Ext.extend

    Ext provides a series of functions to extend or override existing javascript classes. This means you can add

    behaviours and create your own classes, or override the behaviour of a select few functions to suit your needs.

    extendCreates a new class definition. The first argument is the class to extend. The second parameter is a l ist of

    properties/functions to add to the prototype of the object. When using extend, Ext keeps a reference to the

    superclass, as shown in the second example.

    Person = Ext.extend(Object, {

    constructor: function(first, last){

    this.firstName = first;

    this.lastName = last;

    }

    getName: function(){

    return this.firstName + ' ' + this.lastName;

    }

    });

    Developer = Ext.extend(Person, {

    getName: function(){

    if(this.isCoding){

    return 'Go Away!';

    }else{

    // Access the superclass getName method

    return Developer.superclass.getName.call(this);

    }

    }

    });

    var p = new Person('John', 'Smith');

    alert(p.getName());

    overrideSimilar to extend, however override doesn't create a new class definition. Instead it just changes the behaviour of

    the existing class. The first parameter is the class to override, the second parameter is the list of

    properties/functions to add t othe prototype of the object.

    // Assumes we've declared our Person class above.

    Ext.override(Person, {

    getName: function(){

    http://ajaxian.com/archives/comparison-of-javascript-inheritance-mechanisms-proposalhttp://ajaxian.com/archives/comparison-of-javascript-inheritance-mechanisms-proposalhttp://ajaxian.com/archives/comparison-of-javascript-inheritance-mechanisms-proposalhttp://ajaxian.com/archives/comparison-of-javascript-inheritance-mechanisms-proposal
  • 7/30/2019 Manual ExtCore 3

    43/44

    // Override the behaviour, return the last name first.

    return this.lastName + ' ' + this.firstName;

    }

    });

    Things that go in the prototype are shared

    When placing items in the prototype of the prototype, they will be shared across all instances of the class. Unless

    you specifically want to do this, you should only put "primitive" types inside the prototype definition.

    MyClass = Ext.extend(Object, {

    // This object literal is now shared between all instances of MyClass.

    baseParams: {},

    foo: function(){

    this.baseParams.bar = 'baz';

    }

    });

    Ext.onReady(function(){

    var a = new MyClass();

    var b = new MyClass();

    a.foo();

    // Modifying baseParams in a affects baseParams in b.

    console.log(b.baseParams);

    });

    Singletons

    Otherwise known as the module design pattern this pattern allows you to create private JS Variables or methods

    through the clever use of closures. The singleton is a good pattern to use when you you have a class of static

    methods, or you have a class that will only be used once. A good candidate for a singleton is the entry point into

    your application.

    MyApp = function(){

    var data; data is private and can't be accessed from outside.

    return {

    init: function(){// Initialize application here

    },

    getData: function(){

    return data;

    }

    };

    }();

    Ext.onReady(MyApp.init, MyApp);

    Ext.util.Observable

    TheObservable (or subscriber)pattern is used to decouple objects that need to know details about the state of

    other objects. It does this by using events. When the state of the subject changes, the subject will fire an event.

    Subscribers to that particular event on the subject will then be notified that the state change has occurred. Many

    http://en.wikipedia.org/wiki/Observer_patternhttp://en.wikipedia.org/wiki/Observer_patternhttp://en.wikipedia.org/wiki/Observer_patternhttp://en.wikipedia.org/wiki/Observer_pattern
  • 7/30/2019 Manual ExtCore 3

    44/44

    Ext classes extend Observable to allow for a flexible, decoupled programming model. You can easily create classes

    that fire custom events:

    var MyClass = Ext.extend(Ext.util.Observable, {

    constructor: function(config){

    this.addEvents('datachanged'); // specify the events we're going to fire

    MyClass.constructor.call(this, config);

    },

    update: function(){

    // do some data transformation here

    // When firing an event, we can specify what parameters are

    // passed to the subscribers.

    this.fireEvent('datachanged', this, this.data.length);

    }

    });

    // To subscribe to an eventvar c = new MyClass();

    c.on('datachanged', function(obj, num){

    // react to the data changed event.

    });

    Namespaces

    Namespaces are useful for organizing your code, they provide 2 main benefits. The first is that you can use them

    to prevent polluting the global namespace with objects, which is generally considered to be undesireable. Ext, for

    example has just a single global object (the Ext object). It's good practice to put any classes inside a namespace,

    a common one is the name of your company or the name of your application. The other advantage is that assistsin keeping your code organized, you can group together similar or co-dependent classes in the same namespace,

    which helps to specify your intent to other developers.

    // The following are equivalent, the latter is preferred.

    Ext.namespace(

    'MyCompany',

    'MyCompany.Application',

    'MyCompany.Application.Reports'

    );

    Ext.namespace('MyCompany.Application.Reports');


Recommended