Изображение отслеживания маяка с функцией 204 ответа и обратного вызова
В течение нескольких дней я пытался преобразовать свою функциональность JS отслеживающего пикселя, чтобы использовать ответ 204 "no_content".
Я легко могу заставить это работать, но мне нужно иметь возможность вызывать функцию обратного вызова впоследствии.
Следующее, кажется, никогда не будет уволено, когда 204 возвращается.
beacon: function (opts) {
var beacon = new Image();
opts = $.extend(true, {}, {
url: pum_vars.ajaxurl || null,
data: {
action: 'pum_analytics',
_cache: (+(new Date()))
},
error: function () {
console.log('error');
},
success: function () {
console.log('success');
}
}, opts);
// Create a beacon if a url is provided
if (opts.url) {
// Attach the event handlers to the image object
if (beacon.onerror) {
beacon.onerror = opts.error;
}
if (beacon.onload) {
beacon.onload = opts.success;
}
$(beacon).on('load', function( response, status, xhr ){
alert(status);
});
// Attach the src for the script call
beacon.src = opts.url + '?' + $.param(opts.data);
}
}
Отслеживание зарегистрировано должным образом, но нет предупреждений или сообщений журнала консоли. Это возможно или я просто трачу свое время?
Редактировать ------
На основе решения, приведенного ниже, приведена окончательная версия (предполагается, что и ошибка, и успех будут использовать один и тот же обратный вызов).
beacon: function (opts) {
var beacon = new Image();
opts = $.extend(true, {}, {
url: pum_vars.ajaxurl || null,
data: {
action: 'pum_analytics',
_cache: (+(new Date()))
},
callback: function () {
console.log('tracked');
}
}, opts);
// Create a beacon if a url is provided
if (opts.url) {
// Attach the event handlers to the image object
$(beacon).on('error success done', opts.callback);
// Attach the src for the script call
beacon.src = opts.url + '?' + $.param(opts.data);
}
}
1 ответ
Вы не прикрепляете никаких обратных вызовов к изображению. Ваш тест if (beacon.onerror)
приводит к ложному, потому что beacon.onerror
является null
,
Вы должны использовать if( "onerror" in beacon )
чтобы проверить, beacon
имеет onerror
имущество.
Но почему бы вам не использовать метод jquery on
?
$(beacon).on("error", function() {
alert("Jquery error");
});
$(beacon).on("done", function() {
alert("Jquery done");
});