2013-04-21 32 views
1

我试图用toggle()来完成我的点击事件。在这种情况下,我读了API,并使用toggle(function1, function2, ...)。但它很奇怪。当我点击标签时,标签就隐藏起来,而不是在里面执行这些功能。当参数是函数时jQuery切换不起作用

这是我的javascript代码。

function clickMe(){ 
    $("#lime").toggle(
     function(){ 
      var names = document.getElementsByName("selectOne"); 
      var len = names.length; 
      if (len > 0) { 
       var i = 0; 
       for (i = 0; i < len; ++i) { 
        names[i].checked = true; 
       } 
      } 
     },function(){ 
      var names = document.getElementsByName("selectOne"); 
      var len = names.length; 
      if (len > 0) { 
        var i = 0; 
        for (i = 0; i < len; ++i) { 
         names[i].checked = false; 
        } 
      } 
     } 
    ) ;  
} 

这里是HTML代码。

<a href="javascript:void(0);" onclick="clickMe()" id="lime">selectAll</a> 
    <form> 
    <input type="checkbox" name="selectOne" /><br /> 
    <input type="checkbox" name="selectOne" /><br /> 
    <input type="checkbox" name="selectOne" /><br /> 
    <input type="checkbox" name="selectOne" /><br /> 
    <input type="checkbox" name="selectOne" /><br /> 
    <input type="checkbox" name="selectOne" /><br /> 
    </form> 

我在等待评论。感谢提前!

+1

此功能已在jQuery的1.9被删除。 – 2013-04-21 03:20:54

+0

你使用的是什么版本的jQuery?我认为这种形式的'toggle()'在1.9中被删除了。 – Barmar 2013-04-21 03:20:57

+0

对不起!我用中文读取API,可能太老了。我用户1.9,我刚才阅读权威的API。那么,是否有其他功能可以取代切换? – user1550968 2013-04-21 03:26:10

回答

3

This functionality has been removed in jQuery 1.9

用这个代替(适用于旧版本太):

$(function ($) { 

    var inputs = $('input[name=selectOne]'); 

    $("#lime").click(function() { 
     inputs.prop('checked', ! inputs.prop('checked')); 
    }); 
}); 

这里的小提琴:http://jsfiddle.net/3GQDU/


正如指出的@Andre,如果第一个是通过手工检查,它然后将取消全部选中。如果这不是你想要的,用这个:

$(function ($) { 

    var inputs = $('input[name=selectOne]'), 
     flag = true; 

    $("#lime").click(function() { 
     inputs.prop('checked', flag); 
     flag = ! flag; 
    }); 
}); 

这里的小提琴:http://jsfiddle.net/3GQDU/1/

+0

该功能需要双击才能触发事件。可以改进吗? – user1550968 2013-04-21 03:30:50

+0

@ user1550968 - 只需使用'.dblclick'而不是'.click'。 – 2013-04-21 03:31:42

+0

这不完全是OP示例中的行为。 'prop()'只会返回第一个元素。如果第一个手动检查,它将取消全部选中。 – Andre 2013-04-21 03:31:54

1
$(function(){ 
    var check = true; 
    $("#lime").click(function(){ 
     $('input[name=selectOne]').prop('checked', check); 
     check = !check; 
    }); 
}); 

通过这样做,你就不需要了“的onclick”属性中#lime元素。只需将其删除,并让jQuery为您绑定点击处理程序。这通常是一件好事,因为它将结构和行为分开。

编辑:

如果需要再现老的jQuery的切换行为的功能,这里是它的:

(function($){ 
    $.fn.toggleHandlers = function(eventType){ 
     var i = 0; 
     var handlers = $.makeArray(arguments).slice(1); 
     return this.bind(eventType, function() { 
      handlers[i].apply(this, arguments); 
      if(i < handlers.length -1) 
       i++; 
      else 
       i = 0; 
     }); 
    }; 
})(jQuery); 

从jQuery的切换不同的是,它得到一个额外的参数(第一个),那就是事件类型。因此,它适用于点击以外的事件。称其为:

$("#myElement").toggleHandlers('click', handler1, handler2[, handler3]); 

见琴:http://jsfiddle.net/andreortigao/j9MH2/

+0

谢谢你的帮助!你的解决方案是有用的,但我不能用我较低的声誉投票... – user1550968 2013-04-21 06:06:06

+0

没问题,我为了好玩而做了,并且张贴在这里供将来参考。 – Andre 2013-04-21 14:58:57

+0

@安德鲁斯男人,你真的帮我出去^^ – 2013-04-28 21:47:47