You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.0 KiB
108 lines
3.0 KiB
1 year ago
|
var filterEvents = {};
|
||
|
|
||
|
export var event = null;
|
||
|
|
||
|
if (typeof document !== "undefined") {
|
||
|
var element = document.documentElement;
|
||
|
if (!("onmouseenter" in element)) {
|
||
|
filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function filterContextListener(listener, index, group) {
|
||
|
listener = contextListener(listener, index, group);
|
||
|
return function(event) {
|
||
|
var related = event.relatedTarget;
|
||
|
if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
|
||
|
listener.call(this, event);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function contextListener(listener, index, group) {
|
||
|
return function(event1) {
|
||
|
var event0 = event; // Events can be reentrant (e.g., focus).
|
||
|
event = event1;
|
||
|
try {
|
||
|
listener.call(this, this.__data__, index, group);
|
||
|
} finally {
|
||
|
event = event0;
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function parseTypenames(typenames) {
|
||
|
return typenames.trim().split(/^|\s+/).map(function(t) {
|
||
|
var name = "", i = t.indexOf(".");
|
||
|
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
|
||
|
return {type: t, name: name};
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function onRemove(typename) {
|
||
|
return function() {
|
||
|
var on = this.__on;
|
||
|
if (!on) return;
|
||
|
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
|
||
|
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
|
||
|
this.removeEventListener(o.type, o.listener, o.capture);
|
||
|
} else {
|
||
|
on[++i] = o;
|
||
|
}
|
||
|
}
|
||
|
if (++i) on.length = i;
|
||
|
else delete this.__on;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function onAdd(typename, value, capture) {
|
||
|
var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
|
||
|
return function(d, i, group) {
|
||
|
var on = this.__on, o, listener = wrap(value, i, group);
|
||
|
if (on) for (var j = 0, m = on.length; j < m; ++j) {
|
||
|
if ((o = on[j]).type === typename.type && o.name === typename.name) {
|
||
|
this.removeEventListener(o.type, o.listener, o.capture);
|
||
|
this.addEventListener(o.type, o.listener = listener, o.capture = capture);
|
||
|
o.value = value;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
this.addEventListener(typename.type, listener, capture);
|
||
|
o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
|
||
|
if (!on) this.__on = [o];
|
||
|
else on.push(o);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export default function(typename, value, capture) {
|
||
|
var typenames = parseTypenames(typename + ""), i, n = typenames.length, t;
|
||
|
|
||
|
if (arguments.length < 2) {
|
||
|
var on = this.node().__on;
|
||
|
if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
|
||
|
for (i = 0, o = on[j]; i < n; ++i) {
|
||
|
if ((t = typenames[i]).type === o.type && t.name === o.name) {
|
||
|
return o.value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
on = value ? onAdd : onRemove;
|
||
|
if (capture == null) capture = false;
|
||
|
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
export function customEvent(event1, listener, that, args) {
|
||
|
var event0 = event;
|
||
|
event1.sourceEvent = event;
|
||
|
event = event1;
|
||
|
try {
|
||
|
return listener.apply(that, args);
|
||
|
} finally {
|
||
|
event = event0;
|
||
|
}
|
||
|
}
|