Пробовал не убирать EngineAJAX. Получается медленнее «найти все ссылки на страницы и понять проставлены ли им #!», особенно если на странице 100+ ссылок. Поэтому и убираю класс EngineAJAX, чтобы повторно не анализировать уже преобразованные в якоря ссылки.
даже без использования jQuery.live, почему бы не добавлять в обработанные ссылки дополнительный атрибут или класс, дабы не обрабатывать якоря повторно?
По-моему, проще все ссылки по-умолчанию считать аяксовыми. А при необходимости некоторым ссылкам добавлять какой-нибудь класс, который позволит не обрабатывать их. Примерно как на zaycev.fm.
.delegate() — самое то. C .live() есть проблемы (с контекстом). onHashChanged тут какбе и не надо — один раз заменить ссылки, а потом заменять перед вставкой контента. Тогда через .delegate() мы будем ловить клики, а вот onHashChange() уже и не понадобится.
Рекомендую чаще (а не то и вообще всегда) пользоваться кнопкою «предпросмотр», да притом не на одном только Хабрахабре, но и на всяком таком сайте, на котором предпросмотр есть, а вот зато редактирование комментариев отсутствует совершенно.
Всегда мучал вопрос: Почему большинство пытается прикрутить параметр типа ?notemplate=1, вместо того, чтобы просто проконтролировать заголовок запроса на наличие и тип X-Requested-With?
Конечно, ?notemplate=1 проще контролировать, но контроль X-Requested-With использует уже готовый механизм. К тому же позволяет понять, в каком формате: XML, JSON, HTML клиет хочет получить ответ.
Каюсь, до сегодняшнего дня я не знал про X-Requested-With. Теперь буду применять именно его.
Правда, сразу вижу проблему: nginx на front-end большинства хостеров может не передать этот заголовок.
Hash-навигация в AJAX-сайтах