jQuery 1.9 .live() is not a function

JavascriptJqueryFunctionLiveDeprecated

Javascript Problem Overview


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()?

Javascript Solutions


Solution 1 - Javascript

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 keyword 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, body always works:

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

See also:

Solution 2 - Javascript

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;
    }
});

Solution 3 - Javascript

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);
          }
      }
  });
}

Solution 4 - Javascript

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()

Solution 5 - Javascript

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

Solution 6 - Javascript

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

Solution 7 - Javascript

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

Solution 8 - Javascript

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/

Solution 9 - Javascript

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)

Solution 10 - Javascript

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionngplaygroundView Question on Stackoverflow
Solution 1 - JavascriptSamuel LiewView Answer on Stackoverflow
Solution 2 - JavascriptLiran BarnivView Answer on Stackoverflow
Solution 3 - JavascriptDavid ThomasView Answer on Stackoverflow
Solution 4 - JavascriptSirkoView Answer on Stackoverflow
Solution 5 - JavascriptkoopajahView Answer on Stackoverflow
Solution 6 - JavascriptmatinoView Answer on Stackoverflow
Solution 7 - JavascriptTofeeqView Answer on Stackoverflow
Solution 8 - JavascriptGerfriedView Answer on Stackoverflow
Solution 9 - JavascriptAslam KhanView Answer on Stackoverflow
Solution 10 - JavascriptfagianiView Answer on Stackoverflow