Bookmark and Share

.live()

.live( eventType, handler ) Returns: jQuery

Description: Attach a handler to the event for all elements which match the current selector, now or in the future.

  • version added: 1.3.live( eventType, handler )

    eventTypeA string containing a JavaScript event type, such as "click" or "keydown"

    handlerA function to execute at the time the event is triggered.

  • version added: 1.4.live( eventType, [ eventData ], handler )

    eventTypeA string containing a JavaScript event type, such as "click" or "keydown"

    eventDataA map of data that will be passed to the event handler.

    handlerA function to execute at the time the event is triggered.

This method is a variation on the basic .bind() method for attaching event handlers to elements. When .bind() is called, the elements that the jQuery object refers to get the handler attached; elements that get introduced later do not, so they would require another .bind() call. For instance, consider the HTML:

<body>
  <div class="clickme">
    Click here
  </div>
</body>

We can bind a simple click handler to this element:

$('.clickme').bind('click', function() {
  // Bound handler called.
});

When the element is clicked, then the message gets printed. However, suppose that after this, another element is added:

$('body').append('<div class="clickme">Another target</div>');

This new element also matches the selector .clickme, but since it was added after the call to .bind(), clicks on it will do nothing.

The .live() method provides an alternative to this behavior. If we bind a click handler to the target element using this method:

$('.clickme').live('click', function() {
  // Live handler called.
});

And then later add a new element:

$('body').append('<div class="clickme">Another target</div>');

Then clicks on the new element will also trigger the handler.

Event Delegation

The .live() method is able to affect elements that have not yet been added to the DOM through the use of event delegation: a handler bound to an ancestor element is responsible for events that are triggered on its descendants. The handler passed to .live() is never bound to an element; instead, .live() binds a special handler to the root of the DOM tree. In our example, when the new element is clicked, the following steps occur:

  1. A click event is generated and passed to the <div> for handling.
  2. No handler is directly bound to the <div>, so the event bubbles up the DOM tree.
  3. The event bubbles up until it reaches the root of the tree, which is where .live() binds its special handlers by default.
  4. The special click handler bound by .live() executes.
  5. This handler tests the target of the event object to see whether it should continue. This test is performed by checking if $(event.target).closest('.clickme') is able to locate a matching element.
  6. If a matching element is found, the original handler is called on it.

Because the test in step 5 is not performed until the event occurs, elements can be added at any time and still respond to events.

Caveats

The .live() technique is useful, but due to its special approach cannot be simply substituted for .bind() in all cases. Specific differences include:

  • As of jQuery 1.4, the .live() method supports custom events as well as all JavaScript events. Two exceptions: Since focus and blur aren't actually bubbling events, we need to use focusin and focusout instead. In version 1.3.x, however, only the following JavaScript events (in addition to custom events) could be bound with .live(): click, dblclick, keydown, keypress, keyup, mousedown, mousemove, mouseout, mouseover, and mouseup.
  • DOM traversal methods are not fully supported for finding elements to send to .live(). Rather, the .live() method should always be called directly after a selector, as in the example above.
  • To stop further handlers from executing after one bound using .live(), the handler must return false. Calling .stopPropagation() will not accomplish this.
  • See the discussion for .bind() for more information on event binding.

    As of jQuery 1.4, the optional eventData parameter allows us to pass additional information to the handler. One handy use of this parameter is to work around issues caused by closures. See the .bind() method's "Passing Event Data" discussion for more information.

    Examples:

    Example: Click a paragraph to add another. Note that live binds the click event to all paragraphs - even new ones.

    <!DOCTYPE html>
    <html>
    <head>
      <style>
      p { background:yellow; font-weight:bold; cursor:pointer; 
          padding:5px; }
      p.over { background: #ccc; }
      span { color:red; }
      </style>
      <script src="/scripts/jquery-1.4.js"></script>
    </head>
    <body>
    	<p>Click me!</p>
    
      <span></span>
    <script>
        $("p").live("click", function(){
          $(this).after("<p>Another paragraph!</p>");
        });
    </script>
    </body>
    </html>

    Demo:

    Example: To display each paragraph's text in an alert box whenever it is clicked:

    $("p").live("click", function(){
      alert( $(this).text() );
    });

    Example: To cancel a default action and prevent it from bubbling up, return false:

    $("a").live("click", function() { return false; })

    Example: To cancel only the default action by using the preventDefault method.

    $("a").live("click", function(event){
      event.preventDefault();
    });

    Example: Can bind custom events too.

    <!DOCTYPE html>
    <html>
    <head>
      <style>
      p { color:red; }
      span { color:blue; }
      </style>
      <script src="/scripts/jquery-1.4.js"></script>
    </head>
    <body>
    	<p>Has an attached custom event.</p>
      <button>Trigger custom event</button>
      <span style="display:none;"></span>
    <script>
    
        $("p").live("myCustomEvent", function(e, myName, myValue){
          $(this).text("Hi there!");
          $("span").stop().css("opacity", 1)
                   .text("myName = " + myName)
                   .fadeIn(30).fadeOut(1000);
        });
        $("button").click(function () {
          $("p").trigger("myCustomEvent");
        });
    
    </script>
    </body>
    </html>

    Demo:

    Comments

    • Please keep comments relevant to .live().
    • Additional examples and requests for clarification are encouraged, but please do not use these comments as a bug tracker or support forum.
    • Please report bugs on the bug tracker or the jQuery Forum.
    • Request support on the jQuery Forum
    • rasmuslknabe
      I can't get "change" to work in IE8 either!? - The documentation clearly states that it's supported as far as i can se though...
    • Sorry.. ment "change" using live()...
    • Guu
      Does this version support namespaced events like .live'click.name', fn) as bind() function does?
    • Is live('change', function().... supposed to work in Internet Explorer? According http://jquery14.com/day-01/jquery-14 it sould be supported. I can not get the following simple test to work (it works fine in Opera and Firefox):

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
      <title>Test</title>
      </head>
      <body>
      <script type="text/javascript">
      jQuery(document).ready(function($) {
      $('#demo').live('change', function() {
      alert('test');
      });
      });
      </script>
      <h1>jQuery-testing</h1>
      <input type="text" id="demo" />
      </body>
      </html>
    • I'm also having trouble getting "change" to work in IE8. Works great in Fx, Cr and Safari.

      I'll create a ticket and post to jquery-dev if I can't find one.

      Update: It's already on jquery-dev http://groups.google.com/group/jquery-dev/brows...

      Update2: Added Trac ticket: http://dev.jquery.com/ticket/5851
    • Hadrian
      In 1.4 you can pass an object of many events to bind(). Why didn't live() get the same feature?
    • Thom Patterson
      Can someone please explain how to add context to live events? It was mentioned in the release notes: http://jquery14.com/day-01/jquery-14

      "live/die now work with context"

      I have a project that would currently suffers from a performance bottlenexk
    • It's tricky and undocumented, but the context of a jQuery object needs to be supplied as a DOM element. Only then the context will be different from the default (document):

      $('li', $('ul').get(0)).live('click', ...);
      - or -
      $li = $('li');
      $li.context = $('ul').get(0);
      $li.live('click', ...);
    • Thom Patterson
      Sorry, accidentally posted too soon.

      I have a project that is currently experiencing performance problems with live events at the document level. By moving them down to a closer ancestor of my dynamic content I expect performance would improve.
    • what about selector driven live events, as in the semi-eponymous livequery

      that is:
      $('.foo').live(function(){
      // do something
      })
    เยี่ยมชม 1377853
    Author คน
    2013 © Copyright ninenik.com. All rights reserved.