【问题标题】:Where has fn.toggle( handler(eventObject), handler(eventObject)...) gone?fn.toggle(handler(eventObject), handler(eventObject)...) 去哪儿了?
【发布时间】:2013-01-13 08:38:25
【问题描述】:

我有this jsfiddle

使用toggle event - 不要与toggle 混淆 - jQuery 版本设置为 EDGE

它突然停止工作并删除了我想要作为触发器的单元格,因为它显然恢复为toggle

我找不到任何弃用标签等

http://api.jquery.com/category/deprecated/ 给出 404

如果我将 Migrate 模块添加到我的 jsFiddle then works 并在控制台中看到警告(由 Frédéric Hamidi 发布的 https://github.com/jquery/jquery-migrate/blob/master/warnings.md 详细说明)

我看到了 Deprecate fn toggleissue 24Ticket #11786,但不是在我希望看到的地方。

我遗漏了什么,我在哪里可以找到它的替代品和文档?

注意:我了解弃用的原因,我只是找不到 官方 弃用文档

$('#tbl .xx').toggle(
  function() {
    $(this).siblings().each(function(){
      var t = $(this).text();
      $(this).html($('<input />',{'value' : t}));
    });
  },
  function() {
    $(this).siblings().each(function(){
      var inp = $(this).find('input');
      if (inp.length){
        $(this).text(inp.val());
      }
    });
  }    
);

MIGRATE 中的代码:

jQuery.fn.toggle = function( fn, fn2 ) {
  // Don't mess with animation or css toggles
  if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
    return oldToggle.apply( this, arguments );
  }
  migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
  // Save reference to arguments for access in closure
  var args = arguments,
  guid = fn.guid || jQuery.guid++,
  i = 0,
  toggler = function( event ) {
    // Figure out which function to execute
    var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
    jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
    // Make sure that clicks stop
    event.preventDefault();
    // and execute the function
    return args[ lastToggle ].apply( this, arguments ) || false;
  };
  // link all the functions, so any of them can unbind this click handler
  toggler.guid = guid;
  while ( i < args.length ) {
    args[ i++ ].guid = guid;
  }
  return this.click( toggler );
};

更新我已经问过他们是否可以将代码保留为 fn.toggler 所以它是重命名而不是删除

【问题讨论】:

  • 根据bugs.jquery.com中的ticket #11786,似乎toggle event已被弃用/弃用;但你是对的,我在toggle event 的页面上也看不到。我建议您在票证上添加评论。
  • 我记得不久前听说过这个,很困惑,前端文档中似乎没有将它标记为已弃用。
  • 为什么投反对票?让我感到惊讶的是,有些人有时间投反对票,却懒得说出原因。

标签: jquery deprecated


【解决方案1】:

jquery .toggle() 的弃用现在记录在 api.jquery.com。 我在forum.jquery 找到了一个很好的替代品,我现在正在使用它。效果很好:)

$.fn.toggleClick = function() {
  var functions = arguments,
      iteration = 0;
  return this.click(function() {
    functions[iteration].call();
    iteration = (iteration + 1) % functions.length;
  });
}

用法:

$("#target").toggleClick(function() {
  alert( "First handler for .toggle() called." );
}, function() {
  alert( "Second handler for .toggle() called." );
});

2014 年 8 月 6 日编辑:我重新考虑了原始代码,发现 .apply 不适合使用。将其更改为 .call 且不传入任何参数。

【讨论】:

  • 我最终将“this”添加到函数中[iteration].call(this);因为我使用的一些旧代码在切换处理程序中引用了“this”
【解决方案2】:

你可以在the list of warnings emitted by the jQuery Migrate plugin找到关于toggle()'s deprecation的官方文档:

JQMIGRATE:jQuery.fn.toggle(handler, handler...) 已弃用

原因:.toggle()有两种完全不同的含义 方法。使用.toggle() 显示或隐藏元素不受影响。 将.toggle() 用作专门的点击处理程序已被弃用 1.8 并在 1.9 中删除。

解决方法:重写依赖$().toggle()的代码,使用 jQuery Migrate 插件的精简生产版本提供 功能,或从 插件的源代码并在应用程序中使用它。

【讨论】:

  • 感谢您指点我。然而,这不是我所期望的。 API 是否有官方弃用或我错过了什么?如您所见,我已经应用了 MIGRATE,但没有找到详细说明的 .md 文件
  • @mplungjan,您没有错过任何内容,toggle() 的文档页面尚未使用此信息进行更新。 API 文档刚刚进行了修改/更新(例如,他们现在说 then()pipe() 相同),也许 toggle() 将成为下一批的一部分。
【解决方案3】:

jQuery 1.9 还不是最终版本。根据升级指南:

“目前,本指南作为标准 jQuery API 文档的附录,这些页面可能不会描述 1.9 版的行为。请耐心等待我们在 api.jquery.com 更新各个页面的文档以反映 1.9 中的变化。”

在这种情况下,我们只是还没有记录它。你们这样的人比我们快!请在此处提交文档票:http://github.com/jquery/api.jquery.com

【讨论】:

    【解决方案4】:

    我使用的代码:

    $('#example').click(function()
        {
        isClicked=$(this).data('clicked');
        if (isClicked) {isClicked=false;} else {isClicked=true;}
        $(this).data('clicked',isClicked);
    
        if(isClicked)
            {
            ...do stuff...
            }
        else
            {
            ...do stuff...
            }
        });
    

    优化后的代码(mplungjan 建议)是:

    $('#example').click(function()
        {
        $(this).data('clicked',!$(this).data('clicked'));
    
        if ($(this).data('clicked'))
            {
            ...do stuff...
            }
        else
            {
            ...do stuff...
            }
        });
    

    【讨论】:

    • 这不是很巧妙。您可以使用 !isClicked 切换 isCicked 但使用您的代码的人需要知道您在测试之前切换,因此 if 必须与预期相反。 $(this).data('clicked',!$(this).data('clicked'));
    • 漂亮!我通常使用没有“压缩”的可读代码。谢谢!
    • 不客气。请注意:您的代码仅处理两次点击。 fn.toggle 的代码处理了任何点击。所以 5 或 10 次点击或任何可能对每次点击产生不同效果的东西。
    • 啊,好的。我只是想让那些需要快速而不是弃用的切换方法的人更容易使用代码版本。您好,谢谢!
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 2011-03-03
    • 2014-03-15
    • 2015-07-17
    • 2012-10-30
    • 2013-05-23
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多