jQuery 1.9 .live() is not a function
Asked Answered
O

10

297

I recently updated jQuery from 1.8 to 2.1. I suddenly discovered that the .live() stops working.
I get the error TypeError: $(...).live is not a function.

Is there any method I can use in place of .live()?

Osber answered 16/1, 2013 at 8:26 Comment(2)
Does this answer your question? Turning live() into on() in jQueryLyckman
Related post - Uncaught TypeError: $.ajax(...).error is not a function. .error is another jQuery function which got deprecated in jQuery v3.xOriginal
B
626

jQuery .live() has been removed in version 1.9 onwards

That means if you are upgrading from version 1.8 and earlier, you will notice things breaking if you do not follow the migration guide below. You must not simply replace .live() with .on()!


Read before you start doing a search and replace:

For quick/hot fixes on a live site, do not just replace the function live with on,
as the parameters are different!

.live(events, function)

should map to:

.on(eventType, selector, function)

The (child) selector is very important! If you do not need to use this for any reason, set it to null.


Migration Example 1:

before:

$('#mainmenu a').live('click', function)

after, you move the child element (a) to the .on() selector:

$('#mainmenu').on('click', 'a', function)

Migration Example 2:

before:

$('.myButton').live('click', function)

after, you move the element .myButton to the .on() selector, and find the nearest parent element (preferably with an ID):

$('#parentElement').on('click', '.myButton', function)

If you do not know what to put as the parent, document always works:

$(document).on('click', '.myButton', function)

See also:

Buccal answered 16/1, 2013 at 8:30 Comment(2)
that's great. In most of cases I used the latest approach, therefore replacing code like jQuery('.upload_image_button').live('click', function) with code like jQuery('body').on('click', '.upload_image_button', function) and it worked like a charm (After cache cleaning of course!)Larimer
+1 I just inherited a very old legacy app with a set of broken click behaviors to fix. The 'migration examples' were spot on and very helpful.At
S
103

You can avoid refactoring your code by including the following JavaScript code

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});
Saloma answered 30/7, 2015 at 17:51 Comment(4)
Should include a return this; at the end of the function in order to preserve chaining abilityMesonephros
Does using this will cause any problems in the future?Gasaway
you may want to consider include this inside an if condition targeting a version. eg. if ($.fn.jquery != "x.x.x") { //do this code inside here }. This is required because some old versions may not have 'on' fuctionSuppositious
It worked perfectly, using JQuery 2.1.4, and running the project in an iFrame. Thanks. Utilizing your code in the example posted here. cffcs.com/Code/2051Gesualdo
H
24

Forward port of .live() for jQuery >= 1.9 Avoids refactoring JS dependencies on .live() Uses optimized DOM selector context

/** 
 * Forward port jQuery.live()
 * Wrapper for newer jQuery.on()
 * Uses optimized selector context 
 * Only add if live() not already existing.
*/
if (typeof jQuery.fn.live == 'undefined' || !(jQuery.isFunction(jQuery.fn.live))) {
  jQuery.fn.extend({
      live: function (event, callback) {
         if (this.selector) {
              jQuery(document).on(event, this.selector, callback);
          }
      }
  });
}
Hallowell answered 5/8, 2015 at 8:13 Comment(2)
This worked super fine for my case: got to work mandatorily on jQuery 1.11.2. Thank you!Hyperphysical
Thank you @david this helped me to resolve an issue with WordPress old plugin to get work with the new update.Selemas
C
17

The jQuery API documentation lists live() as deprecated as of version 1.7 and removed as of version 1.9: link.

version deprecated: 1.7, removed: 1.9

Furthermore it states:

As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live()

Como answered 16/1, 2013 at 8:27 Comment(0)
S
7

.live() was deprecated and has now been removed from jQuery 1.9 You should use .on()

Strohbehn answered 16/1, 2013 at 8:27 Comment(0)
C
7

A very simple fix that doesn't need to change your code, just add jquery migration script, download here https://github.com/jquery/jquery-migrate/

It supplies jquery deprecated but needed functions like "live", "browser" etc

Collected answered 7/5, 2015 at 7:20 Comment(0)
B
6

.live was removed in 1.9, please see the upgrade guide: http://jquery.com/upgrade-guide/1.9/#live-removed

Billibilliard answered 16/1, 2013 at 8:27 Comment(0)
D
5

I tend not to use the .on() syntax, if not necessary. For example you can migrate easier like this:

old:

$('.myButton').live('click', function);

new:

$('.myButton').click(function)

Here is a list of valid event handlers: https://api.jquery.com/category/forms/

Destroy answered 8/4, 2017 at 17:25 Comment(1)
I think the .on() syntax is required just for dynamically loaded content (for example, elements added after the page is loaded).Reposeful
W
5

When i will getting this error on my site .it will stop some functionality on my site, after research i find the solution for this problem ,

$colorpicker_inputs.live('focus', function(e) {
    jQuery(this).next('.farb-popup').show();
    jQuery(this).parents('li').css( {
        position : 'relative',
        zIndex : '9999'
    })
    jQuery('#tabber').css( {
        overflow : 'visible'
    });
});

$colorpicker_inputs.live('blur', function(e) {
    jQuery(this).next('.farb-popup').hide();
    jQuery(this).parents('li').css( {
        zIndex : '0'
    })
});

Should be replace 'live' to 'on' check below

    $colorpicker_inputs.on('focus', function(e) {
    jQuery(this).next('.farb-popup').show();
    jQuery(this).parents('li').css( {
        position : 'relative',
        zIndex : '9999'
    })
    jQuery('#tabber').css( {
        overflow : 'visible'
    });
});

$colorpicker_inputs.on('blur', function(e) {
    jQuery(this).next('.farb-popup').hide();
    jQuery(this).parents('li').css( {
        zIndex : '0'
    })
});

One more basic exmaple below :

.live(event, selector, function) 

Change it to :

.on(event, selector, function)
Whiskey answered 13/10, 2020 at 7:19 Comment(0)
F
3

If you happen to be using the Ruby on Rails' jQuery gem jquery-rails and for some reason you can't refactor your legacy code, the last version that still supports is 2.1.3 and you can lock it by using the following syntax on your Gemfile:

gem 'jquery-rails', '~> 2.1', '= 2.1.3'

then you can use the following command to update:

bundle update jquery-rails

I hope that help others facing a similar issue.

Florrie answered 5/7, 2017 at 19:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.