Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как обмануть “hashchange”. (https://javascript.ru/forum/jquery/32946-kak-obmanut-%E2%80%9Chashchange%E2%80%9D.html)

Broken 05.11.2012 07:25

Как обмануть “hashchange”.
 
Имеется простенький ajax поиск, сначала набранный текст попадает в хеш ссылку (#search-some), а оттуда его извлекает специальная функция и запускает функцию поиска, естественно подобное не всегда меня устраивает, и есть необходимость обращаться к функции поиска напрямую и только после этого менять ссылку, а вот здесь возникли проблемы. Например если обозначить специальную переменную и присвоить ей значение которое не дает запустить функцию отлавливающую изменение хеш, а после изменения ссылки изменить переменную, функция все равно заметит изменение хеш и запустит скрипт заново, в общем если кто подскажет в какую сторону копать буду признателен.

//где запускаю
hashOn = 0; 


//где изменяю 
location.hash =  "search-"+string; 
hashOn = 1; 

//где отлавливаю
$(window).on('hashchange', function() {
	if (hashOn != 0) return change(); 
 });

devote 05.11.2012 08:00

hashOn = 0; 
location.hash =  "search-"+string; 

//где отлавливаю
$(window).on('hashchange', function() {
    if ( hashOn ) {
        return change();
    }
    hashOn = 1;
});

tenshi 05.11.2012 13:49

Цитата:

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

Broken 06.11.2012 07:38

2Devote Спасибо, но помогло только отчасти, если написать
так
$(window).on('hashchange', function() {	
      if(hashOn == 0) hashOn = 1;
      else  return change();
     });

или

$(window).on('hashchange', function() {	
     if(hashOn == 1) {
	 return change();
	 }
       hashOn = 1;
     });

так

Вроде работает правильно, но через раз, например, если использовать кнопки браузера (вперед, назад).

2tenshi уменьшить число запросов к базе с 2-ух до 1-ого, да и вроде ie6-7 не поддерживают хеш.

tenshi 06.11.2012 15:20

сдаётся мне, что ты не там пытаешься это делать. сначала менять адрес, а потом на основе адреса делать запросы - правильная архитектура. причём обработку нужно делать с задержкой, так как хеш можно поменяться несколько раз подряд. ввиду этого onhashchange использовать мало смысла - проще и универсальней проверять хеш по таймеру.

devote 06.11.2012 16:30

(function( $ ) {
    var noAction = false;
    window.updateHash = function( hash ) {
        noAction = true;
        location.hash = hash;
    }
    $( window ).on( 'hashchange', function() {
        if ( !noAction ) {
            change();
        }
        noAction = false;
    });
})( jQuery );

// использование
// если нужно сменить хеш но так что бы не сработал change
// просто вызываем
updateHash( "search-"+string );

Broken 07.11.2012 03:05

2Devote Огромное спасибо, помогло)

2tenshi Я сначала так и сделал, но ие7 меня послал.
С таймером что-то вроде:
//устанавливаю
		setTimeout(checkHach, 10);
        var oldHash = null;
		
		//меняю
		location.hash = "search-"+string;
        
		//отлавливаю
		var hashCheck = function () {
            if( oldHash !== location.hash ) {
                  change();
               }
          setTimeout(checkHach, 10);
          }

Broken 07.11.2012 04:20

Хотя не, я еще вчера добавил блокирующую переменную, чтобы при запуске из поля ввода или смене страниц hashchange не срабатывал, но хеш менялось, так ее и не убрал

if(c == 1) updateHash("search-"+string);



если убрать эту переменную, то есть как-бы всегда менять хеш без последствий, не зависимо от того откуда запрос пришел то все возвращается на круги своя например кнопка браузера “назад” реагируют через раз, а кнопка “вперед” вообще умирает.

Видимо в случае когда меняется хеш затем выводиться результат и затем опять происходит смена хеш без реакции hashchange, эти все манипуляции сохраняются.

Anlay 19.06.2014 11:36

помогитееее((
http://avto-idea.ru
На хостинге mod_rewrite активирован.
плагин Rus filename and link translit установлен.
Выбирая в фильтре на главной тип авто (прописаны на русском “name”)/ (прописаны на русском “name”) год получаем список и если список большой (например «Седан» или «год_2007» ), то страницы в постраничной навигации кодируются:
http://avto-idea.ru/#search/order-孳/page-10/
http://avto-idea.ru/#search/order-㯰age-11/
http://avto-idea.ru/#search/㾴-2010/
http://avto-idea.ru/#search/vehicletype-ᵴ཯page-2/
<a href="javascript:manual_hashchange("%23search%2Fve hicletype-%D0%A1%D0%B5%D0%B4%D0%B0%D0%BD%2Fpage-2/")" class="convertUrl "> и ссылка не работает.
То же самое и с фильтрами (Пробег, цена, Год)- над списком результатов справа.
То есть весь русскоязычный текст в url заменяется иероглифами.
Плагин Rus filename and link translit (rus to lat)нам не помогает, так как меняет url с русского на лат. при создании постов и статей, а тут ссылки формируются по запросу.


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