Skip to content

Commit ac9c25d

Browse files
author
Zack Bloom
committed
Add events. Closes CodeByZach#44
1 parent aa316bf commit ac9c25d

File tree

5 files changed

+145
-3
lines changed

5 files changed

+145
-3
lines changed

docs/intro.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,23 @@ whenever `pushState` or `replaceState` is called by default.
166166

167167
- `Pace.ignore`: Expliticly ignore one or more requests, see Tracking below
168168

169+
Events
170+
------
171+
172+
Pace fires the following events:
173+
174+
- `start`: When pace is initially started, or as a part of a restart
175+
- `stop`: When pace is manually stopped, or as a part of a restart
176+
- `restart`: When pace is restarted (manually, or by a new AJAX request)
177+
- `done`: When pace is finished
178+
- `hide`: When the pace is hidden (can be later than `done`, based on `ghostTime` and `minTime`)
179+
180+
You can bind onto events using the `on`, `off` and `once` methods:
181+
182+
- `Pace.on(event, handler, [context])`: Call `handler` (optionally with context) when `event` is triggered
183+
- `Pace.off(event, [handler])`: Unbind the provided `event` and `handler` combination.
184+
- `Pace.once(event, handler, [context])`: Bind `handler` to the next (and only the next) incidence of `event`
185+
169186
Tracking
170187
--------
171188

pace.coffee

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,45 @@ getFromDOM = (key='options', json=true) ->
135135
catch e
136136
console?.error "Error parsing inline pace options", e
137137

138+
class Evented
139+
on: (event, handler, ctx, once=false) ->
140+
@bindings ?= {}
141+
@bindings[event] ?= []
142+
@bindings[event].push {handler, ctx, once}
143+
144+
once: (event, handler, ctx) ->
145+
@on(event, handler, ctx, true)
146+
147+
off: (event, handler) ->
148+
return unless @bindings?[event]?
149+
150+
if not handler?
151+
delete @bindings[event]
152+
else
153+
i = 0
154+
while i < @bindings[event].length
155+
if @bindings[event][i].handler is handler
156+
@bindings[event].splice i, 1
157+
else
158+
i++
159+
160+
trigger: (event, args...) ->
161+
if @bindings?[event]
162+
i = 0
163+
while i < @bindings[event].length
164+
{handler, ctx, once} = @bindings[event][i]
165+
166+
handler.apply(ctx ? @, args)
167+
168+
if once
169+
@bindings[event].splice i, 1
170+
else
171+
i++
172+
138173
window.Pace ?= {}
139174

175+
extend Pace, Evented::
176+
140177
options = Pace.options = extend defaultOptions, window.paceOptions, getFromDOM()
141178

142179
class NoTargetError extends Error
@@ -572,6 +609,7 @@ do init = ->
572609
uniScaler = new Scaler
573610

574611
Pace.stop = ->
612+
Pace.trigger 'stop'
575613
Pace.running = false
576614

577615
bar.destroy()
@@ -586,6 +624,7 @@ Pace.stop = ->
586624
init()
587625

588626
Pace.restart = ->
627+
Pace.trigger 'restart'
589628
Pace.stop()
590629
Pace.start()
591630

@@ -632,10 +671,14 @@ Pace.go = ->
632671
if bar.done() or done or cancelAnimation
633672
bar.update 100
634673

674+
Pace.trigger 'done'
675+
635676
setTimeout ->
636677
bar.finish()
637678

638679
Pace.running = false
680+
681+
Pace.trigger 'hide'
639682
, Math.max(options.ghostTime, Math.min(options.minTime, now() - start))
640683
else
641684
enqueueNextFrame()
@@ -653,6 +696,7 @@ Pace.start = (_options) ->
653696
if not document.querySelector('.pace')
654697
setTimeout Pace.start, 50
655698
else
699+
Pace.trigger 'start'
656700
Pace.go()
657701

658702
if typeof define is 'function' and define.amd

pace.js

Lines changed: 79 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)