-
-
Save itnovator/ce1c2ddc33bfa16d846a to your computer and use it in GitHub Desktop.
Revisions
-
Ron Korving revised this gist
Mar 19, 2014 . 1 changed file with 2 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -3,7 +3,8 @@ // This library re-implements setTimeout, setInterval, clearTimeout, clearInterval for iOS6. // iOS6 suffers from a bug that kills timers that are created while a page is scrolling. // This library fixes that problem by recreating timers after scrolling finishes (with interval correction). // This code is released in the public domain. Do with it what you want, without limitations. I do not promise // that it works, or that I will provide support (don't sue me). // Author: rkorving@wizcorp.jp var timeouts = {}; -
Ron Korving revised this gist
Sep 21, 2012 . 1 changed file with 61 additions and 34 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -6,7 +6,7 @@ // This code is free to use by anyone (MIT, blabla). // Author: rkorving@wizcorp.jp var timeouts = {}; var intervals = {}; var orgSetTimeout = window.setTimeout; var orgSetInterval = window.setInterval; @@ -15,62 +15,80 @@ function createTimer(set, map, args) { var id, cb = args[0], repeat = (set === orgSetInterval); function callback() { if (cb) { cb.apply(window, arguments); if (!repeat) { delete map[id]; cb = null; } } } args[0] = callback; id = set.apply(window, args); map[id] = { args: args, created: Date.now(), cb: cb, id: id }; return id; } function resetTimer(set, clear, map, virtualId, correctInterval) { var timer = map[virtualId]; if (!timer) { return; } var repeat = (set === orgSetInterval); // cleanup clear(timer.id); // reduce the interval (arg 1 in the args array) if (!repeat) { var interval = timer.args[1]; var reduction = Date.now() - timer.created; if (reduction < 0) { reduction = 0; } interval -= reduction; if (interval < 0) { interval = 0; } timer.args[1] = interval; } // recreate function callback() { if (timer.cb) { timer.cb.apply(window, arguments); if (!repeat) { delete map[virtualId]; timer.cb = null; } } } timer.args[0] = callback; timer.created = Date.now(); timer.id = set.apply(window, timer.args); } window.setTimeout = function () { return createTimer(orgSetTimeout, timeouts, arguments); }; @@ -79,27 +97,36 @@ }; window.clearTimeout = function (id) { var timer = timeouts[id]; if (timer) { delete timeouts[id]; orgClearTimeout(timer.id); } }; window.clearInterval = function (id) { var timer = intervals[id]; if (timer) { delete intervals[id]; orgClearInterval(timer.id); } }; window.addEventListener('scroll', function () { // recreate the timers using adjusted intervals // we cannot know how long the scroll-freeze lasted, so we cannot take that into account var virtualId; for (virtualId in timeouts) { resetTimer(orgSetTimeout, orgClearTimeout, timeouts, virtualId); } for (virtualId in intervals) { resetTimer(orgSetInterval, orgClearInterval, intervals, virtualId); } }); }(window)); -
Ron Korving created this gist
Sep 20, 2012 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,105 @@ (function (window) { // This library re-implements setTimeout, setInterval, clearTimeout, clearInterval for iOS6. // iOS6 suffers from a bug that kills timers that are created while a page is scrolling. // This library fixes that problem by recreating timers after scrolling finishes (with interval correction). // This code is free to use by anyone (MIT, blabla). // Author: rkorving@wizcorp.jp var timers = {}; var intervals = {}; var orgSetTimeout = window.setTimeout; var orgSetInterval = window.setInterval; var orgClearTimeout = window.clearTimeout; var orgClearInterval = window.clearInterval; function createTimer(set, map, args) { var id, cb = args[0]; function callback() { if (cb) { delete map[id]; cb.apply(window, arguments); cb = null; } } args[0] = callback; id = set.apply(window, args); map[id] = { args: args, created: Date.now(), cb: cb }; return id; } function resetTimers(set, clear, oldMap, newMap, correctInterval) { for (var id in oldMap) { var timer = oldMap[id]; // cleanup clear(id); // reduce the interval (arg 1 in the args array) var interval = timer.args[1]; if (correctInterval) { var reduction = Date.now() - timer.created; if (reduction < 0) { reduction = 0; } interval -= reduction; if (interval < 0) { interval = 0; } } timer.args[0] = timer.cb; timer.args[1] = interval; // recreate createTimer(set, newMap, timer.args); } } window.setTimeout = function () { return createTimer(orgSetTimeout, timers, arguments); }; window.setInterval = function () { return createTimer(orgSetInterval, intervals, arguments); }; window.clearTimeout = function (id) { delete timers[id]; orgClearTimeout(id); }; window.clearInterval = function (id) { delete intervals[id]; orgClearInterval(id); }; window.addEventListener('scroll', function () { // recreate the timers using adjusted intervals // we cannot know how long the scroll-freeze lasted, so we cannot take that into account var oldTimers = timers; var oldIntervals = intervals; timers = {}; intervals = {}; resetTimers(orgSetTimeout, orgClearTimeout, oldTimers, timers, true); resetTimers(orgSetInterval, orgClearInterval, oldIntervals, intervals, false); }); }(window));