Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.11.2012, 07:25
Интересующийся
Отправить личное сообщение для Broken Посмотреть профиль Найти все сообщения от Broken
 
Регистрация: 19.08.2012
Сообщений: 17

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

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


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

//где отлавливаю
$(window).on('hashchange', function() {
	if (hashOn != 0) return change(); 
 });
Ответить с цитированием
  #2 (permalink)  
Старый 05.11.2012, 08:00
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

//где отлавливаю
$(window).on('hashchange', function() {
    if ( hashOn ) {
        return change();
    }
    hashOn = 1;
});
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 05.11.2012, 13:49
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

Цитата:
подобное не всегда меня устраивает, и есть необходимость обращаться к функции поиска напрямую и только после этого менять ссылку
зачем?
__________________
.ня
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2012, 07:38
Интересующийся
Отправить личное сообщение для Broken Посмотреть профиль Найти все сообщения от Broken
 
Регистрация: 19.08.2012
Сообщений: 17

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 не поддерживают хеш.
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2012, 15:20
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

сдаётся мне, что ты не там пытаешься это делать. сначала менять адрес, а потом на основе адреса делать запросы - правильная архитектура. причём обработку нужно делать с задержкой, так как хеш можно поменяться несколько раз подряд. ввиду этого onhashchange использовать мало смысла - проще и универсальней проверять хеш по таймеру.
__________________
.ня
Ответить с цитированием
  #6 (permalink)  
Старый 06.11.2012, 16:30
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

(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 );
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #7 (permalink)  
Старый 07.11.2012, 03:05
Интересующийся
Отправить личное сообщение для Broken Посмотреть профиль Найти все сообщения от Broken
 
Регистрация: 19.08.2012
Сообщений: 17

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:17.
Ответить с цитированием
  #8 (permalink)  
Старый 07.11.2012, 04:20
Интересующийся
Отправить личное сообщение для Broken Посмотреть профиль Найти все сообщения от Broken
 
Регистрация: 19.08.2012
Сообщений: 17

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

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



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

Видимо в случае когда меняется хеш затем выводиться результат и затем опять происходит смена хеш без реакции hashchange, эти все манипуляции сохраняются.
Ответить с цитированием
  #9 (permalink)  
Старый 19.06.2014, 11:36
Новичок на форуме
Отправить личное сообщение для Anlay Посмотреть профиль Найти все сообщения от Anlay
 
Регистрация: 19.06.2014
Сообщений: 1

помогитееее((
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 с русского на лат. при создании постов и статей, а тут ссылки формируются по запросу.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как включить синхронное выполнение строк? SkaN Элементы интерфейса 1 26.04.2012 22:28
Как писать код который легко поддерживать, расширять, читать. Policeman Общие вопросы Javascript 3 24.03.2012 05:40
Как при быстром многократном клике по кнопке обрабатывать только первый клик battrack jQuery 3 22.03.2012 10:47
Как отловить обратное событие "click" ? jsuse Общие вопросы Javascript 2 18.01.2012 00:16
Как сделать электронный каталог продукции? natarius Серверные языки и технологии 6 24.05.2009 20:56