Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не работает toggle (https://javascript.ru/forum/jquery/37374-ne-rabotaet-toggle.html)

Алек 17.04.2013 16:04

Не работает toggle
 
День добрый, я вот пишу скрипт чтоб по клику на блок изображение сворачивалось и текст блока менялся, а при повторном клике блок разворачивался и текст блока обратно менялся.
Вот сам код:
$('#div_tog').toggle(function(){
$('#div_img').fadeOut(1000);
$(this).text('Развернуть');
}, function(){
$('#div_img').fadeIn(1000);
$(this).text('Свернуть');
});
Вставляю вместо toggle hover, сам код работает, а когда toggle сам блок мгновенно сворачивается и всё, в чём здесь может быть проблема и как осуществить этот скрипт с помощью toggle?

tsigel 17.04.2013 16:26

Потому что в последней версии jQuery больше нет этого метода (по крайней мере в этом применении)

Алек 17.04.2013 16:33

Это катастрофа! А как же тогда мне осуществить данную задачу, есть идеи?

tsigel 17.04.2013 16:37

Самое простое решение - флаг.
var flag = new Boolean(true);//Создаем логическую переменную (со значением true)

$('selector').click(function() {
  if (flag) {//Если flag == true
    flag = false;//Меняем значение переменной flag
    func1.call(this);//Вызываем func1 с контекстом этой функции (т.е. в вызванной функции this = this этой функции)
  } else {//Если flag не равно true
    flag = true;
    func2.call(this);
  }
  return false;
});

function func1() {...};
function func2() {...};


Но в общем никто не мешает вам пользоваться не последней версией jQuery.

tsigel 17.04.2013 16:44

jQuery написан на javascript и никакой магии в нем нет. Любой его метод можно написать самостоятельно.

Алек 17.04.2013 16:55

Цитата:

Сообщение от tsigel (Сообщение 246712)
jQuery написан на javascript и никакой магии в нем нет. Любой его метод можно написать самостоятельно.

Хорошо бы ещё понять как это сделать!
Потому что у меня чё-то всё равно не получается данную задачу решить.

tsigel 17.04.2013 17:07

Вы решение с флагом пробовали? Что говорит консоль? Сделайте тестовый пример.

Алек 17.04.2013 17:24

Первый раз пробовал, ошибка была в if (flag) иф проперти ай ди,
Потом ошибки не было, но скрипт не работал, сейчас вот так делаю:
var flag = new Boolean(true);

$('#formHide').click(function(){
if (flag) {
flag = false;
func1.call(this);
}else {
flag = true;
func2.call(this);
}
return false;
});

function func1(){
$('#forheader').fadeOut(3000)};
function func2(){
$('#forheader').fadeIn(3000)};
Всё заработало!
Спасибо бааальшое. flag это реально круто.

Алек 17.04.2013 17:26

Но я всё равно не очень понимаю как это работает, буду разбираться сейчас на другом примере. Если есть ссылки на материалы по этой теме, поделитесь плиз.

tsigel 17.04.2013 17:35

Я добавил комментарии к своему коду (выше).

В данном коде я использовал:
call,
boolean,
if

Алек 17.04.2013 18:09

Всё, вроде разобрался, после того как свершилось событие click true изменилось на false и произошло действие fadeOut, а после этого если кликнем ещё раз false изменится на true и произойдёт действие fadeIn.
Но назначение return false мне не очень понятно, а его закомментировал, скрипт прекрасно выполняется.

Алек 17.04.2013 18:15

Всё, вроде разобрался, после того как свершилось событие click true изменилось на false и произошло действие fadeOut, а после этого если кликнем ещё раз false изменится на true и произойдёт действие fadeIn.
Но назначение return false мне не очень понятно, я его закомментировал, скрипт прекрасно выполняется.

tsigel 17.04.2013 18:16

Цитата:

Сообщение от Алек
return false

Это для универсальности) Часто вешают событие на ссылку, с href='#', а потом удивляются что ничего не работает. return false отменяет действие по умолчанию события click.

Алек 17.04.2013 18:31

Да точно, я такое видел событие click вешали на ссылку для того чтоб валидно было открывать страницу в новом окне, я не совсем сначала это понимал, но походу разницу в написании target="blank" и target="_blank" пытались компенсировать js.
Других причин для этого я не вижу, для изменения стиля ссылки легче использовать css a:hover и a active

