jQuery: Tıklayınız PHP ile izleme

2 Cevap php

Evet, Google Analytics hakkında BİLİYOR. Biz bizim genel site ölçümleri için kullanmak, ve ben bireysel bağlantıları takip edebilirsiniz biliyorum. Ancak, biz çok özel bağlantıları için bir izleme çözümü gerekli ve bizim web uygulaması için mevcut izleme verileri in real time, bu yüzden benim kendi çözüm yazdı gerekir:

jQuery:

  $.fn.track = function () {
    var source, url, name, ref, $this;
    $this = $(this);
    if (window.location.search.substring(1) != '') {
      source = window.location.pathname + "?" + window.location.search.substring(1);
    } else {
      source = window.location.pathname;
    }
    url = jQuery.URLEncode($this.attr('href'));
    name = $this.attr('name');
    ref = jQuery.URLEncode(source);
    $this.live('click', function (click) {
      click.preventDefault();
      $.post('/lib/track.php', {
        url: url,
        name: name,
        ref: ref
      }, function () { window.location = $this.attr('href'); });
    });
  };

... JQuery UrlEncode eklentisi kullanarak (http://www.digitalbart.com/jquery-and-urlencode/).

Şimdi, bu kod benim PHP arka uç ile ve benim makine üzerinde çalışıyor, ama başka herkes için güvenilir bir şekilde çalışmak için görünmüyor. Bazen jQuery ile geçirilen parametreler yok name, url veya ref ile bir veritabanına kayıt sonuçlanan geçti DEĞİLDİR.

Bu oluyor olabilir neden bana yaşam için, ben bilemiyorum; Kayıtları (PHP, ben de zaman damgası ile birlikte isteği IP kayıt) veritabanında vardır çünkü ben, $.post tetikliyor biliyorum, ancak birçok durumda PHP komut dosyası {boş alıyor jQuery [(1)]} değişkenleri.

Bunu ben yerimden erişimi var ve hepsi benim için iyi çalışmak her tarayıcıda yaşamak test ettik; Ancak, (benim bilgisayar) tarafından oluşturulan tüm kayıtların yaklaşık% 75 (çoğu ben aynı tarayıcıları kullanarak) boş olarak gelmez.

Neden bu oluyor olabilir?

2 Cevap

Ben sonunda, benim sorunum jQuery tarafından ayrıştırılması için istek için çok uzun alıyordu ve ben de (javascript "bağımlı" bağlantıları yapmak onlar dinlemediler o istememek konusunda oldukça kararlı olduğumu varlık sona erdi, düşünmek 't kullanıcı onlar yeni sayfa isabet önce izleme isteği) tamamlamak için beklemek zorunda olacağını onsuz çalışmak ya.

Bazı borçlanma ve başkaları tarafından ilham - online - birçok başka çözümler gezen sonra yerli javascript aşağıda çözümüne geldi:

if (document.getElementsByClassName === undefined) { // get elements by class name, adjusted for IE's incompetence
    document.getElementsByClassName = function(className) {
      var hasClassName, allElements, results, element;

        hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
        allElements = document.getElementsByTagName("*");
        results = [];

        for (var i = 0; (element = allElements[i]) !== null; i++) {
            var elementClass = element.className;
            if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass)) {
                results.push(element);
            }
        }

        return results;
    };
}

function addTracker(obj, type, fn) { // adds a tracker to the page, like $('xxx').event
  if (obj.addEventListener) {
    obj.addEventListener(type, fn, false);
  } else if (obj.addEventListener) {
    obj['e' + type + fn] = fn;
    obj[type + fn] = function() {
      obj['e' + type + fn]( window.event );
    };
    obj.attachEvent('on' + type, obj[type + fn]);
  }
}

function save_click(passed_object) { // this function records a click
  var now, then, path, encoded, to, from, name, img;

  now = new Date();
  path = '/lib/click.php';
  from = (window.decode) ? window.decodeURI(document.URL) : document.URL;
  to = (window.decodeURI) ? window.decodeURI(passed_object.href) : passed_object.href;
  name = (passed_object.name && passed_object.name != '') ? passed_object.name : '[No Name]';

  // timestamp the path!
  path += '?timestamp=' + now.getTime();

  path += '&to=' + escape(to) + '&from=' + escape(from) + '&name=' + name; // compile the path with the recorded information
  img = new Image();
  img.src = path; // when we call the image, we poll the php page; genius!

  while (now.getTime() < then) {
    now = new Date(); // resets the timer for subsequent clicks
  }
}

function get_targeted_links(target) { // finds targeted elements and wires them up with an event handler
  var links, link;
  if (document.getElementsByClassName) {
    links = document.getElementsByClassName(target);
    for (var i = 0; i < links.length; i++) {
      link = links[i];
      if (link.href) {
        addTracker(links[i], 'mousedown', save_click(links[i])); 
      }
    }
  }
}

addTracker(window, 'load', get_targeted_links('trackit'));

... Ki ben yukarıda yazdığım jQuery eklentisi daha akıcı gibi görünüyor, ve şimdiye kadar ben atılan onca istekleri izlemek için yeterince hızlı olmuştur.

O başkası yardımcı olur umarım!

Bu "tıklamalar" botlara geliyor olabilir, ya da JS ile birisi devre dışı. Tıkladığınız bağlantılar izlenen gerekiyorsa niye JS sadece bağlantılar, yani düşünmüyoruz. href dışında farklı bir attr URL'yi koymak, sonra track.php içinde sevk onay eklemek, bunu işlemek için tıklayın işleyicisi kullanmak

Tüm unsurları bağlantılar Ayrıca eğer kontrol ettiniz?