fn.toggle(handler(eventObject), handler(eventObject)...)去哪了?

22

我有一个这个 jsfiddle

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

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

我找不到任何弃用标签或类似的东西

http://api.jquery.com/category/deprecated/ 返回404

如果我添加Migrate模块,我的jsFiddle 然后就可以工作了,并且在控制台中看到警告(由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,这样就是重命名而不是删除操作。


1
根据在 bugs.jquery.comticket #11786,看起来 toggle event 已经被弃用;但是你说的对,在 toggle event 页面上并没有找到相关信息。我建议你在该 ticket 上添加一条评论。 - Pang
我记得有一段时间听说过这个,但很困惑为什么前端文档中似乎没有将其标记为已弃用。 - Jared Farrish
为什么要踩?有些人总是有时间踩一下,却懒得说出原因,这真的让我感到惊讶。 - mplungjan
4个回答

15

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"添加到了functions[iteration].call(this);中,因为我使用的一些旧代码在切换处理程序中引用了"this"。 - Matthew Lock

9

您可以在jQuery Migrate插件发出的警告列表中找到关于toggle()方法弃用的官方文档:

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

原因:.toggle()方法有两个完全不同的含义,使用.toggle()来显示或隐藏元素不受影响。1.8版本开始,使用.toggle()作为专门的点击处理程序被弃用,1.9版本将其删除。

解决方案:重写依赖于$().toggle()的代码,使用压缩后的jQuery Migrate插件提供功能,或从插件源代码中提取$().toggle()方法并在应用程序中使用。


谢谢你指出这个问题。然而,那不是我预期的结果。API有官方弃用计划吗?还是我错过了什么?正如你所看到的,我已经应用了MIGRATE,但还没有找到详细说明的.md文件。 - mplungjan
1
@mplungjan,你没有错过任何东西,toggle()的文档页面尚未更新此信息。API文档已经进行了全面改进/更新(例如,它们现在说then()pipe()是相同的),也许toggle()将成为下一批更新的一部分。 - Frédéric Hamidi

2

jQuery 1.9还没有最终确定。根据升级指南:

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

在这种情况下,我们只是尚未记录它。你们Stack Overflow的人比我们快!请在此处提交文档工单:http://github.com/jquery/api.jquery.com


1

我使用的代码:

$('#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”来切换“isClicked”,但是谁使用你的代码都需要知道在测试之前进行了切换,因此“if”语句必须与预期相反。 $(this).data('clicked',!$(this).data('clicked')); - mplungjan
太好了!我通常使用易读的代码,不会进行“压缩”。谢谢! - Cuarcuiu
不客气。只是提醒一下:你的代码只处理了两次点击。而 fn.toggle 的代码可以处理任意次数的点击。因此,每次点击可能会产生不同的效果,无论是 5 次、10 次还是其他次数。 - mplungjan
啊,好的。我只是想制作一个更简单的代码版本,以便那些需要快速操作而不使用过时的切换方法。 你好,谢谢! - Cuarcuiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接