2010-04-26 2 views
2

Я пытаюсь понять, почему этот трекер не работает. Код был написан другим разработчиком, поэтому я не совсем уверен, что это когда-либо работало.Использование нового изображения(). Src для отслеживания кликов

function trackSponsor(o, p) { 
     (new Image()).src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date())); 
    return false; 
} 

Из того, что я могу собрать, что, когда эта функция называется это «создает новый образ» сгореть PHP скрипт асинхронно. Согласно Firebug, запрос сделан, однако он «прерывается» ~ 30 мс. Странно, что он «иногда» работает как в 1 раз в 10+ независимо от браузера.

Я бы скорее исправить это, чтобы он работал вместо того, чтобы переписывать его как запрос ajax.

Любая помощь приветствуется.

Заранее спасибо.

EDIT

Из-за пост tvanfosson, что заставило меня задуматься. Я включил строку, которая вызывает отслеживание кликов ниже.

<a onclick="trackSponsor(60, 15077); goToNextStep(1988, 15077, 0); return false;" href="#">view</a> 

goToNextStep() фактически изменяет страницу. У меня создается впечатление, что он будет выполнен только после завершения trackSponsor().

+0

Так что PHP скрипт не удается раз в 10+ запросов? –

+0

@ Настоящий - Что? Никто ничего не говорил о PHP. –

+2

@Coronatus: * Никто ничего не сказал о PHP *: OP утверждает: «Когда эта функция называется, она создает новое изображение для запуска php-скрипта». –

ответ

1

На самом деле довольно тривиально переписывать запрос на получение с помощью jQuery. Переписывание, безусловно, поможет следующему разработчику понять, что происходит, и может решить вашу проблему. Мне нужно узнать больше о содержимом переменных - возможно, они должны быть закодированы в urlEncoded? - Прежде чем я смогу помочь тебе в этом. Вы можете попробовать urlEncoding их и посмотреть, что произойдет.

function trackSponsor(o, p) { 
    var url = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date())); 
    $.get(url); 
    return false; 
} 

EDIT: вы можете проверить, что другой обработчик не перенаправлять браузер на новое место, когда событие запуска отслеживания вызывается. Это приведет к прерванию любых ожидающих запросов на странице - и может позволить некоторым добиться успеха на основе времени запросов и если результаты будут доставлены до того, как страница будет выгружена.

+0

переменные являются целыми числами. trackSponsor (1234, 9876); – user103219

+0

@raz - Возможно ли, что вы нажимаете на меняет место? Я вижу, что return false, но, возможно, есть другой обработчик, который фактически выполняет перенаправление, и что вы видите, запрос прерывается при замене местоположения? – tvanfosson

+0

Это заставило меня задуматься, я обновил сообщение, чтобы включить строку, которая фактически вызывает функцию. – user103219

0

Я ткнулся с Google Analytics ’ ga.js, который использует метод new Image(), аналогичный вашему сценарию.

Единственное отличие, которое я мог видеть, заключается в том, как создается объект. Сценарий Google присваивает объект переменной.

var d=new Image(1,1);d.src=f; 

Возможно, это выстрел?

function trackSponsor(o, p) {  
     var i = new Image(1,1); 
     i.src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date()));  
    return false;  
} 

Это не сделать разницу, но стоит выстрел.

1

"(новое изображение()). Src = url;" просто попросит браузер нажать на URL. Вы должны задерживаться на 50-100 мс, чтобы быть уверенным, что данные отслеживания были отправлены на сервер.

function delay(a) { 
    for (var b = +new Date, c = 1; 0 < c; c++) { 
    if (0 == c % 1E3) { 
     var e = +new Date; 
     if (b > e) break; 
     if (e - b > a) break; 
    } 
    } 
} 
function trackSponsor(o, p) { 
    (new Image()).src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date())); 
    delay(100); 
    return false; 
} 
+0

Есть ли способ проверить, когда изображение было загружено? –

+0

Полное свойство возвращает, закончил ли браузер загрузку изображения. Если изображение закончено, полное свойство возвращает true, иначе оно возвращает false. http://www.w3schools.com/jsref/prop_img_complete.asp – ilnar

+0

Итак, завершение функции 'trackSponsor' отменяет HTTP-запрос' Image' ??? –

0

Возможно, попробуйте это, чтобы избежать сбора мусора, чтобы ваш журнал не пропал.

var sendLog = (function() { 
 
    var _unique = (function() { /* 产生唯一标识*/ 
 
     var time = (new Date()).getTime() + '_', 
 
      i = 0; 
 

 
     return function() { 
 
      return time + (i++); 
 
     } 
 
    }()); 
 

 
    var run = function (url) { 
 
     var data = window['imgLogData'] || (window['imgLogData'] = {}), 
 
      img = new Image(), 
 
      uid = _unique(); 
 

 
     data[uid] = img; /* 防止img被垃圾处理*/ 
 

 
     img.onload = img.onerror = function() { /* 成功或失败后销毁对象*/ 
 
      img.onload = img.onerror = null; 
 
      img = null; 
 
      delete data[uid]; 
 
     }; 
 

 
     img.src = url + '&_cache=' + uid; /* 发送统计内容*/ 
 
    }; 
 

 
    return run; 
 
}()); 
 

 

 
sendLog('http://log_');

Смежные вопросы