Отслеживание кликов Jquery по нажатию мыши против клика

Мне нужно отслеживать исходящие клики из каталога на нашем сайте, и я хотел бы сделать это так, чтобы фактический URL-адрес находился в файле href. Что-то типа:

 <a href="http://www.example.com" id="a24" class="link" >Go to Example</a>

Это JQuery, который я использую ниже. Файл click.php в основном ищет идентификатор ссылки, а затем вставляет информацию о клике в таблицу mysql.

Кажется, это работает нормально, даже если выполнение click.php занимает много времени. Другими словами, пользователь немедленно переходит к целевому URL-адресу, даже если я установил click.php в спящий режим на 10 секунд перед завершением.

Я использую $('a.link').mousedown вместо $('a.link').click. Когда я использую .click, не работает (щелчок не регистрируется). Мне просто любопытно, почему это не работает с функцией .click и работает только с функцией .mousedown.

Это хороший способ зафиксировать клики с помощью JQuery или есть лучший способ? (Я понимаю, что любой, у кого отключен Javascript, не будет учитываться).

$('a.link').mousedown( function(e){

        var my_id = $(this).attr('id');

        $.ajax({    
          type: "GET",
          url: "/tiger/sal/clicks/click.php?id=my_id"
        });

        return true;

});

person Frank    schedule 04.04.2012    source источник


Ответы (2)


Вы не даете jQuery достаточно времени, чтобы вычислить все до того, как направит ваш браузер. Почему бы вам не попробовать что-то вроде:

$('a.link').click( function(e){

   // Prevent the browser from running away
   e.preventDefault();

   // I've changed this to POST to make it a bit more secure
   // You can access the link ID with $_POST['link_id'] now
   $.post('/tiger/sal/clicks/click.php', { link_id: $(this).attr('id') });

   // Wave goodbye
   window.location.href = $(this).attr('href');

});
person hohner    schedule 04.04.2012
comment
Спасибо, но даже если нажатие мыши и выполнение click.php занимает 10 секунд (я включаю sleep(10) в файл click.php), это сработает. Таким образом, он сразу отправляет пользователя на сайт, а затем, примерно через 10 секунд, запись о переходе заносится в таблицу. Это то, что я хочу, чтобы он делал, я думаю, мне просто интересно, почему он работает с наведением мыши, а не с щелчком, и делаю ли я что-нибудь, что может вызвать проблемы с отслеживанием кликов. - person Frank; 04.04.2012
comment
Хорошо. Я отредактировал свой ответ. Вы хотите отправить запрос $.post() с помощью jQuery — это отправит запрос на сервер, а не будет ждать его завершения, прежде чем отправить пользователя в пункт назначения ссылки. Это отправляет всю необходимую информацию вашему сценарию для обработки без того, чтобы пользователь ждал, пока он завершится. Кроме того, я бы постарался максимально избегать использования sleep(), потому что это не очень хорошо для пользовательского интерфейса. - person hohner; 04.04.2012
comment
Большое спасибо, мне нужно уйти прямо сейчас, но я проверю это, как только смогу. Кроме того, я просто включил сон, чтобы посмотреть, что произойдет, если сервер будет очень медленным, и не замедлит ли это людей, добирающихся до целевого URL-адреса. Поэтому я бы удалил это в производстве. - person Frank; 04.04.2012

Я не понимаю, почему это не сработает.

Это работает, когда я тестировал его, но конечная точка URL должна быть исправлена ​​​​в вашем вызове AJAX:

$(function(){
  $('a.link').click( function(e){
    var my_id = $(this).attr('id');
    var href = $(this).attr('href');
    $.ajax({    
      type: "GET",
      url: "/tiger/sal/clicks/click.php?id=" + my_id,
      success: function(d){
          // allow it to successfully call the server before redirecting.
          window.location = href;
      }
    });
    return false;
  });
});

Я бы не стал делать это в режиме «mousedown», поскольку это не гарантирует, что пользователь действительно щелкнул ссылку.

person Dennis Rongo    schedule 04.04.2012
comment
Большое спасибо, но почему-то это не выполняет сценарий для меня. Он перенаправляет пользователя, но не добавляет запись в таблицу, как это происходит при безуспешном использовании mousedown. - person Frank; 04.04.2012