Here is a slightly improved version of miken32's answer using Deferred:
function whenNoTrackingProtection() { if (!whenNoTrackingProtection.promise) { var dfd = new $.Deferred(); whenNoTrackingProtection.promise = dfd.promise(); var time = Date.now(); $('<img/>') .attr('src', '//apps.facebook.com/favicon.ico') .on('load', dfd.resolve) .on('error', function() { if ((Date.now() - time) < 50) { dfd.reject(); } else { // The request took to long, it seems this is a network error. dfd.resolve(); } }); } return whenNoTrackingProtection.promise; }
or without jQuery using Promise:
function whenNoTrackingProtection() { if (!whenNoTrackingProtection.promise) { whenNoTrackingProtection.promise = new Promise(function(resolve, reject) { var time = Date.now(); var img = new Image(); img.onload = resolve; img.onerror = function() { if ((Date.now() - time) < 50) { reject(); } else { // The request took to long, it seems this is a network error. resolve(); } }; img.src = '//apps.facebook.com/favicon.ico'; }); } return whenNoTrackingProtection.promise; }
Sleepwalker
source share