05.11.2012, 07:25
|
Интересующийся
|
|
Регистрация: 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();
});
|
|
05.11.2012, 08:00
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
hashOn = 0;
location.hash = "search-"+string;
//где отлавливаю
$(window).on('hashchange', function() {
if ( hashOn ) {
return change();
}
hashOn = 1;
});
|
|
05.11.2012, 13:49
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
Цитата:
|
подобное не всегда меня устраивает, и есть необходимость обращаться к функции поиска напрямую и только после этого менять ссылку
|
зачем?
__________________
.ня
|
|
06.11.2012, 07:38
|
Интересующийся
|
|
Регистрация: 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 не поддерживают хеш.
|
|
06.11.2012, 15:20
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
сдаётся мне, что ты не там пытаешься это делать. сначала менять адрес, а потом на основе адреса делать запросы - правильная архитектура. причём обработку нужно делать с задержкой, так как хеш можно поменяться несколько раз подряд. ввиду этого onhashchange использовать мало смысла - проще и универсальней проверять хеш по таймеру.
__________________
.ня
|
|
06.11.2012, 16:30
|
что-то знаю
|
|
Регистрация: 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 );
|
|
07.11.2012, 03:05
|
Интересующийся
|
|
Регистрация: 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.
|
|
07.11.2012, 04:20
|
Интересующийся
|
|
Регистрация: 19.08.2012
Сообщений: 17
|
|
Хотя не, я еще вчера добавил блокирующую переменную, чтобы при запуске из поля ввода или смене страниц hashchange не срабатывал, но хеш менялось, так ее и не убрал
if(c == 1) updateHash("search-"+string);
если убрать эту переменную, то есть как-бы всегда менять хеш без последствий, не зависимо от того откуда запрос пришел то все возвращается на круги своя например кнопка браузера “назад” реагируют через раз, а кнопка “вперед” вообще умирает.
Видимо в случае когда меняется хеш затем выводиться результат и затем опять происходит смена хеш без реакции hashchange, эти все манипуляции сохраняются.
|
|
19.06.2014, 11:36
|
Новичок на форуме
|
|
Регистрация: 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 с русского на лат. при создании постов и статей, а тут ссылки формируются по запросу.
|
|
|
|