سؤال

نعم، أعرف شيئًا عن Google Analytics.نحن نستخدمها لمقاييس موقعنا الشاملة، وأنا أعلم أنه يمكننا تتبع الروابط الفردية.ومع ذلك، كنا بحاجة إلى حل تتبع لروابط محددة للغاية ونحتاج إلى توفر بيانات التتبع لتطبيق الويب الخاص بنا في الوقت الحقيقي, ، لذلك كتبت الحل الخاص بي:

مسج:

  $.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 (http://www.digitalbart.com/jquery-and-urlencode/).

الآن، يعمل هذا الرمز بشكل جيد مع PHP الخلفية وعلى جهازي، ولكن لا يبدو أنه يعمل بشكل موثوق مع أي شخص آخر.في بعض الأحيان، لا يتم تمرير المعلمات التي تم تمريرها عبر jQuery، مما يؤدي إلى وجود سجل في قاعدة البيانات بلا name, url أو ref.

طوال حياتي، لا أستطيع معرفة سبب حدوث ذلك؛أنا أعرف ال $.post يتم تشغيله، نظرًا لوجود سجلات في قاعدة البيانات (في PHP، أقوم أيضًا بتسجيل عنوان IP للطلب مع الطابع الزمني)، ولكن في كثير من الحالات يتلقى البرنامج النصي PHP فارغًا $_POST المتغيرات من jQuery.

لقد قمت باختباره مباشرة على كل متصفح يمكنني الوصول إليه في مكان عملي، وكلها تعمل بشكل جيد بالنسبة لي؛ومع ذلك، فإن حوالي 75% من جميع السجلات التي تم إنشاؤها (وليس بواسطة أجهزة الكمبيوتر الخاصة بي) تأتي فارغة (معظمها يستخدم نفس المتصفحات التي أستخدمها).

لماذا يمكن أن يحدث هذا؟

هل كانت مفيدة؟

المحلول

أفكر في النهاية، في النهاية، انتهت مشكلتي بأنها كانت طويلة جدا للاطلاع على الطلب من قبل jQuery، وأنا مثيل رائع حول عدم الروابط "تعتمد" على جافا سكريبت (إما أنهم لن يفعلوا ذلك العمل بدونها أو أن المستخدم يجب أن ينتظر إكمال طلب التعقب قبل أن يضرب الصفحة الجديدة).

بعد تصفح العديد من الحلول الأخرى عبر الإنترنت - الاقتراض من البعض والاحتفاظ بها من قبل الآخرين - وصلت إلى الحل أدناه في جافا سكريبت الأصلية:

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'));

... والتي يبدو أنها أكثر من Snappier أكثر من البرنامج المساعد JQuery الذي كتبته أعلاه، وحتى الآن كان سريعا بما يكفي لتتبع جميع الطلبات التي ألقيتها عليه.

على أمل أن يساعد شخص آخر!

نصائح أخرى

قد تأتي هذه "النقرات" من برامج الروبوت، أو من شخص لديه JS معطل.إذا كان يجب تتبع الروابط التي تم النقر عليها، فلماذا لا تفكر في روابط JS فقط، على سبيل المثال.ضع عنوان URL في عنوان مختلف غير href، ثم استخدم معالج النقر الخاص بك لمعالجته، وأضف فحص الإحالة في المسار الخاص بك.

هل قمت أيضًا بالتحقق مما إذا كانت جميع العناصر عبارة عن روابط؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top