Akella79 08.08.2013 04:21

$('#formHide').click(function() {
$('#my_form').toggle("slow");
($(this).text()=='Развернуть')?$(this).t ext('Cвернуть'):$(this).text('Развер уть');
});

Алек 08.08.2013 17:52

Akella79,
У меня версия jquery-1.9.1, там метод .toggle не работает, приходится использовать конструкцию со state:
$(function(){
var state = true;
$('#gallery_1').click(function(){
	if(state){
		$('#gallery').show('slide', 1000, function(){
			$('#gallery_1').attr('value','Скрыть галерею')
		});	
	}
	else{
		$('#gallery').hide('explode', 1000, function(){
			$('#gallery_1').attr('value','Показать галерею')		
		});	
	}
	state = !state; 
})
});

Это лучший метод решения данного вопроса, взял его из http://jqueryui.com/animate/

Akella79 09.08.2013 03:22

Версия *! jQuery v1.10.2
В версии jquery-1.9.1 должно тоже работать, там синтаксис самой функции немного поменялся,
http://api.jquery.com/toggle/
fadeOut FadeIn не нужно прописывать, toggle сама это делает,
вот пример
$('#clickme').click(function() {
  $('#book').toggle('slow', function() {
    // функция по завершению анимации
//тут можно прописать смену атрибутов т.е Показать/скрыть 
  });
});

первый параметр скорость сворачивания/ разворачивания

Apollon 10.11.2013 12:45

Тогда уж лучше сразу так написать

$('#formHide').click(function(){
if ($('#formHide').text() == 'Свернуть форму'){
$('#my_form').slideUp(1000);
$(this).text('Развернуть форму')}

else {
$('#my_form').slideDown(1000);
$(this).text('Свернуть форму');}
});

Тут хоть время выполнения эффекта задать можно.
Да испортили разработчики toggle.

Apollon 10.11.2013 12:49

$('#clickme').click(function() {
$('#book').toggle('slow', function() {
// функция по завершению анимации
//тут можно прописать смену атрибутов т.е Показать/скрыть
});
});
Тогда показать/скрыть применится к $('#book'), а как я понимаю надо бы к $('#clickme')

Apollon 10.11.2013 13:29

Еще можно сделать так, вставьте код ниже в jquery и toggle будет работать, как раньше
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 );
};

рони 10.11.2013 13:34

Apollon,
:write: oldtoggle

Apollon 10.11.2013 13:40

А чтобы были и старые, и новые особенности toggle, то первую строку в коде выше запишите так
jQuery.fn.toggleOld = function( fn, fn2 ) {
Используя в скрипте toggle вы получите доступ к новым функциям
Используя в скрипте toggleOld вы получите доступ к старым функциям

Apollon 10.11.2013 13:41

Цитата:

Сообщение от рони (Сообщение 280315)
Apollon,
:write: oldtoggle

Тоже верно :lol:

Apollon 10.11.2013 13:59

Спасибо. Так код покороче будет!

GHawk 06.06.2015 21:41

Легкое решение
 
$('#formHide').click(function() {
$('#my_form').toggle();
if($(this).text() == "Скрыть форму") {$(this).text("Показать форму");}
else {$(this).text("Скрыть форму");}

});

u4enik12 14.02.2016 22:20

Привет всем у меня такое же проблема но только ссылками как добавить два get запроса на одном ссылке то есть при первой нажатии на ссылку передавалось один запрос а втором нажатии второй буду очень признателен не где не могу найти
код примерно сделал так:
$(document).ready(function() {
var flag = new Boolean(true);
$('.price11').click(function(){
if (flag) {
flag = false;
func1.call(this);
}
else {
flag = true;
func2.call(this);
};
return false;
});

function func1(){
$('.price11').attr('href', "?id=2");

};
function func2(){
$('.price11').attr('href','?id=1');
};

});
если убрать return false;
только func1 работает а func2 почему то не работает пожалуйста помогите.
если оставить return false;
тогда она не передается get запрос;

VLKxCMIT 20.04.2016 20:04

$('#formHide').click(function(){
$('#my_form').fadeToggle(1000);
});


Часовой пояс GMT +3, время: 13:31.