* Start to observe the target element's position change and trigger callback. * TODO: maybe take DOM mutation into consideration * @param {!Element} element * @param {function(!PositionEntryDef)} callback * @return {!UnlistenDef}
(element, callback)
| 45 | * @return {!UnlistenDef} |
| 46 | */ |
| 47 | observe(element, callback) { |
| 48 | if (!this.positionObservable_) { |
| 49 | this.positionObservable_ = new Observable(); |
| 50 | const listener = throttle( |
| 51 | this.win_, |
| 52 | () => { |
| 53 | this.update_(); |
| 54 | this.positionObservable_.fire(); |
| 55 | }, |
| 56 | MIN_EVENT_INTERVAL_IN_MS |
| 57 | ); |
| 58 | this.update_(); |
| 59 | this.win_.addEventListener('scroll', listener, true); |
| 60 | this.win_.addEventListener('resize', listener, true); |
| 61 | } |
| 62 | // Send the 1st ping immediately |
| 63 | callback(this.getPositionEntry_(element)); |
| 64 | return this.positionObservable_.add(() => { |
| 65 | callback(this.getPositionEntry_(element)); |
| 66 | }); |
| 67 | } |
| 68 | |
| 69 | /** |
| 70 | * Updates viewport rect. |
no test coverage detected