-
-
Save paulirish/5438650 to your computer and use it in GitHub Desktop.
// @license http://opensource.org/licenses/MIT | |
// copyright Paul Irish 2015 | |
// Date.now() is supported everywhere except IE8. For IE8 we use the Date.now polyfill | |
// github.com/Financial-Times/polyfill-service/blob/master/polyfills/Date.now/polyfill.js | |
// as Safari 6 doesn't have support for NavigationTiming, we use a Date.now() timestamp for relative values | |
// if you want values similar to what you'd get with real perf.now, place this towards the head of the page | |
// but in reality, you're just getting the delta between now() calls, so it's not terribly important where it's placed | |
(function(){ | |
if ("performance" in window == false) { | |
window.performance = {}; | |
} | |
Date.now = (Date.now || function () { // thanks IE8 | |
return new Date().getTime(); | |
}); | |
if ("now" in window.performance == false){ | |
var nowOffset = Date.now(); | |
if (performance.timing && performance.timing.navigationStart){ | |
nowOffset = performance.timing.navigationStart | |
} | |
window.performance.now = function now(){ | |
return Date.now() - nowOffset; | |
} | |
} | |
})(); |
Wonderful! Thanks. Used this to patch support for iOS 8. Would be nice if Polyfill.io offered performance.timing instead of just performance.now polyfill...
As @rubencodes implies above, polyfill.io now has a performance.now polyfill, and the benefit is that it will polyfill Date.now for you automatically if needed:
https://polyfill.io/v2/polyfill.min.js?features=performance.now
@JofArnold that's not very idiomatic coffee-script, and looks like it needs updating to match the modified gist.
do ->
window.performance = {} unless 'performance' of window
Date.now = if Date.now then Date.now else -> (new Date).getTime()
unless 'now' of window.performance
nowOffset = performance.timing?.navigationStart ? Date.now()
window.performance.now = ->
Date.now() - nowOffset
2016 what now?
^ @ghost just a heads up, the snippet above has a typo: 'perfomance' -> 'performance'
Thanks guys! I had issue with google's recaptcha code.
There was an error 'Cannot find variable performance', that was appearing in ios < 8 devices.
Fixed with @ghost 's code.
*thumbs up for @antoniocapelo 's sharp eye
2017. Passing the baton.
if ( !window.performance || !window.performance.now ) { Date.now || ( Date.now = function () { return new this().getTime(); }); ( window.performance || ( window.performance = {} ) ).now = function () { return Date.now() - offset; }; var offset = ( window.performance.timing || ( window.performance.timing = {} ) ).navigatorStart || ( window.performance.timing.navigationStart = Date.now() ); }
There's another typo: it's navigationStart, not navigatorStart
Hello,
I have mixed this polyfill with Aaron Levine's (https://gist.github.com/Aldlevine/3f716f447322edbb3671) and modifier some code:
'use strict';
// @license http://opensource.org/licenses/MIT
// copyright Paul Irish 2015
// Added code by Aaron Levine from: https://gist.github.com/Aldlevine/3f716f447322edbb3671
// Some modifications by Joan Alba Maldonado.
// as Safari 6 doesn't have support for NavigationTiming, we use a Date.now() timestamp for relative values
// if you want values similar to what you'd get with real perf.now, place this towards the head of the page
// but in reality, you're just getting the delta between now() calls, so it's not terribly important where it's placed
// Gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e
// TODO: Think about adding vendor prefixes.
if (!Date.now) { Date.now = function() { return new Date().getTime(); } }
(function()
{
if (window.performance && window.performance.now) { return; }
window.performance = window.performance || {};
if
(
window.performance.timing && window.performance.timing.navigationStart &&
window.performance.mark &&
window.performance.clearMarks &&
window.performance.getEntriesByName
)
{
window.performance.now = function()
{
window.performance.clearMarks('__PERFORMANCE_NOW__');
window.performance.mark('__PERFORMANCE_NOW__');
return window.performance.getEntriesByName('__PERFORMANCE_NOW__')[0].startTime;
};
}
else if ("now" in window.performance === false)
{
var nowOffset = Date.now();
if (window.performance.timing && window.performance.timing.navigationStart)
{
nowOffset = window.performance.timing.navigationStart
}
window.performance.now = function now()
{
return Date.now() - nowOffset;
}
}
})();
I have placed it in this gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e
Any comments will be welcome. Thank you very much.
Thank you!! Solved my problem with Opbeat AngularJS plugin. Also thanks to @lukehedger for creating the bower package!