Как обмануть “hashchange”.
Имеется простенький ajax поиск, сначала набранный текст попадает в хеш ссылку (#search-some), а оттуда его извлекает специальная функция и запускает функцию поиска, естественно подобное не всегда меня устраивает, и есть необходимость обращаться к функции поиска напрямую и только после этого менять ссылку, а вот здесь возникли проблемы. Например если обозначить специальную переменную и присвоить ей значение которое не дает запустить функцию отлавливающую изменение хеш, а после изменения ссылки изменить переменную, функция все равно заметит изменение хеш и запустит скрипт заново, в общем если кто подскажет в какую сторону копать буду признателен.
//где запускаю hashOn = 0; //где изменяю location.hash = "search-"+string; hashOn = 1; //где отлавливаю $(window).on('hashchange', function() { if (hashOn != 0) return change(); }); |
hashOn = 0; location.hash = "search-"+string; //где отлавливаю $(window).on('hashchange', function() { if ( hashOn ) { return change(); } hashOn = 1; }); |
Цитата:
|
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 не поддерживают хеш. |
сдаётся мне, что ты не там пытаешься это делать. сначала менять адрес, а потом на основе адреса делать запросы - правильная архитектура. причём обработку нужно делать с задержкой, так как хеш можно поменяться несколько раз подряд. ввиду этого onhashchange использовать мало смысла - проще и универсальней проверять хеш по таймеру.
|
(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 ); |
2Devote Огромное спасибо, помогло)
2tenshi Я сначала так и сделал, но ие7 меня послал. С таймером что-то вроде: //устанавливаю setTimeout(checkHach, 10); var oldHash = null; //меняю location.hash = "search-"+string; //отлавливаю var hashCheck = function () { if( oldHash !== location.hash ) { change(); } setTimeout(checkHach, 10); } |
Хотя не, я еще вчера добавил блокирующую переменную, чтобы при запуске из поля ввода или смене страниц hashchange не срабатывал, но хеш менялось, так ее и не убрал
if(c == 1) updateHash("search-"+string); если убрать эту переменную, то есть как-бы всегда менять хеш без последствий, не зависимо от того откуда запрос пришел то все возвращается на круги своя например кнопка браузера “назад” реагируют через раз, а кнопка “вперед” вообще умирает. Видимо в случае когда меняется хеш затем выводиться результат и затем опять происходит смена хеш без реакции hashchange, эти все манипуляции сохраняются. |
помогитееее((
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. |