can-event-dom-radiochange
Advanced tools
Comparing version
'use strict'; | ||
var domData = require('can-dom-data-state'); | ||
var getDocument = require('can-globals/document/document'); | ||
var domEvents = require('can-dom-events'); | ||
var CIDMap = require('can-cid/map/map'); | ||
function getRoot (el) { | ||
return el.ownerDocument || getDocument().documentElement; | ||
function getRoot () { | ||
return getDocument().documentElement; | ||
} | ||
function getRegistryName (eventName) { | ||
return 'can-event-radiochange:' + eventName + ':registry'; | ||
} | ||
function getListenerName (eventName) { | ||
return 'can-event-radiochange:' + eventName + ':listener'; | ||
} | ||
function getRegistry (root, eventName) { | ||
var name = getRegistryName(eventName); | ||
var registry = domData.get.call(root, name); | ||
if (!registry) { | ||
registry = new CIDMap(); | ||
domData.set.call(root, name, registry); | ||
} | ||
return registry; | ||
} | ||
function findParentForm (el) { | ||
@@ -54,57 +33,30 @@ while (el) { | ||
function dispatch (eventName, target) { | ||
var root = getRoot(target); | ||
var registry = getRegistry(root, eventName); | ||
registry.forEach(function (el) { | ||
if (shouldReceiveEventFromRadio(target, el)) { | ||
domEvents.dispatch(el, eventName); | ||
} | ||
}); | ||
} | ||
function attachRootListener (root, eventName, events) { | ||
var listenerName = getListenerName(eventName); | ||
var listener = domData.get.call(root, listenerName); | ||
if (listener) { | ||
return; | ||
} | ||
function attachRootListener (domEvents, eventTypeTargets) { | ||
var root = getRoot(); | ||
var newListener = function (event) { | ||
var target = event.target; | ||
if (isRadioInput(target)) { | ||
dispatch(eventName, target); | ||
if (!isRadioInput(target)) { | ||
return; | ||
} | ||
for (var eventType in eventTypeTargets) { | ||
var newEvent = {type: eventType}; | ||
var listeningNodes = eventTypeTargets[eventType]; | ||
listeningNodes.forEach(function (el) { | ||
if (shouldReceiveEventFromRadio(target, el)) { | ||
domEvents.dispatch(el, newEvent, false); | ||
} | ||
}); | ||
} | ||
}; | ||
events.addEventListener(root, 'change', newListener); | ||
domData.set.call(root, listenerName, newListener); | ||
domEvents.addEventListener(root, 'change', newListener); | ||
return newListener; | ||
} | ||
function detachRootListener (root, eventName, events) { | ||
var listenerName = getListenerName(eventName); | ||
var listener = domData.get.call(root, listenerName); | ||
if (!listener) { | ||
return; | ||
} | ||
var registry = getRegistry(root, eventName); | ||
if (registry.size > 0) { | ||
return; | ||
} | ||
events.removeEventListener(root, 'change', listener); | ||
domData.clean.call(root, listenerName); | ||
function detachRootListener (domEvents, listener) { | ||
var root = getRoot(); | ||
domEvents.removeEventListener(root, 'change', listener); | ||
} | ||
function addListener (eventName, el, events) { | ||
if (!isRadioInput(el)) { | ||
throw new Error('Listeners for ' + eventName + ' must be radio inputs'); | ||
} | ||
var root = getRoot(el); | ||
getRegistry(root, eventName).set(el, el); | ||
attachRootListener(root, eventName, events); | ||
} | ||
function removeListener (eventName, el, events) { | ||
var root = getRoot(el); | ||
getRegistry(root, eventName).delete(el); | ||
detachRootListener(root, eventName, events); | ||
} | ||
/** | ||
@@ -138,14 +90,55 @@ * @module {events} can-event-dom-radiochange | ||
*/ | ||
module.exports = { | ||
var radioChangeEvent = { | ||
defaultEventType: 'radiochange', | ||
addEventListener: function (target, eventName, handler) { | ||
addListener(eventName, target, this); | ||
target.addEventListener(eventName, handler); | ||
addEventListener: function (target, eventType, handler) { | ||
if (!isRadioInput(target)) { | ||
throw new Error('Listeners for ' + eventType + ' must be radio inputs'); | ||
} | ||
var eventTypeTrackedRadios = radioChangeEvent._eventTypeTrackedRadios; | ||
if (!eventTypeTrackedRadios) { | ||
eventTypeTrackedRadios = radioChangeEvent._eventTypeTrackedRadios = {}; | ||
if (!radioChangeEvent._rootListener) { | ||
radioChangeEvent._rootListener = attachRootListener(this, eventTypeTrackedRadios); | ||
} | ||
} | ||
var trackedRadios = radioChangeEvent._eventTypeTrackedRadios[eventType]; | ||
if (!trackedRadios) { | ||
trackedRadios = radioChangeEvent._eventTypeTrackedRadios[eventType] = new Set(); | ||
} | ||
trackedRadios.add(target); | ||
target.addEventListener(eventType, handler); | ||
}, | ||
removeEventListener: function (target, eventName, handler) { | ||
removeListener(eventName, target, this); | ||
target.removeEventListener(eventName, handler); | ||
removeEventListener: function (target, eventType, handler) { | ||
target.removeEventListener(eventType, handler); | ||
var eventTypeTrackedRadios = radioChangeEvent._eventTypeTrackedRadios; | ||
if (!eventTypeTrackedRadios) { | ||
return; | ||
} | ||
var trackedRadios = eventTypeTrackedRadios[eventType]; | ||
if (!trackedRadios) { | ||
return; | ||
} | ||
trackedRadios.delete(target); | ||
if (trackedRadios.size === 0) { | ||
delete eventTypeTrackedRadios[eventType]; | ||
for (var key in eventTypeTrackedRadios) { | ||
if (eventTypeTrackedRadios.hasOwnProperty(key)) { | ||
return; | ||
} | ||
} | ||
delete radioChangeEvent._eventTypeTrackedRadios; | ||
detachRootListener(this, radioChangeEvent._rootListener); | ||
delete radioChangeEvent._rootListener; | ||
} | ||
} | ||
}; | ||
module.exports = radioChangeEvent; |
{ | ||
"name": "can-event-dom-radiochange", | ||
"description": "Custom radiochange event", | ||
"version": "1.0.5", | ||
"version": "2.0.0", | ||
"author": { | ||
@@ -14,5 +14,3 @@ "name": "Chris Andrejewski", | ||
"dependencies": { | ||
"can-cid": "^1.1.0", | ||
"can-dom-data-state": "^0.2.0", | ||
"can-dom-events": "^1.0.2", | ||
"can-dom-events": "<2.0.0", | ||
"can-globals": "<2.0.0" | ||
@@ -19,0 +17,0 @@ }, |
2
-50%17344
-1.16%217
-4.41%- Removed
- Removed
- Removed
- Removed
Updated