86 lines
2.6 KiB
Plaintext
86 lines
2.6 KiB
Plaintext
var MediaQuery = require('./MediaQuery');
|
|
var Util = require('./Util');
|
|
var each = Util.each;
|
|
var isFunction = Util.isFunction;
|
|
var isArray = Util.isArray;
|
|
|
|
/**
|
|
* Allows for registration of query handlers.
|
|
* Manages the query handler's state and is responsible for wiring up browser events
|
|
*
|
|
* @constructor
|
|
*/
|
|
function MediaQueryDispatch () {
|
|
if(!window.matchMedia) {
|
|
throw new Error('matchMedia not present, legacy browsers require a polyfill');
|
|
}
|
|
|
|
this.queries = {};
|
|
this.browserIsIncapable = !window.matchMedia('only all').matches;
|
|
}
|
|
|
|
MediaQueryDispatch.prototype = {
|
|
|
|
constructor : MediaQueryDispatch,
|
|
|
|
/**
|
|
* Registers a handler for the given media query
|
|
*
|
|
* @param {string} q the media query
|
|
* @param {object || Array || Function} options either a single query handler object, a function, or an array of query handlers
|
|
* @param {function} options.match fired when query matched
|
|
* @param {function} [options.unmatch] fired when a query is no longer matched
|
|
* @param {function} [options.setup] fired when handler first triggered
|
|
* @param {boolean} [options.deferSetup=false] whether setup should be run immediately or deferred until query is first matched
|
|
* @param {boolean} [shouldDegrade=false] whether this particular media query should always run on incapable browsers
|
|
*/
|
|
register : function(q, options, shouldDegrade) {
|
|
var queries = this.queries,
|
|
isUnconditional = shouldDegrade && this.browserIsIncapable;
|
|
|
|
if(!queries[q]) {
|
|
queries[q] = new MediaQuery(q, isUnconditional);
|
|
}
|
|
|
|
//normalise to object in an array
|
|
if(isFunction(options)) {
|
|
options = { match : options };
|
|
}
|
|
if(!isArray(options)) {
|
|
options = [options];
|
|
}
|
|
each(options, function(handler) {
|
|
if (isFunction(handler)) {
|
|
handler = { match : handler };
|
|
}
|
|
queries[q].addHandler(handler);
|
|
});
|
|
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* unregisters a query and all it's handlers, or a specific handler for a query
|
|
*
|
|
* @param {string} q the media query to target
|
|
* @param {object || function} [handler] specific handler to unregister
|
|
*/
|
|
unregister : function(q, handler) {
|
|
var query = this.queries[q];
|
|
|
|
if(query) {
|
|
if(handler) {
|
|
query.removeHandler(handler);
|
|
}
|
|
else {
|
|
query.clear();
|
|
delete this.queries[q];
|
|
}
|
|
}
|
|
|
|
return this;
|
|
}
|
|
};
|
|
|
|
module.exports = MediaQueryDispatch;
|