已弃用的jQuery Toggle事件的替代方法

28

jQuery的Toggle Event函数已经在1.9版本中被移除

我之前是这样使用这个函数的:

$('#example').toggle(function() {
    do stuff
}, function() {
    do stuff
});

现在Toggle Event已经消失,重新实现这个功能的最佳方法是什么?

2个回答

13

加载MIGRATE并查看其中的代码

请查看我关于同样问题的帖子

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

我建议将其重命名为 fn.toggler 而不是删除它

这是代码-它是一个自包含的jQuery插件,可以直接使用。

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

简短的、未经测试的版本:

(function( $ ){
  $.fn.toggler = function( fn, fn2 ) {
    var args = arguments,guid = fn.guid || $.guid++,i=0,
    toggler = function( event ) {
      var lastToggle = ( $._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
      $._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
      event.preventDefault();
      return args[ lastToggle ].apply( this, arguments ) || false;
    };
    toggler.guid = guid;
    while ( i < args.length ) {
      args[ i++ ].guid = guid;
    }
    return this.click( toggler );
  };
})( jQuery );

谢谢。我已经使用了jQuery Migrate插件来确定该函数已被删除(文档不是很好),但我不想将此插件作为解决方案留下。有什么好的替代品吗? - AlecRust
将上述代码添加到您的脚本中。它本身就是一个插件。 - mplungjan
2
我很惊讶没有更简洁的方式来复制这个功能。不过还是谢谢! - AlecRust
如果你重命名该函数并删除对其他开关和注释的测试,那么你只剩下几行代码。 - mplungjan
1
好的,已标记为答案,再次感谢。 - AlecRust

8

这也能很好地工作。

$.fn.toggleClick = function(){

    var functions = arguments ;

    return this.click(function(){
            var iteration = $(this).data('iteration') || 0;
            functions[iteration].apply(this, arguments);
            iteration = (iteration + 1) % functions.length ;
            $(this).data('iteration', iteration);
    });
};

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