Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   При клике на кнопку переход к якорю и открытие блока (https://javascript.ru/forum/dom-window/60086-pri-klike-na-knopku-perekhod-k-yakoryu-i-otkrytie-bloka.html)

Galyanov 10.12.2015 15:38

При клике на кнопку переход к якорю и открытие блока
 
Здравствуйте!
Прошу помощи.
На сайте в шапке есть форма фильтра с кнопкой
<button type="submit" class="goresult" >Подобрать кондиционер</button>


Результаты сортировки фильтра выводятся в блоке ниже
section class="selection,
до применения фильтра там выводятся все записи без сортировки

Задача такая.
Изначально блок с записями скрывать, при клике по кнопке submit надо блок отображать и поднимать его вверх (прокручивать экран).

Как пробовал.
Поставил якорь перед блоком
<a name="result"></a>
Во-первых якорь срабатывает только если кнопку button обернуть ссылкой на якорь и плюс к тому же поставить такую ссылку рядом, ее приходится скрывать.
<a href="#result"><button type="submit" class="goresult" >Подобрать кондиционер</button></a> 
<a style="opacity:0;" href="#result">дублирующая</a>


Во-вторых когда поставил скрипт который отображает блок с записями при клике на кнопку, исчез переход к якорю.

<script>
function resu() {
  $('.selection').hide();

  $('.goresult').click(function(event) {
    event.preventDefault(); // Для того чтобы при нажатии на ссылку не кидало вверх
    $('.selection').slideToggle();
  });
resu(); 
</script>


Как заставить все это работать вместе и одновременно?

рони 10.12.2015 15:57

Galyanov,
$('.selection').slideToggle()[0].scrollIntoView();

Galyanov 10.12.2015 16:52

Спасибо!
Сделал вот так, только после прокрутки к блоку через несколько секунд блок опять исчезает и кидает наверх
<script>

$('.selection').hide();
$('.goresult').click(function(event) {
    $('.selection').slideToggle()[0].scrollIntoView();
  });

</script>


P.S.
А если повесить это событие не на клик кнопки?
У меня на странице есть код php который запускает функцию фильтрации если что то было передано из формы, может туда добавить как-то код?
<?php if ($_GET && !empty($_GET)) { // если было передано что-то из формы
             go_filter(); // запускаем функцию фильтрации
         } ?>

рони 10.12.2015 16:59

Galyanov,
кидает на верх значит либо форма перегружает страницу либо ссылка.
непонятно в чём проблема -- открыли блок -- взяли позицию блока, проскролили до блока если надо отменили событие по умолчанию.

Galyanov 10.12.2015 17:21

Да, форма перегружает страницу, чего не было до установки скрипта.
Если скрипт убрать, то страница не перегружается.

Galyanov 10.12.2015 17:33

Отменить событие всмысле убрать скрытие?
Вот этим preventDefault() ?

<script>
$('.selection').hide();
$('.goresult').click(function(event) {
    $('.selection').slideToggle()[0].scrollIntoView().preventDefault();
  });
</script>


все равно кидает наверх и блок скрывается

рони 10.12.2015 17:42

Цитата:

Сообщение от Galyanov
Вот этим preventDefault() ?

строка 6 первый ваш пост

рони 10.12.2015 17:46

Galyanov,
и зачем кнопку в ссылку оборачивать? -- и функция сортировки должна скролл делать в конце

Galyanov 10.12.2015 17:47

Да, вот так заработало)
Однако при повторном нажатии на сабмит, блок скрывается...

<script>
$('.selection').hide();
$('.goresult').click(function(event) {
    event.preventDefault();
    $('.selection').slideToggle()[0].scrollIntoView();
    
  }); 
</script>


Т.е. по очереди, нажал - открылось, нажал закрылось.
А если повторно делать фильтрацию, как сделать чтобы уже открытое не закрывалось?

P.S. Обертыванеи я естественно уже убрал, раз функция есть)

Galyanov 10.12.2015 17:51

Блин, я рано радуюсь...
Открывает и скролит это да, но выборка перестала работать, показывает все записи без фильтрации...

рони 10.12.2015 17:54

Galyanov,
так замените slideToggle на show

рони 10.12.2015 17:56

Galyanov,
$('.selection').show()[0].scrollIntoView();

это добавьте в скрипт сортировки и выкиньте скрипт с кликом

Galyanov 10.12.2015 19:48

Если выкинуть скрипт с кликом то по какому событию будет срабатывать?

сделал так:
<script>
$('.selection').hide();

    event.preventDefault();
    $('.selection').show()[0].scrollIntoView();
  }); 
</script>


Блок не скрывает, вниз не опускает...
Как и без скрипта совсем.

рони 10.12.2015 19:56

Galyanov,
Цитата:

Сообщение от рони
это добавьте в скрипт сортировки и выкиньте скрипт с кликом


Galyanov 10.12.2015 20:04

Сортировка у меня на php
function go_filter() { // наша функция
	$args = array(); // подготовим массив 
	$args['meta_query'] = array('relation' => 'AND'); // отношение между условиями, у нас это "И то И это", можно ИЛИ(OR)
	global $wp_query; // нужно заглобалить текущую выборку постов

	if (!empty($_GET['space'])) { // если передан массив с фильтром по комнатам
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'space_num', // название произвольного поля
			'value' => $_GET['space'], // переданное значения, $_GET['rooms'] содержит массив со значениями отмеченных чекбоксов
			'type' => 'numeric', // тип поля - число
			'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
			);
	}
    
    if (!empty($_GET['inverter'])) { // если передан массив с фильтром по комнатам
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'inverter_num', // название произвольного поля
			'value' => $_GET['inverter'], // переданное значения, $_GET['rooms'] содержит массив со значениями отмеченных чекбоксов
			'type' => 'numeric', // тип поля - число
			'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
			);
	}
    
    if (!empty($_GET['made'])) { // если передан массив с фильтром по комнатам
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'made', // название произвольного поля
			'value' => $_GET['made'], // переданное значения, $_GET['rooms'] содержит массив со значениями отмеченных чекбоксов
			'type' => 'numeric', // тип поля - число
			'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
			);
	}

	
			
	query_posts(array_merge($args,$wp_query->query)); // сшиваем текущие условия выборки стандартного цикла wp с новым массивом переданным из формы и фильтруем
}

рони 10.12.2015 20:22

Galyanov,
если сортировка происходит на сервере то перемещение к отсортированному блоку по клику ... как то мало совместимы ... нафига тогда грузить неотсортированную таблицу?

кликнули по одной странице а результат получили уже в другой ... так вам и скрывать на другой ничего ненадо, только проскролить до нужного блока при загрузке страницы.

Galyanov 10.12.2015 20:26

У меня все это происходит на одной странице. Одностраничный сайт.
И показывать все записи мне не надо, а только отсортированный результат...

рони 10.12.2015 20:40

Galyanov,
первоначально грузить блок с неотсортированной таблицей нет смысла в вашем случае -- грузите блок когда отсортируите ... нет блока не скрола к блоку , есть блок и есть скрол к блоку. всё мне больше добавить нечего.
вам к php специалисту.

Galyanov 10.12.2015 21:04

Но в принципе можно сделать блок с нулевой высотой к которому будет скролить.

Galyanov 11.12.2015 21:12

В общем сделал по другому.
При передаче данных из формы результаты выборки подгружаю из php файла, в которм стоит скрипт
<script>
$(window).load(function(){

$(window).scrollTop(1250);
	});
</script>

В итоге появляются данные и страница скролится сразу к результатам.


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