Skip to content

Commit 1a516aa

Browse files
committed
Add polyfill for mouseenter and mouseleave.
Fixes d3#931.
1 parent 4648db5 commit 1a516aa

3 files changed

Lines changed: 85 additions & 41 deletions

File tree

d3.js

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,33 +1818,53 @@ d3 = function() {
18181818
return this.each(d3_selection_on(type, listener, capture));
18191819
};
18201820
function d3_selection_on(type, listener, capture) {
1821-
var name = "__on" + type, i = type.indexOf(".");
1821+
var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener;
18221822
if (i > 0) type = type.substring(0, i);
1823+
var filter = d3_selection_onFilters.get(type);
1824+
if (filter) type = filter, wrap = d3_selection_onFilter;
18231825
function onRemove() {
1824-
var wrapper = this[name];
1825-
if (wrapper) {
1826-
this.removeEventListener(type, wrapper, wrapper.$);
1826+
var l = this[name];
1827+
if (l) {
1828+
this.removeEventListener(type, l, l.$);
18271829
delete this[name];
18281830
}
18291831
}
18301832
function onAdd() {
1831-
var node = this, args = d3_array(arguments);
1833+
var l = wrap(listener, d3_array(arguments));
18321834
onRemove.call(this);
1833-
this.addEventListener(type, this[name] = wrapper, wrapper.$ = capture);
1834-
wrapper._ = listener;
1835-
function wrapper(e) {
1836-
var o = d3.event;
1837-
d3.event = e;
1838-
args[0] = node.__data__;
1839-
try {
1840-
listener.apply(node, args);
1841-
} finally {
1842-
d3.event = o;
1843-
}
1844-
}
1835+
this.addEventListener(type, this[name] = l, l.$ = capture);
1836+
l._ = listener;
18451837
}
18461838
return listener ? onAdd : onRemove;
18471839
}
1840+
var d3_selection_onFilters = d3.map({
1841+
mouseenter: "mouseover",
1842+
mouseleave: "mouseout"
1843+
});
1844+
d3_selection_onFilters.forEach(function(k) {
1845+
if ("on" + k in document) d3_selection_onFilters.remove(k);
1846+
});
1847+
function d3_selection_onListener(listener, argumentz) {
1848+
return function(e) {
1849+
var o = d3.event;
1850+
d3.event = e;
1851+
argumentz[0] = this.__data__;
1852+
try {
1853+
listener.apply(this, argumentz);
1854+
} finally {
1855+
d3.event = o;
1856+
}
1857+
};
1858+
}
1859+
function d3_selection_onFilter(listener, argumentz) {
1860+
var l = d3_selection_onListener(listener, argumentz);
1861+
return function(e) {
1862+
var target = this, related = e.relatedTarget;
1863+
if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {
1864+
l.call(target, e);
1865+
}
1866+
};
1867+
}
18481868
d3_selectionPrototype.each = function(callback) {
18491869
return d3_selection_each(this, function(node, i, j) {
18501870
callback.call(node, node.__data__, i, j);

0 commit comments

Comments
 (0)