2013-04-21 6 views
1

Я пытаюсь использовать toggle() для завершения событий кликов. В этом случае я читаю API и использую toggle(function1, function2, ...). Но это было странно. Тег просто скрывается, когда я нажимаю на него, а не выполняет эти функции внутри.jQuery toggle не работает, когда аргумент является функциями

Это мой код 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. –

+0

Какую версию jQuery вы используете? Я думаю, что эта форма 'toggle()' была удалена в 1.9. – Barmar

+0

Извините! Я читал API по-китайски, возможно, слишком старый. Я пользователь 1.9, и сейчас я читаю авторитетный API. Итак, есть ли другая функция, чтобы заменить переключатель? – user1550968

ответ

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

+0

@ user1550968 - Просто используйте '.dblclick' вместо' .click'. –

+0

Это не совсем поведение в примере OP. 'prop()' будет возвращаться только для 1-го элемента. Если первый проверяется вручную, он затем снимет все. – Andre

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

Делая это, вы не будете нуждаться в «OnClick атрибут» в #lime элемента. Просто удалите его и дайте jQuery привязать обработчик кликов к вам. Обычно это хорошо, поскольку он отделяет структуру и поведение.

Edit:

Если вам нужна функция, которая воспроизводит старое поведение переключения 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

+0

Нет проблем, я сделал это для удовольствия и разместил здесь для дальнейшего использования. – Andre

+0

@ Мужчина, ты действительно помог мне ^^ –