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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват кликов на ссылки, как бы сделать покроссбраузернее? 
:(
    Опции темы
Stampede
Дата 1.11.2005, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Мда, смешное слово получилось: "покроссбраузернее" smile Но суть, надеюсь, понятна.

В общем, идея такая. Сколько человечество себя помнит, люди всегда мечтали заполучить способ отслеживания уходов с сайта по внешним ссылкам. Например, чтобы оценить эффективность баннеров своими силами, а не полагаясь на статистику баннерообменника. Можно, конечно, ссылки на внешние ресурсы делать примерно такого вида: /redir.htm?url=your.external.link.com.

Работать будет хорошо, но смотреться - некрасиво, особенно в строке статуса. Знающему человеку сразу станет ясно, что за ним как бы подсматривают. А люди не любят, когда за ними подсматривают. Люди хотят, что если вы ссылаетесь на сайт фирмы IBM, то чтобы и линк был простой и понятный: http://ibm.com, без всяких там выкрутасов. Поэтому лучше подсматривать так, чтобы никто ни о чем не догадывался.

Покя я держался в стороне от JavaScript, я думал, что решения не существует. Но когда втыкнул, какая моща скрывается за его уродливым фасадом, то тут меня сразу и осенило. Действительно, нет ничего проще! Вот примерный алгоритм не псевдокоде:

Код

по загрузке страницы
  взять массив анкеров
  для каждого анкера
    если ведет на чужой сайт
      повесить обработчик клика

обработчик_клика()
{
  сформировать урл вида /redir.htm?url=настоящий урл
  открыть ссылку в новом окне
}


В общем, так примерно все и сделал, работает почти нормально, но в лисе и опере после открытия нового окна отрабатывает таки клик на оригинальный линк, и основное окно перезагружается. Как бы это дело пресечь? Привожу упрощенный код (рабочий):

Код

<html>
<head>

<script type="text/javascript">

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', redir, false);
    }
    else if (a.attachEvent)
    {
      a.attachEvent('onclick', redir);
    }
  }
}

function redir(e)
{
  var evt = e? e : window.event;
  var a = (evt.srcElement)? evt.srcElement : evt.target;
  var wnd = window.open('http://google.com/');
  return false;
}

window.onload=init;

</script>

</head>

<body>
Link: <a href="http://amazon.com/">Amazon.com</a>
</body>

</html>


Пробовал в addEventListener указывать и true, и false - ничего не помогает. Идеи?



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Stampede
Дата 1.11.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Все, почти починилось - спасибо Aliance и Sardar за статью Все о событиях. Добавил в конце обработчика такой код:

Код

  if (evt.cancelBubble)
  {
    evt.cancelBubble = true;
  }
  if (evt.stopPropagation)
  {
    evt.preventDefault();
    evt.stopPropagation();
  }


Теперь вылезла новая засада: перехват не срабатывает (естественно), если переход инициируется из контекстного меню. Нет ли какого общего события именно по переходу по ссылке? Глянул в MSDN - ничего похожего не обнаружил.

Это сообщение отредактировал(а) Stampede - 1.11.2005, 21:21
PM WWW   Вверх
Stampede
Дата 1.11.2005, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Вот, выложил для наглядности. Работу скрипта в действии можно заценить вот здесь
PM WWW   Вверх
sergejzr
Дата 1.11.2005, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



А почему бы не пробежаться по всем ссылкам и не навесить своего редиректа? Шифруемся? smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Stampede
Дата 2.11.2005, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(sergej @ 1.11.2005, 23:33)
А почему бы не пробежаться по всем ссылкам и не навесить своего редиректа?


П-переведи?

Переопределить href? Для этого и JavaScript не нужен: все можно было бы сделать еще на сервере. Идея-то ведь сделать так, что человек заходит, видит линк, наводит на него мышкой и видит кристально чистый УРЛ. Даже если полезет в сорцы, опять же видит чистейший незамутненный HTML: <a href="http://ibm.com">IBM</a>. Никаких подвохов, все в открытую!

А джаваскрипты, да еще внешние - кто же их просматривает? smile А если еще и обозвать понеявнее. Или засунуть внутрь безобидного скрипта, типа calendar.js. И все щасливы! Юзер думает, что ходит по "чистым" ссылкам, мы - втихую собираем статистику уходов.

Да, и если кому-то в этом видится нечто "неэтичное", то я должен специально пояснить: мы в данном случае собираем статистику не по юзерам (по юзерам, конечно, тоже - как и любой другой сайт), а по рекламодателям (или любым другим внешним ресурсам), как средство анализа эффективности ссылок.

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


PM WWW   Вверх
Sardar
Дата 2.11.2005, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Странный юзер... к ссылкам так критично относиться... smile
Xотя ты прав, по опыту уже выработался рефлекс копировать "особую" ссылку и вставлять в адрес на прямую, т.к. сайт со счётчиком почти всегда жутко тормозит, ждать по 3-5 секунд пока он разродиться статистикой не хочеться.

return false по идее не должен работать только в ИЕ из за отстойности работы attachEvent. Xотя preventDefaut() это конечно же правильней, т.к. по стандарту. ИЕ естественно сего метода у event не имеет, для него нужно добавить event.returnValue=false;.

А вообще изврат ИМXО smile


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


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(Sardar @ 2.11.2005, 00:58)
А вообще изврат ИМXО


Никакой и не изврат, а очень простое и эффективное средство убить сразу нескольких зайцев:

- открывать внешние ссылки в новом окне без явного указания (уже уволенного в запас) аттрибута target="_blank";

- отлавливать уходы;

- можно автоматически добавлять link.title="Ссылка откроется в новом окне", если title не определен.

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

Так штаааа... smile

PM WWW   Вверх
Sardar
Дата 2.11.2005, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Единственное за это target, я всегда верстаю в HTML4.01 Strict и дотошно отношусь к валидации, но когда нужно таки открыть ссылку в новом окне я плюю на толстолобиков из W3C и использую target, т.к. не требует JS, наглядней и лучше.

Извратом назвал затею, не решение, хотя gmail тоже извратом называют, а удобно smile


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


 




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


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

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