【问题标题】:jQuery 1.9 .live() is not a functionjQuery 1.9 .live() 不是函数
【发布时间】:2012-12-30 12:20:12
【问题描述】:

我最近将 jQuery 从 1.8 更新到 2.1。我突然发现.live() 停止工作了。
我收到错误TypeError: $(...).live is not a function

有什么方法可以代替.live()吗?

【问题讨论】:

    标签: javascript jquery function live deprecated


    【解决方案1】:

    jQuery .live() 已从 1.9 版开始删除。

    这意味着,如果您从 1.8 及更早版本升级,如果您不遵循以下迁移指南,您会发现出现问题。您不能简单地将.live() 替换为.on()


    在开始搜索和替换之前阅读:

    对于实时站点上的快速/热修复不要只需将关键字 live 替换为 on
    作为 参数不同

    .live(events, function)
    

    应该映射到:

    .on(eventType, selector, function)
    

    (子)选择器非常重要!如果您出于任何原因不需要使用它,请将其设置为null


    迁移示例 1:

    之前:

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

    之后,您将子元素 (a) 移动到 .on() 选择器:

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

    迁移示例 2:

    之前:

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

    之后,将元素 (.myButton) 移动到 .on() 选择器,并找到最近的父元素(最好带有 ID):

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

    如果你不知道作为父母应该放什么,body 总是有效的:

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

    另见:

    【讨论】:

    • 太好了。在大多数情况下,我使用了最新的方法,因此将 jQuery('.upload_image_button').live('click', function) 之类的代码替换为 jQuery('body').on('click', '.upload_image_button', function) 之类的代码,它就像一个魅力(当然是在缓存清理之后!)
    • +1 我刚刚继承了一个非常古老的遗留应用程序,其中包含一组损坏的点击行为需要修复。 “迁移示例”很到位,非常有帮助。
    【解决方案2】:

    您可以通过包含以下 JavaScript 代码来避免重构代码

    jQuery.fn.extend({
        live: function (event, callback) {
           if (this.selector) {
                jQuery(document).on(event, this.selector, callback);
            }
            return this;
        }
    });
    

    【讨论】:

    • 应在函数末尾包含return this; 以保持链接能力
    • 以后使用这个会不会出问题?
    • 您可能需要考虑将其包含在针对某个版本的 if 条件中。例如。 if ($.fn.jquery != "x.x.x") { //在此处执行此代码 }。这是必需的,因为某些旧版本可能没有“开启”功能
    【解决方案3】:

    .live() 的 jQuery 转发端口 >= 1.9 避免重构 .live() 上的 JS 依赖项 使用优化的 DOM 选择器上下文

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

    【讨论】:

    • 这对我的情况来说非常好:必须在 jQuery 1.11.2 上工作。谢谢!
    • 谢谢@david,这帮助我解决了 WordPress 旧插件的问题,以便使用新的更新。
    【解决方案4】:

    jQuery API 文档将live() 列为自 1.7 版起已弃用并自 1.9 版起已删除:link

    不推荐使用的版本:1.7,已删除:1.9

    它还指出:

    从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用.on() 附加事件处理程序。旧版本 jQuery 的用户应该使用 .delegate() 而不是 .live()

    【讨论】:

      【解决方案5】:

      .live() 已被弃用,现在已从 jQuery 1.9 中删除 你应该使用.on()

      【讨论】:

        【解决方案6】:

        .live 在 1.9 中被移除,请查看升级指南:http://jquery.com/upgrade-guide/1.9/#live-removed

        【讨论】:

          【解决方案7】:

          一个非常简单的修复,不需要改变你的代码,只需添加jquery迁移脚本,在这里下载 https://github.com/jquery/jquery-migrate/

          它提供了 jquery 已弃用但需要的功能,例如“live”、“browser”等

          【讨论】:

            【解决方案8】:

            如果没有必要,我倾向于不使用 .on() 语法。例如,您可以像这样更轻松地迁移:

            旧:

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

            新:

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

            以下是有效事件处理程序的列表:https://api.jquery.com/category/forms/

            【讨论】:

            • 我认为 .on() 语法仅适用于动态加载的内容(例如,加载页面后添加的元素)。
            【解决方案9】:

            当我在我的网站上收到此错误时。它将停止某些功能 在我的网站上,经过研究,我找到了解决这个问题的方法,

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

            应将 'live' 替换为 'on' 检查下方

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

            下面是一个更基本的例子:

            .live(event, selector, function) 
            

            改成:

            .on(event, selector, function)
            

            【讨论】:

              【解决方案10】:

              如果你碰巧在使用 Ruby on Rails 的 jQuery gem jquery-rails 并且由于某种原因你不能重构你的遗留代码,最后一个仍然支持的版本是 2.1.3 并且你可以通过使用锁定它Gemfile 上的以下语法:

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

              那么您可以使用以下命令进行更新:

              bundle update jquery-rails
              

              我希望能帮助其他面临类似问题的人。

              【讨论】:

                猜你喜欢
                • 2013-05-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-16
                相关资源
                最近更新 更多