Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов анкерных переходов 
:(
    Опции темы
Cheba
  Дата 28.1.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Как можно отследить переход по анкерам (ссылкам внутри документа)?
Я имею в виду переходы с http://example.com/doc.html#anchor1 на http://example.com/doc.html#anchor2
Отлов кликов по ссылкам не предлагать. Это "самое простое решение" имеет громадную кучу недостатков.
Надо отлавливать не только переходы по ссылкам, но и по back/next, и по ручному воду адреса, и по переходу из истории или закладки. В общем, все возможные виды таких переходов.
Вся проблема состоит в том, что такие переходы не порождают событий типа load или unload...
PM MAIL ICQ   Вверх
Sardar
Дата 28.1.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



В заголовке документа пропиши:

if(location.hash != '') ....

location.hash содержит якорь.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Cheba
Дата 28.1.2006, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Где лежит якорь я знаю. Но мне надо обрабатывать переходы между якорями. Я не хочу постоянно опрашивать содержимое якоря - это очень напрягает. Я хочу получать уведомление в момент смены якоря.
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 28.1.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Код

<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251'>
<script type='text/javascript'>
if (location.hash != '') {
    alert('Страница загружена с якорем: ' + location.hash);
}
function init() {
var list = document.getElementsByTagName('A');
    for (var i = 0; i < list.length; i++) {
        var a = list[i];
        if (a.addEventListener) {
            a.addEventListener('click', filter, false);
        } else if (a.attachEvent) {
            a.attachEvent('onclick', filter);
        }
    }
}

function filter(ev) {
var evt = ev || window.event;
var a = (evt.srcElement) ? evt.srcElement : evt.target;
    if (a.href.indexOf('#') != -1) {
        alert( 'Ссылка с якорем: ' + a.href.substr(a.href.indexOf('#')) );
    }
return false;
}

window.onload = init;
</script>
</head>

<body>
<a href='#bottom'>Перейти вниз</a>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<a name="bottom"></a><br>
</body>
</html>

PM   Вверх
Cheba
Дата 28.1.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Ну, и? Вот ежели я руками сбацаю в адресной строке анкер оно мне покажет его? Не покажет. А ежели я из букмарков перейду? тоже не покажет. А если по кнопке Back? Тоже не покажет. А меня интересуют как-раз эти случаи.
PM MAIL ICQ   Вверх
Sardar
Дата 28.1.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Cheba @ 28.1.2006, 17:40 Найти цитируемый пост)
Но мне надо обрабатывать переходы между якорями. Я не хочу постоянно опрашивать содержимое якоря - это очень напрягает.

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

Разьясняю что подсказал я: загружаеться страница, ты читаешь якорь, если он изменился (следовательно хранишь ты его либо в куках, либо на сервере), то выполняешь что хочешь.

Дай больше инфы что ты делаешь, бдует менее пугающее решение.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ciber SLasH
Дата 29.1.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Можно ещё на window.onscroll повесить проверку location.hash
PM   Вверх
Cheba
Дата 29.1.2006, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Делаю AJAX сайт. Хоче чтобы у него была нормальная (привычная) обработка кнопок Вперед/Назад. Хочу чтобы нормально можно было букмарки создавать. Хочу чтобы история сохранялась. Для этого надо как-то модифицировать УРЛ, бо именно по нему идентифицируются "места, где побывал". Чтобы не перезагружалась страница можно менятьтолько хешевую часть УРЛа.
Далее. Подставлять хеши умею. Они сохраняются в истории и кнопки вперед-назад и букмарки начинают работать как надо. По онлоаду из хеша достаю состояние приложения и все прекрасно. Возникает следующая проблема когда УРЛы отличаются только хешами не происходит событие load (вернее в ИЕ оно происходит, а в Лисе - нет). Вот мне и надо отлавливать момент перехода между такими УРЛами, где только хеши рознятся.

В ИЕ можно вешать листенеры на хитрое событие onpropertychange.
Код
if (IE)
    if ("onpropertychange" in document && "attachEvent" in document) {
        document.attachEvent("onpropertychange", function () {
            if (event.propertyName == "location") {
                d(document.location.hash);
            }
        });
    }

Однако, у меня это свойстко почему-то никогда не меняется. Может, я не туда вешаю?

Но зато в ИЕ load происходит (хотя и не понятно почему) - тут, вроде проблем нет.

Для Лисы думал сделать следующее. Подменить геттер и сеттер для document.location.hash. Но там вылезает ошибка - redeclaration of getter hash.

Кому интересно, вот кусочек (нерабочего) кода для подмены геттеров и сеттеров.
Код
if (Mozilla)
{
    document.location._hash = document.hash;
    
    document.location.__defineGetter__('hash', function() {return document.location._hash});
    document.location.__defineSetter__('hash', function(newHash){
        if (newHash != document.location._hash)
            if (document.location.onHashChanged)
            {
                if (document.location.onHashChanged(newHash) !== false)
                    document.location._hash = newHash;
            }
            else
            {
                document.location._hash = newHash;
            }
        });

    document.location.onHashChanged = function(hash)
        {
            d(hash);
        }
}

Собственно, далее __defineGetter__ дело не идет из-за ошибки.

Вот такие вот идеи для реализации того, что в обчных условиях давно уже работает.
PM MAIL ICQ   Вверх
12345c
Дата 31.1.2006, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Кстати, я попробовал половить переходы в IE между анкерами по onload - тоже не ловит. Ходил по локальным файлам, а не через веб-сервер, может в этом дело, отчего onload не срабатывало?

А знание переходов нужно же не сразу по переходу, а в какой-то процедуре? Поэтому анализ history и history.length в нужном месте мог бы дать кое-что.


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
Onis
Дата 2.6.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Cheba
У меня такая же проблема. Вы нашли способ её решения?
PM MAIL   Вверх
Onis
Дата 3.6.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Если кто-то знает решение проблемы без использования jquery и другой ереси, буду очень благодарен.

Это сообщение отредактировал(а) Onis - 3.6.2009, 17:28
PM MAIL   Вверх
Nechto
  Дата 9.1.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 31.5.2009

Репутация: нет
Всего: нет



У меня тоже такая же проблема. И она каким то способом решатся через iframe. Я в этом направлении напрягаюсь! кому интересно давайте вместе дробить эту тему!

в файле исходиники gmail они решили эту проблему!



Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  gmail.doc 348,00 Kb
PM MAIL   Вверх
Се ля ви
Дата 3.2.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(Cheba @  29.1.2006,  01:39 Найти цитируемый пост)
Но зато в ИЕ load происходит (хотя и не понятно почему) - тут, вроде проблем нет.


Цитата(12345c @  31.1.2006,  03:40 Найти цитируемый пост)
Кстати, я попробовал половить переходы в IE между анкерами по onload - тоже не ловит. Ходил по локальным файлам, а не через веб-сервер, может в этом дело, отчего onload не срабатывало?

Народ, а может, в версии IE проблемко?..


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Dubrov
Дата 6.6.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.7.2006
Где: Горы

Репутация: нет
Всего: нет



Да, проблема действиетельно актуальная, я выкрутился установкой обработчика onclick всем ссылкам:

Код

        $("a").click(function(){
            location = $(this).attr("href");
            processLocation();
        });



А в функции processLocation(); обработка урла
ЗЫ, можно конечно и без ЖКвери обойтись, если кому он не симпатизирует.

PM MAIL WWW ICQ   Вверх
ksnk
Дата 6.6.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Dubrov, а кнопки "назад-вперед" броузера тоже ловишь?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0987 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.